commit b1f38b270d44f674678de6e1b074aa36ec9d4ca2
Author: Thomas Schöpping <tschoepp@cit-ec.uni-bielefeld.de>
Date:   Mon Apr 9 11:07:27 2018 +0200

    project initialization

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c3268c8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,22 @@
+build
+.dep
+*.tmp
+*.backup
+
+# Eclipse files
+*eclipse*
+
+# QtCreator files
+*.includes
+*.files
+*.config
+*.creator
+*.creator.user
+
+# Shadow files
+*kate-swp
+*~
+
+# Backup files
+*backup*
+*Backup*
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..bbc4a6a
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "os/AMiRo-OS"]
+	path = os/AMiRo-OS
+	url = http://openresearch.cit-ec.de/git/amiro-os.amiro-os.git
+[submodule "middleware/uRtWare"]
+	path = middleware/uRtWare
+	url = http://openresearch.cit-ec.de/git/amiro-os.urtware.git
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..8fab906
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,88 @@
+AMiRo-Apps is a collection of applications and configurations for the Autonomous
+Mini Robot (AMiRo) [1]. It is tightly coupled to the AMiRo-OS and uRtWare
+projects, which provide a sophisticated operating system (based on ChibiOS) amd
+a real-time middleware for embedded devices.
+
+Copyright (C) 2018..2018  Thomas Schöpping et al.
+(a complete list of all authors is given below)
+
+This program 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.
+
+This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+This research/work was supported by the Cluster of Excellence
+Cognitive Interaction Technology 'CITEC' (EXC 277) at Bielefeld
+University, which is funded by the German Research Foundation (DFG).
+
+Authors:
+ - Thomas Schöpping          <tschoepp[at]cit-ec.uni-bielefeld.de>
+ - Marc Rothmann
+
+References:
+ [1] S. Herbrechtsmeier, T. Korthals, T. Schopping and U. Rückert, "AMiRo: A
+     modular & customizable open-source mini robot platform," 2016 20th
+     International Conference on System Theory, Control and Computing (ICSTCC),
+     Sinaia, 2016, pp. 687-692.
+
+
+
+################################################################################
+#                                                                              #
+#        RRRRRRRR   EEEEEEEE     AAA     DDDDDDDD   MM     MM  EEEEEEEE        #
+#        RR     RR  EE          AA AA    DD     DD  MMM   MMM  EE              #
+#        RR     RR  EE         AA   AA   DD     DD  MMMM MMMM  EE              #
+#        RRRRRRRR   EEEEEE    AA     AA  DD     DD  MM MMM MM  EEEEEE          #
+#        RR   RR    EE        AAAAAAAAA  DD     DD  MM     MM  EE              #
+#        RR    RR   EE        AA     AA  DD     DD  MM     MM  EE              #
+#        RR     RR  EEEEEEEE  AA     AA  DDDDDDDD   MM     MM  EEEEEEEE        #
+#                                                                              #
+################################################################################
+
+This file will help you to setup all required software on your system, compile
+the source code, and flash it to the AMiRo modules.
+
+================================================================================
+
+CONTENTS:
+
+  1  Required software
+  3  Building and flashing
+
+================================================================================
+
+
+
+1 - REQUIRED SOFTWARE
+---------------------
+
+Since AMiRo-Apps depends on the AMiRo-OS and uRtWare projects, both are included
+as Git submodules. Use the provided ./setup.sh script to initialize those. When
+AMiRo-OS is fully configured, there is no additional software required by
+AMiRo-Apps. For further details about the initialization follow the instructions
+in the script and refer to the README.txt file of AMiRo-OS and uRtWare
+respectively.
+
+
+
+2 - BUILDING AND FLASHING
+-------------------------
+
+For building and flashing a specific setup, you must first define a
+configuration in the ./configurations folder (e.g. ./configurations/MyConf).
+Such a configuration must consist of a Makefile and a C header file with the
+name "osconf.h". Please copy the provided template files from the
+./configurations/template directory and modify them as required in order to
+minimize the risk of errors and for the sake of consistency. As a result you can
+build and flash all software using the Makefile.
+
+================================================================================
+
diff --git a/license.html b/license.html
new file mode 100644
index 0000000..33edf21
--- /dev/null
+++ b/license.html
@@ -0,0 +1,695 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- saved from url=(0051)http://www.gnu.org/licenses/gpl-3.0-standalone.html -->
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ 
+ <title>GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)</title>
+ <link rel="alternate" type="application/rdf+xml" href="http://www.gnu.org/licenses/gpl-3.0.rdf"> 
+</head>
+<body>
+
+<h3 style="text-align: center;">GNU GENERAL PUBLIC LICENSE</h3>
+<p style="text-align: center;">Version 3, 29 June 2007</p>
+
+<p>Copyright © 2007 Free Software Foundation, Inc.
+ &lt;<a href="http://fsf.org/">http://fsf.org/</a>&gt;</p><p>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<h3><a name="preamble"></a>Preamble</h3>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.</p>
+
+<p>When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<h3><a name="terms"></a>TERMS AND CONDITIONS</h3>
+
+<h4><a name="section0"></a>0. Definitions.</h4>
+
+<p>“This License” refers to version 3 of the GNU General Public License.</p>
+
+<p>“Copyright” also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+ 
+<p>“The Program” refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as “you”.  “Licensees” and
+“recipients” may be individuals or organizations.</p>
+
+<p>To “modify” a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a “modified version” of the
+earlier work or a work “based on” the earlier work.</p>
+
+<p>A “covered work” means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To “propagate” a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To “convey” a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays “Appropriate Legal Notices”
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<h4><a name="section1"></a>1. Source Code.</h4>
+
+<p>The “source code” for a work means the preferred form of the work
+for making modifications to it.  “Object code” means any non-source
+form of a work.</p>
+
+<p>A “Standard Interface” means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The “System Libraries” of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+“Major Component”, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The “Corresponding Source” for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<h4><a name="section2"></a>2. Basic Permissions.</h4>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<h4><a name="section3"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h4>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<h4><a name="section4"></a>4. Conveying Verbatim Copies.</h4>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<h4><a name="section5"></a>5. Conveying Modified Source Versions.</h4>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    “keep intact all notices”.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+“aggregate” if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<h4><a name="section6"></a>6. Conveying Non-Source Forms.</h4>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A “User Product” is either (1) a “consumer product”, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, “normally used” refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>“Installation Information” for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<h4><a name="section7"></a>7. Additional Terms.</h4>
+
+<p>“Additional permissions” are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered “further
+restrictions” within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<h4><a name="section8"></a>8. Termination.</h4>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<h4><a name="section9"></a>9. Acceptance Not Required for Having Copies.</h4>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<h4><a name="section10"></a>10. Automatic Licensing of Downstream Recipients.</h4>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<h4><a name="section11"></a>11. Patents.</h4>
+
+<p>A “contributor” is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's “contributor version”.</p>
+
+<p>A contributor's “essential patent claims” are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a “patent license” is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To “grant” such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+  
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is “discriminatory” if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<h4><a name="section12"></a>12. No Surrender of Others' Freedom.</h4>
+
+<p>If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<h4><a name="section13"></a>13. Use with the GNU Affero General Public License.</h4>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<h4><a name="section14"></a>14. Revised Versions of this License.</h4>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License “or any later version” applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<h4><a name="section15"></a>15. Disclaimer of Warranty.</h4>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<h4><a name="section16"></a>16. Limitation of Liability.</h4>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<h4><a name="section17"></a>17. Interpretation of Sections 15 and 16.</h4>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<h3><a name="howto"></a>How to Apply These Terms to Your New Programs</h3>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.</p>
+
+<p>To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the “copyright” line and a pointer to where the full notice is found.</p>
+
+<pre>    &lt;one line to give the program's name and a brief idea of what it does.&gt;
+    Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+
+    This program 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.
+
+    This program 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 this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    &lt;program&gt;  Copyright (C) &lt;year&gt;  &lt;name of author&gt;
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an “about box”.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a “copyright disclaimer” for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+&lt;<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>&gt;.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+&lt;<a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>&gt;.</p>
+
+
+</body></html>
diff --git a/middleware/middleware.mk b/middleware/middleware.mk
new file mode 100644
index 0000000..00ad635
--- /dev/null
+++ b/middleware/middleware.mk
@@ -0,0 +1,41 @@
+################################################################################
+# AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2018..2018  Thomas Schöpping et al.                            #
+#                                                                              #
+# This program 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.                                          #
+#                                                                              #
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.        #
+#                                                                              #
+# This research/work was supported by the Cluster of Excellence Cognitive      #
+# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
+# funded by the German Research Foundation (DFG).                              #
+################################################################################
+
+
+
+# absolute path to this directory
+MIDDLEWARE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+
+include $(MIDDLEWARE_DIR)uRtWare/Makefile
+
+# include paths
+MIDDLEWAREINC = $(URTWARE_INC)
+
+# C source files
+MIDDLEWARECSRC = $(URTWARE_CSRC)
+
+# C++ source files
+MIDDLEWARECPPSRC = $(URTWARE_CPPSRC)
+
+
+
diff --git a/middleware/middlewaresetup.sh b/middleware/middlewaresetup.sh
new file mode 100755
index 0000000..61e7325
--- /dev/null
+++ b/middleware/middlewaresetup.sh
@@ -0,0 +1,565 @@
+################################################################################
+# AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2018..2018  Thomas Schöpping et al.                            #
+#                                                                              #
+# This program 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.                                          #
+#                                                                              #
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.        #
+#                                                                              #
+# This research/work was supported by the Cluster of Excellence Cognitive      #
+# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
+# funded by the German Research Foundation (DFG).                              #
+################################################################################
+
+#!/bin/bash
+
+################################################################################
+# GENERIC FUNCTIONS                                                            #
+################################################################################
+
+### print an error message #####################################################
+# Prints a error <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printError <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printError {
+  local string="ERROR:   $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 1)>>> $string$(tput sgr 0)" 1>&2
+}
+
+### print a warning message ####################################################
+# Prints a warning <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printMessage <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printWarning {
+  local string="WARNING: $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 3)>>> $string$(tput sgr 0)"
+}
+
+### print an information message ###############################################
+# Prints an information <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printInfo <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printInfo {
+  local string="INFO:    $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 2)>>> $string$(tput sgr 0)"
+}
+
+### print a message to file ####################################################
+# Appends a <message> to a log file, specified by the variable 'LOG_FILE'.
+#
+# usage       printLog <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printLog {
+  local string="LOG:     $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+}
+
+### exit the script normally ###################################################
+# Prints a delimiter and exits the script normally (returns 0).
+#
+# usage:      quitScript
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#
+function quitScript {
+  printInfo "exiting $(realpath ${BASH_SOURCE[0]})\n"
+  printf "\n"
+  printf "######################################################################\n"
+  exit 0
+}
+
+### read a user input ##########################################################
+# Reads a single character user input from a set up <options> and stores it in
+# a given <return> variable.
+#
+# usage:      readUserInput <options> <return>
+# arguments:  <options>
+#                 String definiing the set of valid characters.
+#                 If the string is empty, the user can input any character.
+#             <return>
+#                 Variable to store the selected character to.
+# return:     n/a
+#
+function readUserInput {
+  local input=""
+  # read user input
+  while [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); do
+    read -p "your selection: " -n 1 -e input
+    if [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); then
+      printWarning "[$input] is no valid action\n"
+    fi
+  done
+  printLog "[$input] has been selected\n"
+  eval $2="$input"
+}
+
+### check whether argument is an option ########################################
+# Checks a <string> whether it is an option.
+# Options are defined to either start with '--' followed by any string, or
+# to start with a single '-' followed by a single character, or
+# to start with a single '-' followed by a single character, a '=' and any string.
+# Examples: '--option', '--option=arg', '-o', '-o=arg', '--'
+#
+# usage:      parseIsOption <string>
+# arguments:  <string>
+#                 A string to check whether it is an option.
+# return:     0
+#                 <string> is an option.
+#             -1
+#                 <string> is not an option.
+#
+function parseIsOption {
+  if [[ "$1" =~ ^-(.$|.=.*) ]] || [[ "$1" =~ ^--.* ]]; then
+    return 0
+  else
+    return -1
+  fi
+}
+
+### set the log file ###########################################################
+# Sets a specified <infile> as log file and checks whether it already exists.
+# If so, the log may either be appended to the file, its content can be cleared,
+# or no log is generated at all.
+# The resulting path is stored in <outvar>.
+#
+# usage:      setLogFile [--option=<option>] [--quiet] <infile> <outvar>
+# arguments:  --option=<option>
+#                 Select what to do if <file> already exists.
+#                 Possible values are 'a', 'c', 'r' and 'n'.
+#                 - a: append (starts with a separator)
+#                 - c: continue (does not insert a seperator)
+#                 - r: delete and restart
+#                 - n: no log
+#                 If no option is secified but <file> exists, an interactive selection is provided.
+#             --quiet
+#                 Suppress all messages.
+#             <infile>
+#                 Path of the wanted log file.
+#             <outvar>
+#                 Variable to store the path of the log file to.
+# return:     0
+#                 No error or warning occurred.
+#             -1
+#                 Error: invalid input
+#
+function setLogFile {
+  local filepath=""
+  local option=""
+  local quiet=false
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -o=*|--option=*)
+          option=${1#*=}; shift 1;;
+        -o*|--option*)
+          option="$2"; shift 2;;
+        -q|--quiet)
+          quiet=true; shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+  filepath=$(realpath ${otherargs[0]})
+
+  # if file already exists
+  if [ -e $filepath ]; then
+    # if no option was specified, ask what to do
+    if [ -z "$option" ]; then
+      printWarning "log file $filepath already esists\n"
+      local userinput=""
+      printf "Select what to do:\n"
+      printf "  [A] - append log\n"
+      printf "  [R] - restart log (delete existing file)\n"
+      printf "  [N] - no log\n"
+      readUserInput "AaRrNn" userinput
+      option=${userinput,,}
+    fi
+    # evaluate option
+    case "$option" in
+      a|c)
+        if [ $quiet = false ]; then
+          printInfo "appending log to $filepath\n"
+        fi
+        if [ $option != c ]; then
+          printf "\n" >> $filepath
+          printf "######################################################################\n" >> $filepath
+          printf "\n" >> $filepath
+        fi
+        ;;
+      r)
+        echo -n "" > $filepath
+        if [ $quiet = false ]; then
+          printInfo "content of $filepath wiped\n"
+        fi
+        ;;
+      n)
+        if [ $quiet = false ]; then
+          printInfo "no log file will be generated\n"
+        fi
+        filepath=""
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected argument: $option\n"; return -1;;
+    esac
+  else
+    if [ $quiet = false ]; then
+      printInfo "log file set to $filepath\n"
+    fi
+  fi
+
+  eval ${otherargs[1]}="$filepath"
+
+  return 0
+}
+
+################################################################################
+# SPECIFIC FUNCTIONS                                                           #
+################################################################################
+
+### print welcome text #########################################################
+# Prints a welcome message to standard out.
+#
+# usage:      printWelcomeText
+# arguments:  n/a
+# return:     n/a
+#
+function printWelcomeText {
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "#              Welcome to the uRtWare submodule setup!               #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "# Copyright (c) 2018..2018  Thomas Schöpping                         #\n"
+  printf "#                                                                    #\n"
+  printf "# This is free software; see the source for copying conditions.      #\n"
+  printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
+  printf "# A PARTICULAR PURPOSE. The development of this software was         #\n"
+  printf "# supported by the Excellence Cluster EXC 227 Cognitive Interaction  #\n"
+  printf "# Technology. The Excellence Cluster EXC 227 is a grant of the       #\n"
+  printf "# Deutsche Forschungsgemeinschaft (DFG) in the context of the German #\n"
+  printf "# Excellence Initiative.                                             #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+}
+
+### print help #################################################################
+# Prints a help text to standard out.
+#
+# usage:      printHelp
+# arguments:  n/a
+# return:     n/a
+#
+function printHelp {
+  printInfo "printing help text\n"
+  printf "usage:    $(basename ${BASH_SOURCE[0]}) [-h|--help] [-i|--init] [-s|--setup] [-w|--wipe] [-q|--quit] [--log=<file>]\n"
+  printf "options:  -h, --help\n"
+  printf "              Print this help text.\n"
+  printf "          -i, --init\n"
+  printf "              Initialize the uRtWare submodule.\n"
+  printf "          -w, --wipe\n"
+  printf "              Wipe the entire uRtWare submodule.\n"
+  printf "          -q, --quit\n"
+  printf "              Quit the script.\n"
+  printf "          --log=<file> \n"
+  printf "              Specify a log file.\n"
+}
+
+### initialize uRtWare submodule ###############################################
+# Initialize the uRtWare submodule.
+#
+# usage:      initUrtware
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#             1
+#                 Warning: Arborted by user.
+#             -1
+#                 Error: Unexpected user input.
+#
+function initUrtware {
+  printInfo "initializing uRtWare submodule...\n"
+  local userdir=$(pwd)
+  local middlewaredir=$(dirname $(realpath ${BASH_SOURCE[0]}))
+  local urtwaredir=${middlewaredir}/uRtWare
+
+  # if the uRtWare folder is not empty
+  if [ ! -z "$(ls -A $urtwaredir)" ]; then
+    printWarning "$(realpath $urtwaredir) is not empty. Delete and reinitialize? [y/n]\n"
+    local userinput=""
+    readUserInput "YyNn" userinput
+    case $userinput in
+      Y|y)
+        wipeUrtware
+        ;;
+      N|n)
+        printWarning "uRtWare initialization aborted by user\n"
+        return 1
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected input: $userinput\n"; return -1;;
+    esac
+  fi
+
+  # initialize submodule to default branch
+  cd $middlewaredir
+  git submodule update --init $urtwaredir 2>&1 | tee -a $LOG_FILE
+  while [ ${PIPESTATUS[0]} -ne 0 ]; do
+    printWarning "initialitaion failed. Retry? [y/n]\n"
+    local userinput=""
+    readUserInput "YyNn" userinput
+    case "$userinput" in
+      Y|y)
+        git submodule update --init $urtwaredir 2>&1 | tee -a $LOG_FILE;;
+      N|n)
+        printWarning "uRtWare initialization aborted by user\n"
+        cd $userdir
+        return 1
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected input: $userinput\n"; return -1;;
+    esac
+  done
+  cd $userdir
+
+  return 0
+}
+
+### reset uRtWare submodule and wipe directory ####################################
+# Resets the uRtWare Git submodule and wipes the directory.
+#
+# usage:      wipeUrtware
+# arguments:  n/a
+# return:     n/a
+function wipeUrtware {
+  local userdir=$(pwd)
+  local middlewaredir=$(dirname $(realpath ${BASH_SOURCE[0]}))
+  local urtwaredir=${middlewaredir}/uRtWare
+  printInfo "reset and wipe Git submodule $urtwaredir\n"
+
+  # if the uRtWare folder is empty
+  if [ -z "$(ls -A $urtwaredir)" ]; then
+    printWarning "$urtwaredir is already empty\n"
+    return 1
+  else
+    # get some information from Git
+    cd $middlewaredir
+    local git_basehash=($(git ls-tree -d HEAD $urtwaredir)); git_basehash=${git_basehash[2]}
+    cd $urtwaredir
+    local git_branch_current=$(git rev-parse --abbrev-ref HEAD)
+    local git_difftobase="$(git diff ${git_basehash}..HEAD)"
+    local git_commits=$(git log --format=oneline ${git_basehash}..HEAD)
+    local git_dirtyfiles=($(git ls-files -dmo --exclude-standard --exclude=/doc))
+    cd $userdir
+    local issues=0
+    # if HEAD is ahead of submodule base commit
+    if [ -n "$git_difftobase" ]; then
+      issues=$((issues + 1))
+      printWarning "HEAD is ahead of submodule base\n"
+    fi
+    # if there are untracked, modified, or deleted files
+    if [ ${#git_dirtyfiles[@]} != 0 ]; then
+      issues=$((issues + 1))
+      printWarning "there are ${#git_dirtyfiles[@]} untracked, modified, or deleted files\n"
+    fi
+    if [ $issues -gt 0 ]; then
+      local userinput=""
+      printWarning "$issues issues detected. Do you want to continue? [y/n]\n"
+      readUserInput "YyNn" userinput
+      case "$userinput" in
+        Y|y)
+          ;;
+        N|n)
+          printfWarning "wiping uRtWare Git submodule aborted by user\n"
+          return 2
+          ;;
+        *) # sanity check (return error)
+          printError "unexpected input: $userinput\n"; return -1;;
+      esac
+    fi
+
+    # checkout base commit and delete all local branches
+    cd $middlewaredir
+    git submodule update --force --checkout $urtwaredir | tee -a $LOG_FILE
+    cd $urtwaredir
+    local git_branches=($(git for-each-ref --format="%(refname)"))
+    for branch in $git_branches; do
+      if [[ $branch = *"heads/"* ]]; then
+        git branch -D ${branch##*/} | tee -a $LOG_FILE
+      fi
+    done
+    cd $userdir
+
+    # deinitialize uRtWare submodule and delete any remaining files
+    cd $middlewaredir
+    git submodule deinit -f $urtwaredir 2>&1 | tee -a $LOG_FILE
+    rm -rf $urtwaredir/*
+    cd $userdir
+
+    return 0
+  fi
+}
+
+### main function of this script ###############################################
+# Initializes or wipes the uRtWare Git submodule, and provides an entry point to
+# its setup.
+#
+# usage:      see function printHelp
+# arguments:  see function printHelp
+# return:     0
+#                 No error or warning occurred.
+#
+function main {
+  # print welcome/info text if not suppressed
+  if [[ $@ != *"--noinfo"* ]]; then
+    printWelcomeText
+  else
+    printf "######################################################################\n"
+  fi
+  printf "\n"
+
+  # if --help or -h was specified, print the help text and exit
+  if [[ $@ == *"--help"* || $@ == *"-h"* ]]; then
+    printHelp
+    printf "\n"
+    quitScript
+  fi
+
+  # set log file if specified
+  if [[ $@ == *"--log"* ]] || [[ $@ == *"--LOG"* ]]; then
+    # get the parameter (file name)
+    local cmdidx=1
+    while [[ ! "${!cmdidx}" = "--log"* ]] && [[ ! "${!cmdidx}" = "--LOG"* ]]; do
+      cmdidx=$[cmdidx + 1]
+    done
+    local cmd="${!cmdidx}"
+    local logfile=""
+    if [[ "$cmd" = "--log="* ]] || [[ "$cmd" = "--LOG="* ]]; then
+      logfile=${cmd#*=}
+    else
+      local filenameidx=$((cmdidx + 1))
+      logfile="${!filenameidx}"
+    fi
+    # optionally force silent appending
+    if [[ "$cmd" = "--LOG"* ]]; then
+      setLogFile --option=c --quiet "$logfile" LOG_FILE
+    else
+      setLogFile "$logfile" LOG_FILE
+      printf "\n"
+    fi
+  fi
+  # log script name
+  printLog "this is $(realpath ${BASH_SOURCE[0]})\n"
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -h|--help) # already handled; ignore
+          shift 1;;
+        -i|--init)
+           initUrtware; printf "\n"; shift 1;;
+        -w|--wipe)
+           wipeUrtware; printf "\n"; shift 1;;
+        -q|--quit)
+          quitScript; shift 1;;
+        --log=*|--LOG=*) # already handled; ignore
+          shift 1;;
+        --log|--LOG) # already handled; ignore
+          shift 2;;
+        --noinfo) # already handled; ignore
+          shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+
+  # interactive menu
+  while ( true ); do
+    # main menu info prompt and selection
+    printInfo "Operating system setup main menu\n"
+    printf "Please select one of the following actions:\n"
+    printf "  [I] - initialize uRtWare submodule\n"
+    printf "  [W] - wipe uRtWare submodule\n"
+    printf "  [Q] - quit this setup\n"
+    local userinput=""
+    readUserInput "IiWwQq" userinput
+    printf "\n"
+
+    # evaluate user selection
+    case "$userinput" in
+      I|i)
+        initUrtware; printf "\n";;
+      W|w)
+        wipeUrtware; printf "\n";;
+      Q|q)
+        quitScript;;
+      *) # sanity check (exit with error)
+        printError "unexpected argument: $userinput\n";;
+    esac
+  done
+
+  exit 0
+}
+
+################################################################################
+# SCRIPT ENTRY POINT                                                           #
+################################################################################
+
+main "$@"
diff --git a/middleware/uRtWare b/middleware/uRtWare
new file mode 160000
index 0000000..5cf3653
--- /dev/null
+++ b/middleware/uRtWare
@@ -0,0 +1 @@
+Subproject commit 5cf365321c98e5f66cb49f4e38bd5de1d6d3ba3b
diff --git a/os/AMiRo-OS b/os/AMiRo-OS
new file mode 160000
index 0000000..e34c46f
--- /dev/null
+++ b/os/AMiRo-OS
@@ -0,0 +1 @@
+Subproject commit e34c46f0d4b743db0d93f806a1c8395a16a71414
diff --git a/os/os.mk b/os/os.mk
new file mode 100644
index 0000000..01282a5
--- /dev/null
+++ b/os/os.mk
@@ -0,0 +1,66 @@
+################################################################################
+# AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2016..2018  Thomas Schöpping et al.                            #
+#                                                                              #
+# This program 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.                                          #
+#                                                                              #
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.        #
+#                                                                              #
+# This research/work was supported by the Cluster of Excellence Cognitive      #
+# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
+# funded by the German Research Foundation (DFG).                              #
+################################################################################
+
+
+
+# absolute path to this directory
+OS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+
+# define to signal that this is an application build
+# (no standalone os-only build)
+UDEFS += -DAMIRO_APPS=true
+
+# setup all variables for the LightRing
+include $(LIGHTRING_APPS)
+INCDIR += $(CONFIG_DIR)
+APPSINC_LIGHTRING := $(INCDIR)
+APPSCSRC_LIGHTRING := $(CSRC)
+APPSCPPSRC_LIGHTRING := $(CPPSRC)
+INCDIR :=
+CSRC :=
+CPPSRC :=
+
+# setup all variables for the PowerManagement
+include $(POWERMANAGEMENT_APPS)
+INCDIR += $(CONFIG_DIR)
+APPSINC_POWERMANAGEMENT := $(INCDIR)
+APPSCSRC_POWERMANAGEMENT := $(CSRC)
+APPSCPPSRC_POWERMANAGEMENT := $(CPPSRC)
+INCDIR :=
+CSRC :=
+CPPSRC :=
+
+# setup all variables for the DiWheelDrive
+include $(DIWHEELDRIVE_APPS)
+INCDIR += $(CONFIG_DIR)
+APPSINC_DIWHEELDRIVE := $(INCDIR)
+APPSCSRC_DIWHEELDRIVE := $(CSRC)
+APPSCPPSRC_DIWHEELDRIVE := $(CPPSRC)
+INCDIR :=
+CSRC :=
+CPPSRC :=
+
+# make all variables that have been set so far available to all other makefiles
+export
+
+include $(OS_DIR)AMiRo-OS/Makefile
diff --git a/os/ossetup.sh b/os/ossetup.sh
new file mode 100755
index 0000000..94cc0f5
--- /dev/null
+++ b/os/ossetup.sh
@@ -0,0 +1,601 @@
+################################################################################
+# AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2016..2018  Thomas Schöpping et al.                            #
+#                                                                              #
+# This program 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.                                          #
+#                                                                              #
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.        #
+#                                                                              #
+# This research/work was supported by the Cluster of Excellence Cognitive      #
+# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
+# funded by the German Research Foundation (DFG).                              #
+################################################################################
+
+#!/bin/bash
+
+################################################################################
+# GENERIC FUNCTIONS                                                            #
+################################################################################
+
+### print an error message #####################################################
+# Prints a error <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printError <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printError {
+  local string="ERROR:   $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 1)>>> $string$(tput sgr 0)" 1>&2
+}
+
+### print a warning message ####################################################
+# Prints a warning <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printMessage <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printWarning {
+  local string="WARNING: $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 3)>>> $string$(tput sgr 0)"
+}
+
+### print an information message ###############################################
+# Prints an information <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printInfo <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printInfo {
+  local string="INFO:    $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 2)>>> $string$(tput sgr 0)"
+}
+
+### print a message to file ####################################################
+# Appends a <message> to a log file, specified by the variable 'LOG_FILE'.
+#
+# usage       printLog <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printLog {
+  local string="LOG:     $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+}
+
+### exit the script normally ###################################################
+# Prints a delimiter and exits the script normally (returns 0).
+#
+# usage:      quitScript
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#
+function quitScript {
+  printInfo "exiting $(realpath ${BASH_SOURCE[0]})\n"
+  printf "\n"
+  printf "######################################################################\n"
+  exit 0
+}
+
+### read a user input ##########################################################
+# Reads a single character user input from a set up <options> and stores it in
+# a given <return> variable.
+#
+# usage:      readUserInput <options> <return>
+# arguments:  <options>
+#                 String definiing the set of valid characters.
+#                 If the string is empty, the user can input any character.
+#             <return>
+#                 Variable to store the selected character to.
+# return:     n/a
+#
+function readUserInput {
+  local input=""
+  # read user input
+  while [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); do
+    read -p "your selection: " -n 1 -e input
+    if [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); then
+      printWarning "[$input] is no valid action\n"
+    fi
+  done
+  printLog "[$input] has been selected\n"
+  eval $2="$input"
+}
+
+### check whether argument is an option ########################################
+# Checks a <string> whether it is an option.
+# Options are defined to either start with '--' followed by any string, or
+# to start with a single '-' followed by a single character, or
+# to start with a single '-' followed by a single character, a '=' and any string.
+# Examples: '--option', '--option=arg', '-o', '-o=arg', '--'
+#
+# usage:      parseIsOption <string>
+# arguments:  <string>
+#                 A string to check whether it is an option.
+# return:     0
+#                 <string> is an option.
+#             -1
+#                 <string> is not an option.
+#
+function parseIsOption {
+  if [[ "$1" =~ ^-(.$|.=.*) ]] || [[ "$1" =~ ^--.* ]]; then
+    return 0
+  else
+    return -1
+  fi
+}
+
+### set the log file ###########################################################
+# Sets a specified <infile> as log file and checks whether it already exists.
+# If so, the log may either be appended to the file, its content can be cleared,
+# or no log is generated at all.
+# The resulting path is stored in <outvar>.
+#
+# usage:      setLogFile [--option=<option>] [--quiet] <infile> <outvar>
+# arguments:  --option=<option>
+#                 Select what to do if <file> already exists.
+#                 Possible values are 'a', 'c', 'r' and 'n'.
+#                 - a: append (starts with a separator)
+#                 - c: continue (does not insert a seperator)
+#                 - r: delete and restart
+#                 - n: no log
+#                 If no option is secified but <file> exists, an interactive selection is provided.
+#             --quiet
+#                 Suppress all messages.
+#             <infile>
+#                 Path of the wanted log file.
+#             <outvar>
+#                 Variable to store the path of the log file to.
+# return:     0
+#                 No error or warning occurred.
+#             -1
+#                 Error: invalid input
+#
+function setLogFile {
+  local filepath=""
+  local option=""
+  local quiet=false
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -o=*|--option=*)
+          option=${1#*=}; shift 1;;
+        -o*|--option*)
+          option="$2"; shift 2;;
+        -q|--quiet)
+          quiet=true; shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+  filepath=$(realpath ${otherargs[0]})
+
+  # if file already exists
+  if [ -e $filepath ]; then
+    # if no option was specified, ask what to do
+    if [ -z "$option" ]; then
+      printWarning "log file $filepath already esists\n"
+      local userinput=""
+      printf "Select what to do:\n"
+      printf "  [A] - append log\n"
+      printf "  [R] - restart log (delete existing file)\n"
+      printf "  [N] - no log\n"
+      readUserInput "AaRrNn" userinput
+      option=${userinput,,}
+    fi
+    # evaluate option
+    case "$option" in
+      a|c)
+        if [ $quiet = false ]; then
+          printInfo "appending log to $filepath\n"
+        fi
+        if [ $option != c ]; then
+          printf "\n" >> $filepath
+          printf "######################################################################\n" >> $filepath
+          printf "\n" >> $filepath
+        fi
+        ;;
+      r)
+        echo -n "" > $filepath
+        if [ $quiet = false ]; then
+          printInfo "content of $filepath wiped\n"
+        fi
+        ;;
+      n)
+        if [ $quiet = false ]; then
+          printInfo "no log file will be generated\n"
+        fi
+        filepath=""
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected argument: $option\n"; return -1;;
+    esac
+  else
+    if [ $quiet = false ]; then
+      printInfo "log file set to $filepath\n"
+    fi
+  fi
+
+  eval ${otherargs[1]}="$filepath"
+
+  return 0
+}
+
+################################################################################
+# SPECIFIC FUNCTIONS                                                           #
+################################################################################
+
+### print welcome text #########################################################
+# Prints a welcome message to standard out.
+#
+# usage:      printWelcomeText
+# arguments:  n/a
+# return:     n/a
+#
+function printWelcomeText {
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "#              Welcome to the AMiRo-OS submodule setup!              #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "# Copyright (c) 2016..2018  Thomas Schöpping                         #\n"
+  printf "#                                                                    #\n"
+  printf "# This is free software; see the source for copying conditions.      #\n"
+  printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
+  printf "# A PARTICULAR PURPOSE. The development of this software was         #\n"
+  printf "# supported by the Excellence Cluster EXC 227 Cognitive Interaction  #\n"
+  printf "# Technology. The Excellence Cluster EXC 227 is a grant of the       #\n"
+  printf "# Deutsche Forschungsgemeinschaft (DFG) in the context of the German #\n"
+  printf "# Excellence Initiative.                                             #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+}
+
+### print help #################################################################
+# Prints a help text to standard out.
+#
+# usage:      printHelp
+# arguments:  n/a
+# return:     n/a
+#
+function printHelp {
+  printInfo "printing help text\n"
+  printf "usage:    $(basename ${BASH_SOURCE[0]}) [-h|--help] [-i|--init] [-s|--setup] [-w|--wipe] [-q|--quit] [--log=<file>]\n"
+  printf "options:  -h, --help\n"
+  printf "              Print this help text.\n"
+  printf "          -i, --init\n"
+  printf "              Initialize the AMiRo-OS submodule.\n"
+  printf "          -s, --setup\n"
+  printf "              Enter AMiRo-OS setup.\n"
+  printf "          -w, --wipe\n"
+  printf "              Wipe the entire AMiRo-OS submodule.\n"
+  printf "          -q, --quit\n"
+  printf "              Quit the script.\n"
+  printf "          --log=<file> \n"
+  printf "              Specify a log file.\n"
+}
+
+### initialize AMiRo-OS submodule ##############################################
+# Initialize the AMiRo-OS submodule.
+#
+# usage:      initAmiroOs
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#             1
+#                 Warning: Arborted by user.
+#             -1
+#                 Error: Unexpected user input.
+#
+function initAmiroOs {
+  printInfo "initializing AMiRo-OS submodule...\n"
+  local userdir=$(pwd)
+  local osdir=$(dirname $(realpath ${BASH_SOURCE[0]}))
+  local amiroosdir=${osdir}/AMiRo-OS
+
+  # if the AMiRo-OS folder is not empty
+  if [ ! -z "$(ls -A $amiroosdir)" ]; then
+    printWarning "$(realpath $amiroosdir) is not empty. Delete and reinitialize? [y/n]\n"
+    local userinput=""
+    readUserInput "YyNn" userinput
+    case $userinput in
+      Y|y)
+        wipeAmiroOs
+        ;;
+      N|n)
+        printWarning "AMiRo-OS initialization aborted by user\n"
+        return 1
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected input: $userinput\n"; return -1;;
+    esac
+  fi
+
+  # initialize submodule to default branch
+  cd $osdir
+  git submodule update --init $amiroosdir 2>&1 | tee -a $LOG_FILE
+  while [ ${PIPESTATUS[0]} -ne 0 ]; do
+    printWarning "initialitaion failed. Retry? [y/n]\n"
+    local userinput=""
+    readUserInput "YyNn" userinput
+    case "$userinput" in
+      Y|y)
+        git submodule update --init $amiroosdir 2>&1 | tee -a $LOG_FILE;;
+      N|n)
+        printWarning "AMiRo-OS initialization aborted by user\n"
+        cd $userdir
+        return 1
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected input: $userinput\n"; return -1;;
+    esac
+  done
+  cd $userdir
+
+  return 0
+}
+
+### enter AMiRo-OS setup #######################################################
+# Enter AMiRo-OS submodule setup.
+#
+# usage:      amiroOsSetup
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#             -1
+#                 Error: AMiRo-OS submodule not initialized yet.
+#
+function amiroOsSetup {
+  local amiroosdir=$(dirname $(realpath ${BASH_SOURCE[0]}))/AMiRo-OS
+
+  # check if AMiRo-OS submodule is initialized
+  if [ -z "$(ls -A $amiroosdir)" ]; then
+    printError "$amiroosdir is empty. Please initialize first.\n"
+    return -1
+  else
+    printInfo "entering AMiRo-OS setup\n"
+    printf "\n"
+    if [ -z "$LOG_FILE" ]; then
+      ${amiroosdir}/setup.sh --noinfo
+    else
+      ${amiroosdir}/setup.sh --LOG="$LOG_FILE" --noinfo
+    fi
+    return 0
+  fi
+}
+
+### reset AMiRo-OS submodule and wipe directory ################################
+# Resets the AMiRo-OS Git submodule and wipes the directory.
+#
+# usage:      wipeAmiroOs
+# arguments:  n/a
+# return:     n/a
+function wipeAmiroOs {
+  printInfo "reset and wipe Git submodule $amiroosdir\n"
+  local userdir=$(pwd)
+  local osdir=$(dirname $(realpath ${BASH_SOURCE[0]}))
+  local amiroosdir=${osdir}/AMiRo-OS
+
+  # if the AMiRo-OS folder is empty
+  if [ -z "$(ls -A $amiroosdir)" ]; then
+    printWarning "$amiroosdir is already empty\n"
+    return 1
+  else
+    # get some information from Git
+    cd $osdir
+    local git_basehash=($(git ls-tree -d HEAD $amiroosdir)); git_basehash=${git_basehash[2]}
+    cd $amiroosdir
+    local git_branch_current=$(git rev-parse --abbrev-ref HEAD)
+    local git_difftobase="$(git diff ${git_basehash}..HEAD)"
+    local git_commits=$(git log --format=oneline ${git_basehash}..HEAD)
+    local git_dirtyfiles=($(git ls-files -dmo --exclude-standard --exclude=/doc))
+    cd $userdir
+    local issues=0
+    # if HEAD is ahead of submodule base commit
+    if [ -n "$git_difftobase" ]; then
+      issues=$((issues + 1))
+      printWarning "HEAD is ahead of submodule base\n"
+    fi
+    # if there are untracked, modified, or deleted files
+    if [ ${#git_dirtyfiles[@]} != 0 ]; then
+      issues=$((issues + 1))
+      printWarning "there are ${#git_dirtyfiles[@]} untracked, modified, or deleted files\n"
+    fi
+    if [ $issues -gt 0 ]; then
+      local userinput=""
+      printWarning "$issues issues detected. Do you want to continue? [y/n]\n"
+      readUserInput "YyNn" userinput
+      case "$userinput" in
+        Y|y)
+          ;;
+        N|n)
+          printfWarning "wiping AMiRo-OS Git submodule aborted by user\n"
+          return 2
+          ;;
+        *) # sanity check (return error)
+          printError "unexpected input: $userinput\n"; return -1;;
+      esac
+    fi
+
+    # checkout base commit and delete all local branches
+    cd $osdir
+    git submodule update --force --checkout $amiroosdir | tee -a $LOG_FILE
+    cd $amiroosdir
+    local git_branches=($(git for-each-ref --format="%(refname)"))
+    for branch in $git_branches; do
+      if [[ $branch = *"heads/"* ]]; then
+        git branch -D ${branch##*/} | tee -a $LOG_FILE
+      fi
+    done
+    cd $userdir
+
+    # deinitialize AMiRo-OS submodule and delete any remaining files
+    cd $osdir
+    git submodule deinit -f $amiroosdir 2>&1 | tee -a $LOG_FILE
+    rm -rf $amiroosdir/*
+    cd $userdir
+
+    return 0
+  fi
+}
+
+### main function of this script ###############################################
+# Initializes or wipes the AMiRo-OS Git submodule, and provides an entry point
+# to its setup.
+#
+# usage:      see function printHelp
+# arguments:  see function printHelp
+# return:     0
+#                 No error or warning occurred.
+#
+function main {
+  # print welcome/info text if not suppressed
+  if [[ $@ != *"--noinfo"* ]]; then
+    printWelcomeText
+  else
+    printf "######################################################################\n"
+  fi
+  printf "\n"
+
+  # if --help or -h was specified, print the help text and exit
+  if [[ $@ == *"--help"* || $@ == *"-h"* ]]; then
+    printHelp
+    printf "\n"
+    quitScript
+  fi
+
+  # set log file if specified
+  if [[ $@ == *"--log"* ]] || [[ $@ == *"--LOG"* ]]; then
+    # get the parameter (file name)
+    local cmdidx=1
+    while [[ ! "${!cmdidx}" = "--log"* ]] && [[ ! "${!cmdidx}" = "--LOG"* ]]; do
+      cmdidx=$[cmdidx + 1]
+    done
+    local cmd="${!cmdidx}"
+    local logfile=""
+    if [[ "$cmd" = "--log="* ]] || [[ "$cmd" = "--LOG="* ]]; then
+      logfile=${cmd#*=}
+    else
+      local filenameidx=$((cmdidx + 1))
+      logfile="${!filenameidx}"
+    fi
+    # optionally force silent appending
+    if [[ "$cmd" = "--LOG"* ]]; then
+      setLogFile --option=c --quiet "$logfile" LOG_FILE
+    else
+      setLogFile "$logfile" LOG_FILE
+      printf "\n"
+    fi
+  fi
+  # log script name
+  printLog "this is $(realpath ${BASH_SOURCE[0]})\n"
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -h|--help) # already handled; ignore
+          shift 1;;
+        -i|--init)
+           initAmiroOs; printf "\n"; shift 1;;
+        -s|--setup)
+           amiroOsSetup; printf "\n"; shift 1;;
+        -w|--wipe)
+           wipeAmiroOs; printf "\n"; shift 1;;
+        -q|--quit)
+          quitScript; shift 1;;
+        --log=*|--LOG=*) # already handled; ignore
+          shift 1;;
+        --log|--LOG) # already handled; ignore
+          shift 2;;
+        --noinfo) # already handled; ignore
+          shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+
+  # interactive menu
+  while ( true ); do
+    # main menu info prompt and selection
+    printInfo "Operating system setup main menu\n"
+    printf "Please select one of the following actions:\n"
+    printf "  [I] - initialize AMiRo-OS submodule\n"
+    printf "  [S] - enter AMiRo-OS setup\n"
+    printf "  [W] - wipe AMiRo-OS submodule\n"
+    printf "  [Q] - quit this setup\n"
+    local userinput=""
+    readUserInput "IiSsWwQq" userinput
+    printf "\n"
+
+    # evaluate user selection
+    case "$userinput" in
+      I|i)
+        initAmiroOs; printf "\n";;
+      S|s)
+        amiroOsSetup; printf "\n";;
+      W|w)
+        wipeAmiroOs; printf "\n";;
+      Q|q)
+        quitScript;;
+      *) # sanity check (exit with error)
+        printError "unexpected argument: $userinput\n";;
+    esac
+  done
+
+  exit 0
+}
+
+################################################################################
+# SCRIPT ENTRY POINT                                                           #
+################################################################################
+
+main "$@"
diff --git a/setup.sh b/setup.sh
new file mode 100755
index 0000000..cec5003
--- /dev/null
+++ b/setup.sh
@@ -0,0 +1,567 @@
+################################################################################
+# AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2018..2018  Thomas Schöpping et al.                            #
+#                                                                              #
+# This program 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.                                          #
+#                                                                              #
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.        #
+#                                                                              #
+# This research/work was supported by the Cluster of Excellence Cognitive      #
+# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
+# funded by the German Research Foundation (DFG).                              #
+################################################################################
+
+#!/bin/bash
+
+################################################################################
+# GENERIC FUNCTIONS                                                            #
+################################################################################
+
+### print an error message #####################################################
+# Prints a error <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printError <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printError {
+  local string="ERROR:   $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 1)>>> $string$(tput sgr 0)" 1>&2
+}
+
+### print a warning message ####################################################
+# Prints a warning <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printMessage <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printWarning {
+  local string="WARNING: $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 3)>>> $string$(tput sgr 0)"
+}
+
+### print an information message ###############################################
+# Prints an information <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printInfo <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printInfo {
+  local string="INFO:    $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 2)>>> $string$(tput sgr 0)"
+}
+
+### print a message to file ####################################################
+# Appends a <message> to a log file, specified by the variable 'LOG_FILE'.
+#
+# usage       printLog <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printLog {
+  local string="LOG:     $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+}
+
+### exit the script normally ###################################################
+# Prints a delimiter and exits the script normally (returns 0).
+#
+# usage:      quitScript
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#
+function quitScript {
+  printInfo "exiting $(realpath ${BASH_SOURCE[0]})\n"
+  printf "\n"
+  printf "######################################################################\n"
+  exit 0
+}
+
+### read a user input ##########################################################
+# Reads a single character user input from a set up <options> and stores it in
+# a given <return> variable.
+#
+# usage:      readUserInput <options> <return>
+# arguments:  <options>
+#                 String definiing the set of valid characters.
+#                 If the string is empty, the user can input any character.
+#             <return>
+#                 Variable to store the selected character to.
+# return:     n/a
+#
+function readUserInput {
+  local input=""
+  # read user input
+  while [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); do
+    read -p "your selection: " -n 1 -e input
+    if [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); then
+      printWarning "[$input] is no valid action\n"
+    fi
+  done
+  printLog "[$input] has been selected\n"
+  eval $2="$input"
+}
+
+### check whether argument is an option ########################################
+# Checks a <string> whether it is an option.
+# Options are defined to either start with '--' followed by any string, or
+# to start with a single '-' followed by a single character, or
+# to start with a single '-' followed by a single character, a '=' and any string.
+# Examples: '--option', '--option=arg', '-o', '-o=arg', '--'
+#
+# usage:      parseIsOption <string>
+# arguments:  <string>
+#                 A string to check whether it is an option.
+# return:     0
+#                 <string> is an option.
+#             -1
+#                 <string> is not an option.
+#
+function parseIsOption {
+  if [[ "$1" =~ ^-(.$|.=.*) ]] || [[ "$1" =~ ^--.* ]]; then
+    return 0
+  else
+    return -1
+  fi
+}
+
+### set the log file ###########################################################
+# Sets a specified <infile> as log file and checks whether it already exists.
+# If so, the log may either be appended to the file, its content can be cleared,
+# or no log is generated at all.
+# The resulting path is stored in <outvar>.
+#
+# usage:      setLogFile [--option=<option>] [--quiet] <infile> <outvar>
+# arguments:  --option=<option>
+#                 Select what to do if <file> already exists.
+#                 Possible values are 'a', 'c', 'r' and 'n'.
+#                 - a: append (starts with a separator)
+#                 - c: continue (does not insert a seperator)
+#                 - r: delete and restart
+#                 - n: no log
+#                 If no option is secified but <file> exists, an interactive selection is provided.
+#             --quiet
+#                 Suppress all messages.
+#             <infile>
+#                 Path of the wanted log file.
+#             <outvar>
+#                 Variable to store the path of the log file to.
+# return:     0
+#                 No error or warning occurred.
+#             -1
+#                 Error: invalid input
+#
+function setLogFile {
+  local filepath=""
+  local option=""
+  local quiet=false
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -o=*|--option=*)
+          option=${1#*=}; shift 1;;
+        -o*|--option*)
+          option="$2"; shift 2;;
+        -q|--quiet)
+          quiet=true; shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+  filepath=$(realpath ${otherargs[0]})
+
+  # if file already exists
+  if [ -e $filepath ]; then
+    # if no option was specified, ask what to do
+    if [ -z "$option" ]; then
+      printWarning "log file $filepath already esists\n"
+      local userinput=""
+      printf "Select what to do:\n"
+      printf "  [A] - append log\n"
+      printf "  [R] - restart log (delete existing file)\n"
+      printf "  [N] - no log\n"
+      readUserInput "AaRrNn" userinput
+      option=${userinput,,}
+    fi
+    # evaluate option
+    case "$option" in
+      a|c)
+        if [ $quiet = false ]; then
+          printInfo "appending log to $filepath\n"
+        fi
+        if [ $option != c ]; then
+          printf "\n" >> $filepath
+          printf "######################################################################\n" >> $filepath
+          printf "\n" >> $filepath
+        fi
+        ;;
+      r)
+        echo -n "" > $filepath
+        if [ $quiet = false ]; then
+          printInfo "content of $filepath wiped\n"
+        fi
+        ;;
+      n)
+        if [ $quiet = false ]; then
+          printInfo "no log file will be generated\n"
+        fi
+        filepath=""
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected argument: $option\n"; return -1;;
+    esac
+  else
+    if [ $quiet = false ]; then
+      printInfo "log file set to $filepath\n"
+    fi
+  fi
+
+  eval ${otherargs[1]}="$filepath"
+
+  return 0
+}
+
+################################################################################
+# SPECIFIC FUNCTIONS                                                           #
+################################################################################
+
+### print welcome text #########################################################
+# Prints a welcome message to standard out.
+#
+# usage:      printWelcomeText
+# arguments:  n/a
+# return:     n/a
+#
+function printWelcomeText {
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "#                  Welcome to the AMiRo-Apps setup!                  #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "# Copyright (c) 2018..2018  Thomas Schöpping                         #\n"
+  printf "#                                                                    #\n"
+  printf "# This is free software; see the source for copying conditions.      #\n"
+  printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
+  printf "# A PARTICULAR PURPOSE. The development of this software was         #\n"
+  printf "# supported by the Excellence Cluster EXC 227 Cognitive Interaction  #\n"
+  printf "# Technology. The Excellence Cluster EXC 227 is a grant of the       #\n"
+  printf "# Deutsche Forschungsgemeinschaft (DFG) in the context of the German #\n"
+  printf "# Excellence Initiative.                                             #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+}
+
+### print help #################################################################
+# Prints a help text to standard out.
+#
+# usage:      printHelp
+# arguments:  n/a
+# return:     n/a
+#
+function printHelp {
+  printInfo "printing help text\n"
+  printf "usage:    $(basename ${BASH_SOURCE[0]}) [-h|--help] [-i|--init] [-k|--kernel] [-b|--bootloader] [-p|--periphery-LLD] [-m|--middleware] [-c|--compiler] [--IDE] [-q|--quit] [--log=<file>]\n"
+  printf "\n"
+  printf "options:  -h, --help\n"
+  printf "              Print this help text.\n"
+  printf "          -i, --init\n"
+  printf "              Run project initalization.\n"
+  printf "          -o. --os\n"
+  printf "              Enter operating system setup.\n"
+  printf "          -m, --middleware\n"
+  printf "              Enter middleware setup.\n"
+  printf "          -c, --compiler\n"
+  printf "              Enter compiler setup.\n"
+  printf "          --IDE\n"
+  printf "              Enter IDE setup.\n"
+  printf "          -q, --quit\n"
+  printf "              Quit the script.\n"
+  printf "          --log=<file>\n"
+  printf "              Specify a log file.\n"
+}
+
+### initialize whole project ###################################################
+# Initializes the whole project, including fetching all submodules and so on.
+#
+# usage:      projectInitialization
+# arguments:  n/a
+# return:     n/a
+#
+function projectInitialization {
+  printInfo "initializing project\n"
+  printf "\n"
+  if [ -z "$LOG_FILE" ]; then
+    printInfo "Initializing operating system submodule...\n"
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/os/ossetup.sh --init --quit --noinfo
+    printf "\n"
+    printInfo "initializing AMiRo-OS...\n"
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/os/AMiRo-OS/setup.sh --init --quit --noinfo
+    printf "\n"
+
+    printInfo "Initializing middlewre submodule...\n"
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/middleware/middlewaresetup.sh --init --quit --noinfo
+    printf "\n"
+  else
+    printInfo "Initializing operating system submodule...\n"
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/os/ossetup.sh --init --quit --LOG="$LOG_FILE" --noinfo
+    printf "\n"
+    printInfo "initializing AMiRo-OS...\n"
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/os/AMiRo-OS/setup.sh --init --quit --LOG="$LOG_FILE" --noinfo
+    printf "\n"
+
+    printInfo "Initializing middlewre submodule...\n"
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/middleware/middlewaresetup.sh --init --quit --LOG="$LOG_FILE" --noinfo
+    printf "\n"
+  fi
+  printInfo "initialization complete\n"
+}
+
+### enter operating system setup ###############################################
+# Enter the operating system setup.
+#
+# usage:      osSetup
+# arguments:  n/a
+# return:     n/a
+#
+function osSetup {
+  printInfo "entering operating system setup\n"
+  printf "\n"
+  if [ -z $LOG_FILE ]; then
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/os/ossetup.sh --noinfo
+  else
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/os/ossetup.sh --LOG="$LOG_FILE" --noinfo
+  fi
+}
+
+### enter middleware setup #####################################################
+# Enter the middleware setup.
+#
+# usage:      middlewareSetup
+# arguments:  n/a
+# return:     n/a
+#
+function middlewareSetup {
+  printInfo "entering middleware setup\n"
+  printf "\n"
+  if [ -z $LOG_FILE ]; then
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/middleware/middlewaresetup.sh --noinfo
+  else
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/middleware/middlewaresetup.sh --LOG="$LOG_FILE" --noinfo
+  fi
+}
+
+### enter compiler setup #######################################################
+# Enter the compiler setup of the AMiRo-OS submodule.
+#
+# usage:      compilerSetup
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#             1
+#                 Warning: AMiRo-OS submodule not nitialized yet-
+#
+function compilerSetup {
+  # check if the AMiRo-OS submodule is initialized and the script file exists
+  local amiroosdir=$(dirname $(realpath ${BASH_SOURCE[0]}))/os/AMiRo-OS
+  local amiroosscriptfile=${amiroosdir}/setup.sh
+  if [ -z "$(ls -A $amiroosdir)" ] || [ ! -f $amiroosscriptfile ]; then
+    printError "$amiroosdir is empty. Please initialize first.\n"
+    return 1
+  else
+    printInfo "entering compiler setup\n"
+    if [ -z "$LOG_FILE" ]; then
+      $amiroosscriptfile --compiler --noinfo
+    else
+      $amiroosscriptfile --LOG="$LOG_FILE" --compiler --noinfo
+    fi
+    return 0
+  fi
+}
+
+### enter IDE setup ############################################################
+# Enter IDE setup.
+#
+# usage:      ideSetup
+# arguments:  n/a
+# return:     n/a
+#
+function ideSetup {
+  printInfo "entering IDE setup\n"
+  printf "\n"
+  if [ -z $LOG_FILE ]; then
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/tools/ide/idesetup.sh --noinfo
+  else
+    $(dirname $(realpath ${BASH_SOURCE[0]}))/tools/ide/idesetup.sh --LOG="$LOG_FILE" --noinfo
+  fi
+}
+
+### main function of this script ###############################################
+# Provides functions for project initialization, configuration of IDE and
+# compiler setup, as well as entry points to the several Git submodules.
+#
+# usage:      see function printHelp
+# arguments:  see function printHelp
+# return:     0
+#                 No error or warning occurred.
+#
+function main {
+  # print welcome/info text if not suppressed
+  if [[ $@ != *"--noinfo"* ]]; then
+    printWelcomeText
+  else
+    printf "######################################################################\n"
+  fi
+  printf "\n"
+
+  # if --help or -h was specified, print the help text and exit
+  if [[ $@ == *"--help"* || $@ == *"-h"* ]]; then
+    printHelp
+    printf "\n"
+    quitScript
+  fi
+
+  # set log file if specified
+  if [[ $@ == *"--log"* ]] || [[ $@ == *"--LOG"* ]]; then
+    # get the parameter (file name)
+    local cmdidx=1
+    while [[ ! "${!cmdidx}" = "--log"* ]] && [[ ! "${!cmdidx}" = "--LOG"* ]]; do
+      cmdidx=$[cmdidx + 1]
+    done
+    local cmd="${!cmdidx}"
+    local logfile=""
+    if [[ "$cmd" = "--log="* ]] || [[ "$cmd" = "--LOG="* ]]; then
+      logfile=${cmd#*=}
+    else
+      local filenameidx=$((cmdidx + 1))
+      logfile="${!filenameidx}"
+    fi
+    # optionally force silent appending
+    if [[ "$cmd" = "--LOG"* ]]; then
+      setLogFile --option=c --quiet "$logfile" LOG_FILE
+    else
+      setLogFile "$logfile" LOG_FILE
+      printf "\n"
+    fi
+  fi
+  # log script name
+  printLog "this is $(realpath ${BASH_SOURCE[0]})\n"
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -h|--help) # already handled; ignore
+          shift 1;;
+        -i|--init)
+           projectInitialization; printf "\n"; shift 1;;
+        -o|--os)
+           osSetup; printf "\n"; shift 1;;
+        -m|--middleware)
+           middlewareSetup; printf "\n"; shift 1;;
+        -c|--compiler)
+           compilerSetup; printf "\n"; shift 1;;
+        --IDE)
+           ideSetup; printf "\n"; shift 1;;
+        -q|--quit)
+          quitScript; shift 1;;
+        --log=*|--LOG=*) # already handled; ignore
+          shift 1;;
+        --log|--LOG) # already handled; ignore
+          shift 2;;
+        --noinfo) # already handled; ignore
+          shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+
+  # interactive menu
+  while ( true ); do
+    # main menu info prompt and selection
+    printInfo "AMiRo-Apps main menu\n"
+    printf "Please select one of the following actions:\n"
+    printf "  [I] - project initialization\n"
+    printf "  [O] - enter operating system setup\n"
+    printf "  [M] - enter middleware setup\n"
+    printf "  [C] - enter compiler setup\n"
+    printf "  [E] - enter IDE project setup\n"
+    printf "  [Q] - quit this setup\n"
+    local userinput=""
+    readUserInput "IiOoMmCcEeQq" userinput
+    printf "\n"
+
+    # evaluate user selection
+    case "$userinput" in
+      I|i)
+        projectInitialization; printf "\n";;
+      O|o)
+        osSetup; printf "\n";;
+      M|m)
+        middlewareSetup; printf "\n";;
+      C|c)
+        compilerSetup; printf "\n";;
+      E|e)
+        ideSetup; printf "\n";;
+      Q|q)
+        quitScript;;
+      *) # sanity check (exit with error)
+        printError "unexpected argument: $userinput\n";;
+    esac
+  done
+
+  exit 0
+}
+
+################################################################################
+# SCRIPT ENTRY POINT                                                           #
+################################################################################
+
+main "$@"
diff --git a/tools/ide/QtCreator/QtCreatorSetup.sh b/tools/ide/QtCreator/QtCreatorSetup.sh
new file mode 100755
index 0000000..19b1620
--- /dev/null
+++ b/tools/ide/QtCreator/QtCreatorSetup.sh
@@ -0,0 +1,684 @@
+################################################################################
+# AMiRo-Apps is a collection of applications and configurations for the        #
+# Autonomous Mini Robot (AMiRo).                                               #
+# Copyright (C) 2018..2018  Thomas Schöpping et al.                            #
+#                                                                              #
+# This program 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.                                          #
+#                                                                              #
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.        #
+#                                                                              #
+# This research/work was supported by the Cluster of Excellence Cognitive      #
+# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
+# funded by the German Research Foundation (DFG).                              #
+################################################################################
+
+#!/bin/bash
+
+################################################################################
+# GENERIC FUNCTIONS                                                            #
+################################################################################
+
+### print an error message #####################################################
+# Prints a error <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printError <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printError {
+  local string="ERROR:   $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 1)>>> $string$(tput sgr 0)" 1>&2
+}
+
+### print a warning message ####################################################
+# Prints a warning <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printMessage <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printWarning {
+  local string="WARNING: $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 3)>>> $string$(tput sgr 0)"
+}
+
+### print an information message ###############################################
+# Prints an information <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printInfo <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printInfo {
+  local string="INFO:    $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 2)>>> $string$(tput sgr 0)"
+}
+
+### print a message to file ####################################################
+# Appends a <message> to a log file, specified by the variable 'LOG_FILE'.
+#
+# usage       printLog <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printLog {
+  local string="LOG:     $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+}
+
+### exit the script normally ###################################################
+# Prints a delimiter and exits the script normally (returns 0).
+#
+# usage:      quitScript
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#
+function quitScript {
+  printInfo "exiting $(realpath ${BASH_SOURCE[0]})\n"
+  printf "\n"
+  printf "######################################################################\n"
+  exit 0
+}
+
+### read a user input ##########################################################
+# Reads a single character user input from a set up <options> and stores it in
+# a given <return> variable.
+#
+# usage:      readUserInput <options> <return>
+# arguments:  <options>
+#                 String definiing the set of valid characters.
+#                 If the string is empty, the user can input any character.
+#             <return>
+#                 Variable to store the selected character to.
+# return:     n/a
+#
+function readUserInput {
+  local input=""
+  # read user input
+  while [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); do
+    read -p "your selection: " -n 1 -e input
+    if [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); then
+      printWarning "[$input] is no valid action\n"
+    fi
+  done
+  printLog "[$input] has been selected\n"
+  eval $2="$input"
+}
+
+### check whether argument is an option ########################################
+# Checks a <string> whether it is an option.
+# Options are defined to either start with '--' followed by any string, or
+# to start with a single '-' followed by a single character, or
+# to start with a single '-' followed by a single character, a '=' and any string.
+# Examples: '--option', '--option=arg', '-o', '-o=arg', '--'
+#
+# usage:      parseIsOption <string>
+# arguments:  <string>
+#                 A string to check whether it is an option.
+# return:     0
+#                 <string> is an option.
+#             -1
+#                 <string> is not an option.
+#
+function parseIsOption {
+  if [[ "$1" =~ ^-(.$|.=.*) ]] || [[ "$1" =~ ^--.* ]]; then
+    return 0
+  else
+    return -1
+  fi
+}
+
+### set the log file ###########################################################
+# Sets a specified <infile> as log file and checks whether it already exists.
+# If so, the log may either be appended to the file, its content can be cleared,
+# or no log is generated at all.
+# The resulting path is stored in <outvar>.
+#
+# usage:      setLogFile [--option=<option>] [--quiet] <infile> <outvar>
+# arguments:  --option=<option>
+#                 Select what to do if <file> already exists.
+#                 Possible values are 'a', 'c', 'r' and 'n'.
+#                 - a: append (starts with a separator)
+#                 - c: continue (does not insert a seperator)
+#                 - r: delete and restart
+#                 - n: no log
+#                 If no option is secified but <file> exists, an interactive selection is provided.
+#             --quiet
+#                 Suppress all messages.
+#             <infile>
+#                 Path of the wanted log file.
+#             <outvar>
+#                 Variable to store the path of the log file to.
+# return:     0
+#                 No error or warning occurred.
+#             -1
+#                 Error: invalid input
+#
+function setLogFile {
+  local filepath=""
+  local option=""
+  local quiet=false
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -o=*|--option=*)
+          option=${1#*=}; shift 1;;
+        -o*|--option*)
+          option="$2"; shift 2;;
+        -q|--quiet)
+          quiet=true; shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+  filepath=$(realpath ${otherargs[0]})
+
+  # if file already exists
+  if [ -e $filepath ]; then
+    # if no option was specified, ask what to do
+    if [ -z "$option" ]; then
+      printWarning "log file $filepath already esists\n"
+      local userinput=""
+      printf "Select what to do:\n"
+      printf "  [A] - append log\n"
+      printf "  [R] - restart log (delete existing file)\n"
+      printf "  [N] - no log\n"
+      readUserInput "AaRrNn" userinput
+      option=${userinput,,}
+    fi
+    # evaluate option
+    case "$option" in
+      a|c)
+        if [ $quiet = false ]; then
+          printInfo "appending log to $filepath\n"
+        fi
+        if [ $option != c ]; then
+          printf "\n" >> $filepath
+          printf "######################################################################\n" >> $filepath
+          printf "\n" >> $filepath
+        fi
+        ;;
+      r)
+        echo -n "" > $filepath
+        if [ $quiet = false ]; then
+          printInfo "content of $filepath wiped\n"
+        fi
+        ;;
+      n)
+        if [ $quiet = false ]; then
+          printInfo "no log file will be generated\n"
+        fi
+        filepath=""
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected argument: $option\n"; return -1;;
+    esac
+  else
+    if [ $quiet = false ]; then
+      printInfo "log file set to $filepath\n"
+    fi
+  fi
+
+  eval ${otherargs[1]}="$filepath"
+
+  return 0
+}
+
+################################################################################
+# SPECIFIC FUNCTIONS                                                           #
+################################################################################
+
+### print welcome text #########################################################
+# Prints a welcome message to standard out.
+#
+# usage:      printWelcomeText
+# arguments:  n/a
+# return:     n/a
+#
+function printWelcomeText {
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "#                  Welcome to the QtCreator setup!                   #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "# Copyright (c) 2018..2018  Thomas Schöpping                         #\n"
+  printf "#                                                                    #\n"
+  printf "# This is free software; see the source for copying conditions.      #\n"
+  printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
+  printf "# A PARTICULAR PURPOSE. The development of this software was         #\n"
+  printf "# supported by the Excellence Cluster EXC 227 Cognitive Interaction  #\n"
+  printf "# Technology. The Excellence Cluster EXC 227 is a grant of the       #\n"
+  printf "# Deutsche Forschungsgemeinschaft (DFG) in the context of the German #\n"
+  printf "# Excellence Initiative.                                             #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+}
+
+### print help #################################################################
+# Prints a help text to standard out.
+#
+# usage:      printHelp
+# arguments:  n/a
+# return:     n/a
+#
+function printHelp {
+  printInfo "printing help text\n"
+  printf "usage:    $(basename ${BASH_SOURCE[0]}) [-h|--help] [-c|--clean] [-w|--wipe] [-q|--quit] [--log=<file>]\n"
+  printf "\n"
+  printf "options:  -h, --help\n"
+  printf "              Print this help text.\n"
+  printf "          -i, --initialize\n"
+  printf "              Initialize project files.\n"
+  printf "          -c, --clean\n"
+  printf "              Delete project files.\n"
+  printf "          -w, --wipe\n"
+  printf "              Delete project and .user files.\n"
+  printf "          -q, --quit\n"
+  printf "              Quit the script.\n"
+  printf "          --log=<file>\n"
+  printf "              Specify a log file.\n"
+}
+
+### read directory where to create/delete projects #############################
+# Read the directory where to create/delete project files from user.
+#
+# usage:      getProjectDir <pathvar>
+# arguments:  <pathvar>
+#                 Variable to store the selected path to.
+# return:     n/a
+#
+function getProjectDir {
+  printLog "reading path for project files from user...\n"
+  local amiroappsdir=$(realpath $(dirname $(realpath ${BASH_SOURCE[0]}))/../../../)
+  local input=""
+  read -p "Path where to create/delete project files: " -i $amiroappsdir -e input
+  printLog "user selected path $(realpath $input)\n"
+  eval $1="$(realpath $input)"
+}
+
+### retrieves the ARM-NONE-EABI-GCC include directory ##########################
+# Retrieves the include directory of the currently set arm-none-eabi-gcc.
+#
+# usage:      retrieveGccIncludeDir <path>
+# arguments:  <path>
+#                 Variable to store the path to.
+# return:    0
+#                 No error or warning occurred.
+#            -1
+#                 Error: Command 'arm-none-eabi-gcc' not found.
+#
+function retrieveGccIncludeDir {
+  # retrieve binary path or link
+  local binpath=$(which arm-none-eabi-gcc)
+  if [ -z "$binpath" ]; then
+    printError "command 'arm-none-eabi-gcc' not found\n"
+    return -1
+  else 
+
+    # traverse any links
+    while [ -L "$binpath" ]; do
+      binpath=$(readlink $binpath)
+    done
+    printInfo "gcc-arm-none-eabi detected: $binpath\n"
+
+    # return include path
+    eval $1=$(realpath $(dirname ${binpath})/../arm-none-eabi/include/)
+
+    return 0
+  fi
+}
+
+### intialize project files ####################################################
+# Initailizes all project files.
+#
+# usage:      initProject [-p|--path=<path>] [--gcc=<path>] [-o|--out=<var>] [--gccout=<var>]
+# arguments:  -p, --path <path>
+#                 Path where to create the project files.
+#             --gcc=<path>
+#                 Path to the GCC include directory.
+#             -o, --out <var>
+#                 Variable to store the path to.
+#             --gccout=<var>
+#                 Variable to store the path to the GCC include directory to.
+# return:     0
+#                 No error or warning occurred.
+#
+function initProject {
+  local userdir=$(pwd)
+  local projectdir=""
+  local gccincludedir=""
+  local outvar=""
+  local gccoutvar=""
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -p=*|--path=*)
+          projectdir=$(realpath "${1#*=}"); shift 1;;
+        -p|--path)
+          projectdir=$(realpath "$2"); shift 2;;
+        --gcc=*)
+          gccincludedir=$(realpath "${1#*=}"); shift 1;;
+        --gcc)
+          gccincludedir=$(realpath "$2"); shift 2;;
+        -o=*|--out=*)
+          outvar=${1#*=}; shift 1;;
+        -o|--out)
+          outvar=$2; shift 2;;
+        --gccout=*)
+          gccoutvar=$(realpath "${1#*=}"); shift 1;;
+        --gccout)
+          gccoutvar=$(realpath "$2"); shift 2;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+
+  # print message
+  printInfo "creating QtCreator project files...\n"
+
+  # read absolute project directory if required
+  if [ -z "$projectdir" ]; then
+    getProjectDir projectdir
+  fi
+
+  # retrieve absolute GCC include dir
+  if [ -z "$gccincludedir" ]; then
+    retrieveGccIncludeDir gccincludedir
+  fi
+
+  # move to project directory
+  cd $projectdir
+
+  # AMiRo-OS, ChibiOS, AMiRo-BLT, AMiRo-LLD and uRtWare relative root directories
+  local amiroappsrootdir=$(realpath --relative-base=$projectdir $(dirname ${BASH_SOURCE[0]})/../../..)
+  local amiroosrootdir=$(realpath --relative-base=$projectdir ${amiroappsrootdir}/os/AMiRo-OS/os)
+  local chibiosrootdir=$(realpath --relative-base=$projectdir ${amiroosrootdir}/../kernel/ChibiOS)
+  local amirobltrootdir=$(realpath --relative-base=$projectdir ${amiroosrootdir}/../bootloader/AMiRo-BLT)
+  local amirolldrootdir=$(realpath --relative-base=$projectdir ${amiroosrootdir}/../periphery-lld/AMiRo-LLD)
+  local urtwarerootdir=$(realpath --relative-base=$projectdir $(dirname ${BASH_SOURCE[0]})/../../../middleware/uRtWare/)
+
+  # generate a file that contains all subdirectories as includes (but ignore hidden and documentation directories)
+  find $gccincludedir -type d > ${projectdir}/AMiRo-Apps.includes
+  find $amiroappsrootdir -type d | grep -E "/(apps|configurations)/.+" >> ${projectdir}/AMiRo-Apps.includes
+  find $amiroosrootdir -type d | grep -v "/doc\|/build\|/.dep\|/hal\|/ports" >> ${projectdir}/AMiRo-Apps.includes
+  find $amiroosrootdir -type d | grep -E "/os/hal/(include|src)" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/os/common/abstractions/cmsis_os$" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/os/common/oslib/(include|src)$" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/os/hal/(include|src)$" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/os/hal/lib/streams" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/os/hal/osal/(lib|rt)$" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/os/license$" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/os/rt/(include|src)$" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/os/various/(shell|cpp_wrappers)" >> ${projectdir}/AMiRo-Apps.includes
+  find $chibiosrootdir -type d | grep -E "/test/(lib|rt/source/test)$" >> ${projectdir}/AMiRo-Apps.includes
+  find $amirobltrootdir -type d | grep -E "/Target/Source/AMiRo$" >> ${projectdir}/AMiRo-Apps.includes
+  echo "$(realpath --relative-base=$projectdir ${amirolldrootdir}/..)" >> ${projectdir}/AMiRo-Apps.includes
+  find $amirolldrootdir -type d | grep -v "/doc" >> ${projectdir}/AMiRo-Apps.includes
+  find $urtwarerootdir -type d | grep -v "/doc" >> ${projectdir}/AMiRo-Apps.includes
+  # generate a file that specifies all files
+  echo -n "" > ${projectdir}/AMiRo-Apps.files
+  for path in `cat ${projectdir}/AMiRo-Apps.includes`; do
+    find $path -maxdepth 1 -type f \( ! -iname ".*" \) |
+      grep -Ev "^.*/arm-none-eabi/.*$" |
+      grep -E  "^.*(\.s|\.S|\.h|\.c|\.hpp|\.cpp|\.tpp|\.ld)$" |
+      grep -Ev "^${amirobltrootdir}/Target/Source/AMiRo/helper.*$" >> ${projectdir}/AMiRo-Apps.files;
+  done
+  # generate a default project configuration file if none exists so far
+  if [ ! -f ${projectdir}/AMiRo-Apps.config ]; then
+    echo "// Add predefined macros for your project here. For example:" > ${projectdir}/AMiRo-Apps.config
+    echo "// #define YOUR_CONFIGURATION belongs here" >> ${projectdir}/AMiRo-Apps.config
+  fi
+  # generate a default .creator file if none exists so far
+  if [ ! -f ${projectdir}/AMiRo-Apps}.creator ]; then
+    echo "[general]" > ${projectdir}/AMiRo-Apps.creator
+  fi
+
+  # go back to user directory
+  cd $userdir
+
+  # fill the output variables
+  if [ ! -z "$outvar" ]; then
+    eval $outvar="$projectdir"
+  fi
+  if [ ! -z "$gccoutvar" ]; then
+    eval $gccoutvar="$gccincludedir"
+  fi
+
+  return 0
+}
+
+### delete project files #######################################################
+# Deletes all project files and optionally .user files, too.
+#
+# usage:      deleteProject [-p|--path=<path>] [-o|--out=<var>] [-w|-wipe]
+# arguments:  -p, --path <path>
+#                 Path where to delete the project files.
+#             -o, --out <var>
+#                 Variable to store the path to.
+#             -w, --wipe
+#                 Delete .user files as well.
+# return:
+#  -  0: no error
+#  -  1: warning: function aborted by user
+#  - -1: error: unexpected user input
+function deleteProject {
+  local projectdir=""
+  local outvar=""
+  local wipe=false
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -p=*|--path=*)
+          projectdir=$(realpath "${1#*=}"); shift 1;;
+        -p|--path)
+          projectdir=$(realpath "$2"); shift 2;;
+        -o=*|--out=*)
+          outvar=${1#*=}; shift 1;;
+        -o|--out)
+          outvar=$2; shift 2;;
+        -w|--wipe)
+          wipe=true; shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+
+  # print message
+  if [ $wipe != true ]; then
+    printInfo "deleting all QtCreator project files (*.includes, *.files, *.config, and *.creator)\n"
+  else
+    printInfo "deleting all QtCreator project files (*.includes, *.files, *.config, *.creator, and *.user)\n"
+  fi
+
+  # read project directory if required
+  if [ -z "$projectdir" ]; then
+    getProjectDir projectdir
+  fi
+
+  # remove all project files
+  rm ${projectdir}/AMiRo-Apps.includes 2>&1 | tee -a $LOG_FILE
+  rm ${projectdir}/AMiRo-Apps.files 2>&1 | tee -a $LOG_FILE
+  rm ${projectdir}/AMiRo-Apps.config 2>&1 | tee -a $LOG_FILE
+  rm ${projectdir}/AMiRo-Apps.creator 2>&1 | tee -a $LOG_FILE
+
+  if [ $wipe == true ]; then
+    rm ${projectdir}/AMiRo-Apps.creator.user 2>&1 | tee -a $LOG_FILE
+  fi
+
+  # store the path to the output variable, if required
+  if [ ! -z "$outvar" ]; then
+    eval $outvar="$projectdir"
+  fi
+
+  return 0
+
+}
+
+### main function of this script ###############################################
+# Creates, deletes and wipes QtCreator project files for the three AMiRo base modules.
+#
+# usage:      see function printHelp
+# arguments:  see function printHelp
+# return:     0
+#                 No error or warning ocurred.
+#
+function main {
+# print welcome/info text if not suppressed
+  if [[ $@ != *"--noinfo"* ]]; then
+    printWelcomeText
+  else
+    printf "######################################################################\n"
+  fi
+  printf "\n"
+
+  # if --help or -h was specified, print the help text and exit
+  if [[ $@ == *"--help"* || $@ == *"-h"* ]]; then
+    printHelp
+    printf "\n"
+    quitScript
+  fi
+
+  # set log file if specified
+  if [[ $@ == *"--log"* ]] || [[ $@ == *"--LOG"* ]]; then
+    # get the parameter (file name)
+    local cmdidx=1
+    while [[ ! "${!cmdidx}" = "--log"* ]] && [[ ! "${!cmdidx}" = "--LOG"* ]]; do
+      cmdidx=$[cmdidx + 1]
+    done
+    local cmd="${!cmdidx}"
+    local logfile=""
+    if [[ "$cmd" = "--log="* ]] || [[ "$cmd" = "--LOG="* ]]; then
+      logfile=${cmd#*=}
+    else
+      local filenameidx=$((cmdidx + 1))
+      logfile="${!filenameidx}"
+    fi
+    # optionally force silent appending
+    if [[ "$cmd" = "--LOG"* ]]; then
+      setLogFile --option=c --quiet "$logfile" LOG_FILE
+    else
+      setLogFile "$logfile" LOG_FILE
+      printf "\n"
+    fi
+  fi
+  # log script name
+  printLog "this is $(realpath ${BASH_SOURCE[0]})\n"
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -h|--help) # already handled; ignore
+          shift 1;;
+        -c|--clean)
+          deleteProjects; printf "\n"; shift 1;;
+        -w|--wipe)
+          deleteProjects --wipe; printf "\n"; shift 1;;
+        -q|--quit)
+          quitScript; shift 1;;
+        --log=*|--LOG=*) # already handled; ignore
+          shift 1;;
+        --log|--LOG) # already handled; ignore
+          shift 2;;
+        --noinfo) # already handled; ignore
+          shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+
+  # interactive menu
+  while ( true ); do
+    # main menu info prompt and selection
+    printInfo "QtCreator setup main menu\n"
+    printf "Please select one of the following actions:\n"
+    printf "  [I] - initialize project files\n"
+    printf "  [C] - clean project files\n"
+    printf "  [W] - wipe project and .user files\n"
+    printf "  [Q] - quit this setup\n"
+    local userinput=""
+    readUserInput "IiCcWwQq" userinput
+    printf "\n"
+
+    # evaluate user selection
+    case "$userinput" in
+      I|i)
+        initProject; printf "\n";;
+      C|c)
+        deleteProject; printf "\n";;
+      W|w)
+        deleteProject --wipe; printf "\n";;
+      Q|q)
+        quitScript;;
+      *) # sanity check (exit with error)
+        printError "unexpected argument: $userinput\n";;
+    esac
+  done
+
+  exit 0
+}
+
+################################################################################
+# SCRIPT ENTRY POINT                                                           #
+################################################################################
+
+main "$@"
diff --git a/tools/ide/idesetup.sh b/tools/ide/idesetup.sh
new file mode 100755
index 0000000..87ad166
--- /dev/null
+++ b/tools/ide/idesetup.sh
@@ -0,0 +1,440 @@
+################################################################################
+# AMiRo-Apps is a collection of applications and configurations for the        #
+# Autonomous Mini Robot (AMiRo).                                               #
+# Copyright (C) 2018..2018  Thomas Schöpping et al.                            #
+#                                                                              #
+# This program 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.                                          #
+#                                                                              #
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.        #
+#                                                                              #
+# This research/work was supported by the Cluster of Excellence Cognitive      #
+# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
+# funded by the German Research Foundation (DFG).                              #
+################################################################################
+
+#!/bin/bash
+
+################################################################################
+# GENERIC FUNCTIONS                                                            #
+################################################################################
+
+### print an error message #####################################################
+# Prints a error <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printError <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printError {
+  local string="ERROR:   $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 1)>>> $string$(tput sgr 0)" 1>&2
+}
+
+### print a warning message ####################################################
+# Prints a warning <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printMessage <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printWarning {
+  local string="WARNING: $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 3)>>> $string$(tput sgr 0)"
+}
+
+### print an information message ###############################################
+# Prints an information <message> to standard output.
+#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
+#
+# usage:      printInfo <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printInfo {
+  local string="INFO:    $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+  printf "$(tput setaf 2)>>> $string$(tput sgr 0)"
+}
+
+### print a message to file ####################################################
+# Appends a <message> to a log file, specified by the variable 'LOG_FILE'.
+#
+# usage       printLog <message>
+# arguments:  <message>
+#                 Message string to print.
+# return:     n/a
+#
+function printLog {
+  local string="LOG:     $1"
+  # if a log file is specified
+  if [ -n "$LOG_FILE" ]; then
+    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
+  fi
+}
+
+### exit the script normally ###################################################
+# Prints a delimiter and exits the script normally (returns 0).
+#
+# usage:      quitScript
+# arguments:  n/a
+# return:     0
+#                 No error or warning occurred.
+#
+function quitScript {
+  printInfo "exiting $(realpath ${BASH_SOURCE[0]})\n"
+  printf "\n"
+  printf "######################################################################\n"
+  exit 0
+}
+
+### read a user input ##########################################################
+# Reads a single character user input from a set up <options> and stores it in
+# a given <return> variable.
+#
+# usage:      readUserInput <options> <return>
+# arguments:  <options>
+#                 String definiing the set of valid characters.
+#                 If the string is empty, the user can input any character.
+#             <return>
+#                 Variable to store the selected character to.
+# return:     n/a
+#
+function readUserInput {
+  local input=""
+  # read user input
+  while [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); do
+    read -p "your selection: " -n 1 -e input
+    if [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); then
+      printWarning "[$input] is no valid action\n"
+    fi
+  done
+  printLog "[$input] has been selected\n"
+  eval $2="$input"
+}
+
+### check whether argument is an option ########################################
+# Checks a <string> whether it is an option.
+# Options are defined to either start with '--' followed by any string, or
+# to start with a single '-' followed by a single character, or
+# to start with a single '-' followed by a single character, a '=' and any string.
+# Examples: '--option', '--option=arg', '-o', '-o=arg', '--'
+#
+# usage:      parseIsOption <string>
+# arguments:  <string>
+#                 A string to check whether it is an option.
+# return:     0
+#                 <string> is an option.
+#             -1
+#                 <string> is not an option.
+#
+function parseIsOption {
+  if [[ "$1" =~ ^-(.$|.=.*) ]] || [[ "$1" =~ ^--.* ]]; then
+    return 0
+  else
+    return -1
+  fi
+}
+
+### set the log file ###########################################################
+# Sets a specified <infile> as log file and checks whether it already exists.
+# If so, the log may either be appended to the file, its content can be cleared,
+# or no log is generated at all.
+# The resulting path is stored in <outvar>.
+#
+# usage:      setLogFile [--option=<option>] [--quiet] <infile> <outvar>
+# arguments:  --option=<option>
+#                 Select what to do if <file> already exists.
+#                 Possible values are 'a', 'c', 'r' and 'n'.
+#                 - a: append (starts with a separator)
+#                 - c: continue (does not insert a seperator)
+#                 - r: delete and restart
+#                 - n: no log
+#                 If no option is secified but <file> exists, an interactive selection is provided.
+#             --quiet
+#                 Suppress all messages.
+#             <infile>
+#                 Path of the wanted log file.
+#             <outvar>
+#                 Variable to store the path of the log file to.
+# return:     0
+#                 No error or warning occurred.
+#             -1
+#                 Error: invalid input
+#
+function setLogFile {
+  local filepath=""
+  local option=""
+  local quiet=false
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -o=*|--option=*)
+          option=${1#*=}; shift 1;;
+        -o*|--option*)
+          option="$2"; shift 2;;
+        -q|--quiet)
+          quiet=true; shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+  filepath=$(realpath ${otherargs[0]})
+
+  # if file already exists
+  if [ -e $filepath ]; then
+    # if no option was specified, ask what to do
+    if [ -z "$option" ]; then
+      printWarning "log file $filepath already esists\n"
+      local userinput=""
+      printf "Select what to do:\n"
+      printf "  [A] - append log\n"
+      printf "  [R] - restart log (delete existing file)\n"
+      printf "  [N] - no log\n"
+      readUserInput "AaRrNn" userinput
+      option=${userinput,,}
+    fi
+    # evaluate option
+    case "$option" in
+      a|c)
+        if [ $quiet = false ]; then
+          printInfo "appending log to $filepath\n"
+        fi
+        if [ $option != c ]; then
+          printf "\n" >> $filepath
+          printf "######################################################################\n" >> $filepath
+          printf "\n" >> $filepath
+        fi
+        ;;
+      r)
+        echo -n "" > $filepath
+        if [ $quiet = false ]; then
+          printInfo "content of $filepath wiped\n"
+        fi
+        ;;
+      n)
+        if [ $quiet = false ]; then
+          printInfo "no log file will be generated\n"
+        fi
+        filepath=""
+        ;;
+      *) # sanity check (return error)
+        printError "unexpected argument: $option\n"; return -1;;
+    esac
+  else
+    if [ $quiet = false ]; then
+      printInfo "log file set to $filepath\n"
+    fi
+  fi
+
+  eval ${otherargs[1]}="$filepath"
+
+  return 0
+}
+
+################################################################################
+# SPECIFIC FUNCTIONS                                                           #
+################################################################################
+
+### print welcome text #########################################################
+# Prints a welcome message to standard out.
+#
+# usage:      printWelcomeText
+# arguments:  n/a
+# return:     n/a
+#
+function printWelcomeText {
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "#                Welcome to the AMiRo-Apps IDE setup!                #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+  printf "#                                                                    #\n"
+  printf "# Copyright (c) 2018..2018  Thomas Schöpping                         #\n"
+  printf "#                                                                    #\n"
+  printf "# This is free software; see the source for copying conditions.      #\n"
+  printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
+  printf "# A PARTICULAR PURPOSE. The development of this software was         #\n"
+  printf "# supported by the Excellence Cluster EXC 227 Cognitive Interaction  #\n"
+  printf "# Technology. The Excellence Cluster EXC 227 is a grant of the       #\n"
+  printf "# Deutsche Forschungsgemeinschaft (DFG) in the context of the German #\n"
+  printf "# Excellence Initiative.                                             #\n"
+  printf "#                                                                    #\n"
+  printf "######################################################################\n"
+}
+
+### print help #################################################################
+# Prints a help text to standard out.
+#
+# usage:      printHelp
+# arguments:  n/a
+# return:     n/a
+#
+function printHelp {
+  printInfo "printing help text\n"
+  printf "usage:    $(basename ${BASH_SOURCE[0]}) [-h|--help] [--QtCreator] [-q|--quit] [--log=<file>]\n"
+  printf "\n"
+  printf "options:  -h, --help\n"
+  printf "              Print this help text.\n"
+  printf "          --QtCreator\n"
+  printf "              Enter QtCreator setup.\n"
+  printf "          -q, --quit\n"
+  printf "              Quit the script.\n"
+  printf "          --log=<file>\n"
+  printf "              Specify a log file.\n"
+}
+
+### enter QtCreator setup ######################################################
+# Enter the QtCreator IDE setup.
+#
+# usage:      qtCreatorSetup
+# arguments:  n/a
+# return:     n/a
+function qtCreatorSetup {
+  printInfo "entering QtCreator setup...\n"
+  printf "\n"
+  if [ -z "$LOG_FILE" ]; then
+    $(realpath $(dirname ${BASH_SOURCE[0]}))/QtCreator/QtCreatorSetup.sh --noinfo
+  else
+    $(realpath $(dirname ${BASH_SOURCE[0]}))/QtCreator/QtCreatorSetup.sh --LOG="$LOG_FILE" --noinfo
+  fi
+}
+
+### main function of this script ###############################################
+# The IDE setup lets the user select an IDE of choice.
+# As of now, only QtCreator is supported.
+#
+# usage:      see function printHelp
+# arguments:  see function printHelp
+# return:     0
+#                 No error or warning occurred.
+#
+function main {
+  # print welcome/info text if not suppressed
+  if [[ $@ != *"--noinfo"* ]]; then
+    printWelcomeText
+  else
+    printf "######################################################################\n"
+  fi
+  printf "\n"
+
+  # if --help or -h was specified, print the help text and exit
+  if [[ $@ == *"--help"* || $@ == *"-h"* ]]; then
+    printHelp
+    printf "\n"
+    quitScript
+  fi
+
+  # set log file if specified
+  if [[ $@ == *"--log"* ]] || [[ $@ == *"--LOG"* ]]; then
+    # get the parameter (file name)
+    local cmdidx=1
+    while [[ ! "${!cmdidx}" = "--log"* ]] && [[ ! "${!cmdidx}" = "--LOG"* ]]; do
+      cmdidx=$[cmdidx + 1]
+    done
+    local cmd="${!cmdidx}"
+    local logfile=""
+    if [[ "$cmd" = "--log="* ]] || [[ "$cmd" = "--LOG="* ]]; then
+      logfile=${cmd#*=}
+    else
+      local filenameidx=$((cmdidx + 1))
+      logfile="${!filenameidx}"
+    fi
+    # optionally force silent appending
+    if [[ "$cmd" = "--LOG"* ]]; then
+      setLogFile --option=c --quiet "$logfile" LOG_FILE
+    else
+      setLogFile "$logfile" LOG_FILE
+      printf "\n"
+    fi
+  fi
+  # log script name
+  printLog "this is $(realpath ${BASH_SOURCE[0]})\n"
+
+  # parse arguments
+  local otherargs=()
+  while [ $# -gt 0 ]; do
+    if ( parseIsOption $1 ); then
+      case "$1" in
+        -h|--help) # already handled; ignore
+          shift 1;;
+        --QtCreator)
+          qtCreatorSetup; printf "\n"; shift 1;;
+        -q|--quit)
+          quitScript; printf "\n"; shift 1;;
+        --log=*|--LOG=*) # already handled; ignore
+          shift 1;;
+        --log|--LOG) # already handled; ignore
+          shift 2;;
+        --noinfo) # already handled; ignore
+          shift 1;;
+        *)
+          printError "invalid option: $1\n"; shift 1;;
+      esac
+    else
+      otherargs+=("$1")
+      shift 1
+    fi
+  done
+
+  # interactive menu
+  while ( true ); do
+    # main menu info prompt and selection
+    printInfo "AMiRo-OS IDE setup main menu\n"
+    printf "Please select one of the following actions:\n"
+    printf "  [C] - enter QtCreator setup\n"
+    printf "  [Q] - quit this setup\n"
+    local userinput=""
+    readUserInput "CcQq" userinput
+    printf "\n"
+
+    # evaluate user selection
+    case "$userinput" in
+      C|c)
+        qtCreatorSetup; printf "\n";;
+      Q|q)
+        quitScript;;
+      *) # sanity check (exit with error)
+        printError "unexpected argument: $userinput\n";;
+    esac
+  done
+
+  exit 0
+}
+
+################################################################################
+# SCRIPT ENTRY POINT                                                           #
+################################################################################
+
+main "$@"
