diff --git a/sources/Core/Memory/MemoryAPI.uc b/sources/Core/Memory/MemoryAPI.uc
new file mode 100644
index 0000000..810e72a
--- /dev/null
+++ b/sources/Core/Memory/MemoryAPI.uc
@@ -0,0 +1,290 @@
+/**
+ * API that provides functions for managing objects and actors by providing
+ * easy and general means to create and destroy them, that allow to make use of
+ * temporary `Object`s in a more efficient way.
+ * This is a low-level API that most users of Acedia, most likely,
+ * would not have to use, since creation of most objects would use their own
+ * wrapper functions around this API.
+ * Copyright 2020 Anton Tarasenko
+ *------------------------------------------------------------------------------
+ * This file is part of Acedia.
+ *
+ * Acedia 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, version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Acedia 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 Acedia. If not, see .
+ */
+class MemoryAPI extends Singleton;
+
+// This variable counts ticks and should be different each new tick.
+var private int currentTick;
+
+// Stores instance of an `Object` that can be borrowed from the pool.
+struct BorrowableRecord
+{
+ // Borrowable instance
+ var Object instance;
+ // Was this object borrowed?
+ // This flag will persist unless object was explicitly freed,
+ // even if borrowed reference timed out.
+ var bool borrowed;
+ // When was this object borrowed?
+ // Used to automatically free borrowed objects after the tick has passed.
+ var int borrowTick;
+};
+
+// Available object pools
+var private array borrowPool;
+
+// Checks if instance in the given `record` is borrowed.
+private final function bool IsBorrowed(BorrowableRecord record)
+{
+ // `record.borrowed` means instance was borrowed,
+ // but not explicitly freed;
+ // `record.borrowTick >= currentTick` means that rights to the borrowed
+ // instance hasn't yet ran out.
+ return (record.borrowed && record.borrowTick >= currentTick);
+}
+
+// Loads a reference to class instance from it's string representation.
+private final function class