diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e509cd2e7b4dd2c6ece0b183a4755e03bf3e83f4
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,225 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  applehelp  to make an Apple Help Book"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  epub3      to make an epub3"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  xml        to make Docutils-native XML files"
+	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+	@echo "  coverage   to run coverage check of the documentation (if enabled)"
+	@echo "  dummy      to check syntax errors of document sources"
+
+.PHONY: clean
+clean:
+	rm -rf $(BUILDDIR)/*
+
+.PHONY: html
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+.PHONY: dirhtml
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+.PHONY: singlehtml
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+.PHONY: pickle
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+.PHONY: json
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+.PHONY: htmlhelp
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+.PHONY: qthelp
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/MindstormsEV3Toolbox.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/MindstormsEV3Toolbox.qhc"
+
+.PHONY: applehelp
+applehelp:
+	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
+	@echo
+	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
+	@echo "N.B. You won't be able to view it unless you put it in" \
+	      "~/Library/Documentation/Help or install it in your application" \
+	      "bundle."
+
+.PHONY: devhelp
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/MindstormsEV3Toolbox"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/MindstormsEV3Toolbox"
+	@echo "# devhelp"
+
+.PHONY: epub
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+.PHONY: epub3
+epub3:
+	$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
+	@echo
+	@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
+
+.PHONY: latex
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+.PHONY: latexpdf
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: latexpdfja
+latexpdfja:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through platex and dvipdfmx..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: text
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+.PHONY: man
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+.PHONY: texinfo
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+.PHONY: info
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+.PHONY: gettext
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+.PHONY: changes
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+.PHONY: linkcheck
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+.PHONY: doctest
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
+
+.PHONY: coverage
+coverage:
+	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
+	@echo "Testing of coverage in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/coverage/python.txt."
+
+.PHONY: xml
+xml:
+	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
+	@echo
+	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
+
+.PHONY: pseudoxml
+pseudoxml:
+	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
+	@echo
+	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
+
+.PHONY: dummy
+dummy:
+	$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
+	@echo
+	@echo "Build finished. Dummy builder generates no files."
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000000000000000000000000000000000000..137ea71c75145bdb2eba031a75401c11e5096bae
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,368 @@
+# -*- coding: utf-8 -*-
+#
+# Mindstorms EV3 Toolbox documentation build configuration file, created by
+# sphinx-quickstart on Fri Nov 25 15:42:28 2016.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+import os
+import sys
+sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.todo',
+    'sphinx.ext.coverage',
+    'sphinx.ext.imgmath',
+    'sphinx.ext.ifconfig',
+    'sphinxcontrib.matlab',
+    'sphinx.ext.napoleon'
+]
+
+# MATLAB extension settings
+matlab_src_dir = os.path.abspath('..')
+primary_domain = 'mat'
+
+#autoclass_content = 'init'
+#autodoc_member_order = 'groupwise'
+#autodoc_default_flags = ''
+
+# Napoleon settings
+napoleon_google_docstring = True
+napoleon_numpy_docstring = False
+napoleon_include_init_with_doc = False
+napoleon_include_private_with_doc = False
+napoleon_include_special_with_doc = False
+napoleon_use_admonition_for_examples = False
+napoleon_use_admonition_for_notes = False
+napoleon_use_admonition_for_references = False
+napoleon_use_ivar = False
+napoleon_use_param = True
+napoleon_use_rtype = True
+napoleon_use_keyword = True
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The encoding of source files.
+#
+# source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Mindstorms EV3 Toolbox'
+copyright = u'2016, Tim Stadtmann'
+author = u'Tim Stadtmann'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = u'v0.3'
+# The full version, including alpha/beta/rc tags.
+release = u'v0.3-rc.6'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#
+# today = ''
+#
+# Else, today_fmt is used as the format for a strftime call.
+#
+# today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This patterns also effect to html_static_path and html_extra_path
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '*hidapi*', '*.dll', '*.dylib', '*proto*', '*.h', '*.lib', '*.exp', 'ID.m', 'include', 'lib', 'private', '*.class', '*.java*', '*_*']
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#
+# default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#
+# add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#
+# add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#
+# show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+# modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+# keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = True
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'classic'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#
+# html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+# html_theme_path = []
+
+# The name for this set of Sphinx documents.
+# "<project> v<release> documentation" by default.
+#
+# html_title = u'Mindstorms EV3 Toolbox vv0.3-rc.6'
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#
+# html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#
+# html_logo = None
+
+# The name of an image file (relative to this directory) to use as a favicon of
+# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#
+# html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#
+# html_extra_path = []
+
+# If not None, a 'Last updated on:' timestamp is inserted at every page
+# bottom, using the given strftime format.
+# The empty string is equivalent to '%b %d, %Y'.
+#
+# html_last_updated_fmt = None
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#
+# html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#
+# html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#
+# html_additional_pages = {}
+
+# If false, no module index is generated.
+#
+# html_domain_indices = True
+
+# If false, no index is generated.
+#
+# html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#
+# html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#
+# html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#
+# html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#
+# html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#
+# html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+# html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
+#
+# html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# 'ja' uses this config value.
+# 'zh' user can custom change `jieba` dictionary path.
+#
+# html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+#
+# html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'MindstormsEV3Toolboxdoc'
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+     # The paper size ('letterpaper' or 'a4paper').
+     #
+     # 'papersize': 'letterpaper',
+
+     # The font size ('10pt', '11pt' or '12pt').
+     #
+     # 'pointsize': '10pt',
+
+     # Additional stuff for the LaTeX preamble.
+     #
+     # 'preamble': '',
+
+     # Latex figure (float) alignment
+     #
+     # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+latex_documents = [
+    (master_doc, 'MindstormsEV3Toolbox.tex', u'Mindstorms EV3 Toolbox Documentation',
+     u'Tim Stadtmann', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#
+# latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#
+# latex_use_parts = False
+
+# If true, show page references after internal links.
+#
+# latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#
+# latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#
+# latex_appendices = []
+
+# It false, will not define \strong, \code, 	itleref, \crossref ... but only
+# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added
+# packages.
+#
+# latex_keep_old_macro_names = True
+
+# If false, no module index is generated.
+#
+# latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (master_doc, 'mindstormsev3toolbox', u'Mindstorms EV3 Toolbox Documentation',
+     [author], 1)
+]
+
+# If true, show URL addresses after external links.
+#
+# man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+    (master_doc, 'MindstormsEV3Toolbox', u'Mindstorms EV3 Toolbox Documentation',
+     author, 'MindstormsEV3Toolbox', 'One line description of project.',
+     'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#
+# texinfo_appendices = []
+
+# If false, no module index is generated.
+#
+# texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#
+# texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#
+# texinfo_no_detailmenu = False
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..6d136d5ab92a9071387c48d76d9f0ce1d061b699
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,23 @@
+.. source documentation master file, created by
+   sphinx-quickstart on Fri Nov 25 16:05:22 2016.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+EV3-Toolbox for controlling Lego Mindstorms EV3 with MATLAB
+===========================================================
+
+Contents:
+
+.. toctree::
+   :maxdepth: 4
+
+   source
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 0000000000000000000000000000000000000000..012a7de9be5e64a3e782f32a7e2c5b9be496c577
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,281 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+	:help
+	echo.Please use `make ^<target^>` where ^<target^> is one of
+	echo.  html       to make standalone HTML files
+	echo.  dirhtml    to make HTML files named index.html in directories
+	echo.  singlehtml to make a single large HTML file
+	echo.  pickle     to make pickle files
+	echo.  json       to make JSON files
+	echo.  htmlhelp   to make HTML files and a HTML help project
+	echo.  qthelp     to make HTML files and a qthelp project
+	echo.  devhelp    to make HTML files and a Devhelp project
+	echo.  epub       to make an epub
+	echo.  epub3      to make an epub3
+	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+	echo.  text       to make text files
+	echo.  man        to make manual pages
+	echo.  texinfo    to make Texinfo files
+	echo.  gettext    to make PO message catalogs
+	echo.  changes    to make an overview over all changed/added/deprecated items
+	echo.  xml        to make Docutils-native XML files
+	echo.  pseudoxml  to make pseudoxml-XML files for display purposes
+	echo.  linkcheck  to check all external links for integrity
+	echo.  doctest    to run all doctests embedded in the documentation if enabled
+	echo.  coverage   to run coverage check of the documentation if enabled
+	echo.  dummy      to check syntax errors of document sources
+	goto end
+)
+
+if "%1" == "clean" (
+	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+	del /q /s %BUILDDIR%\*
+	goto end
+)
+
+
+REM Check if sphinx-build is available and fallback to Python version if any
+%SPHINXBUILD% 1>NUL 2>NUL
+if errorlevel 9009 goto sphinx_python
+goto sphinx_ok
+
+:sphinx_python
+
+set SPHINXBUILD=python -m sphinx.__init__
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.http://sphinx-doc.org/
+	exit /b 1
+)
+
+:sphinx_ok
+
+
+if "%1" == "html" (
+	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+	goto end
+)
+
+if "%1" == "dirhtml" (
+	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+	goto end
+)
+
+if "%1" == "singlehtml" (
+	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+	goto end
+)
+
+if "%1" == "pickle" (
+	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the pickle files.
+	goto end
+)
+
+if "%1" == "json" (
+	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the JSON files.
+	goto end
+)
+
+if "%1" == "htmlhelp" (
+	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+	goto end
+)
+
+if "%1" == "qthelp" (
+	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\MindstormsEV3Toolbox.qhcp
+	echo.To view the help file:
+	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\MindstormsEV3Toolbox.ghc
+	goto end
+)
+
+if "%1" == "devhelp" (
+	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished.
+	goto end
+)
+
+if "%1" == "epub" (
+	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The epub file is in %BUILDDIR%/epub.
+	goto end
+)
+
+if "%1" == "epub3" (
+	%SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The epub3 file is in %BUILDDIR%/epub3.
+	goto end
+)
+
+if "%1" == "latex" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "latexpdf" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	cd %BUILDDIR%/latex
+	make all-pdf
+	cd %~dp0
+	echo.
+	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "latexpdfja" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	cd %BUILDDIR%/latex
+	make all-pdf-ja
+	cd %~dp0
+	echo.
+	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "text" (
+	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The text files are in %BUILDDIR%/text.
+	goto end
+)
+
+if "%1" == "man" (
+	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The manual pages are in %BUILDDIR%/man.
+	goto end
+)
+
+if "%1" == "texinfo" (
+	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
+	goto end
+)
+
+if "%1" == "gettext" (
+	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
+	goto end
+)
+
+if "%1" == "changes" (
+	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.The overview file is in %BUILDDIR%/changes.
+	goto end
+)
+
+if "%1" == "linkcheck" (
+	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+	goto end
+)
+
+if "%1" == "doctest" (
+	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+	goto end
+)
+
+if "%1" == "coverage" (
+	%SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Testing of coverage in the sources finished, look at the ^
+results in %BUILDDIR%/coverage/python.txt.
+	goto end
+)
+
+if "%1" == "xml" (
+	%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The XML files are in %BUILDDIR%/xml.
+	goto end
+)
+
+if "%1" == "pseudoxml" (
+	%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
+	goto end
+)
+
+if "%1" == "dummy" (
+	%SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. Dummy builder generates no files.
+	goto end
+)
+
+:end
diff --git a/docs/source.rst b/docs/source.rst
new file mode 100644
index 0000000000000000000000000000000000000000..f5b2873054d53d4013b9acad122738736680203c
--- /dev/null
+++ b/docs/source.rst
@@ -0,0 +1,21 @@
+.. automodule:: source
+
+EV3
+---
+
+.. autoclass:: EV3
+   :members:
+
+
+Motor
+-----
+
+.. autoclass:: Motor
+   :members: start, stop, syncedStart, syncedStop, waitFor, internalReset, resetTachoCount, setBrake, setProperties
+
+
+Sensor
+------
+
+.. autoclass:: Sensor
+   :members: reset, setProperties
diff --git a/source/Motor.m b/source/Motor.m
index be281aea8eca1d04a9721ba351967cd30e36312d..c96276cbe76b284d390e160fde4c9287465edcab 100755
--- a/source/Motor.m
+++ b/source/Motor.m
@@ -1,122 +1,176 @@
 classdef Motor < MaskedHandle & dynamicprops
-    % Motor High-level class to work with motors.
+    % High-level class to work with motors.
     %
     % This class is supposed to ease the use of the brick's motors. It is possible to set all
     % kinds of parameters, request the current status of the motor ports and of course send 
-    % commands to the brick to be executed on the respective port.
+    % commands to the brick to be executed on the respective port. 
     %
     % Notes:
     %  * You don't need to create instances of this class. The EV3-class automatically creates
     %    instances for each motor port, and you can work with them via the EV3-object. 
+    %  * The Motor-class represents motor ports, not individual motors!
     %
-    %
-    % Signature
-    %  Author: Tim Stadtmann
-    %  Date: 2016/05/19
-    %  Updated: 2016/08/15
+    % Attributes:
+    %    power (numeric in [-100, 100]): Power level of motor in percent. [WRITABLE]
+    %    speedRegulation (bool): Speed regulation turned on or off. When turned on, motor will 
+    %        try to 'hold' its speed at given power level, whatever the load. In this mode, the
+    %        highest possible speed depends on the load and mostly goes up to around 70-80 (at 
+    %        this point, the Brick internally input 100% power). When turned off, motor will 
+    %        constantly input the same power into the motor. The resulting speed will be 
+    %        somewhat lower, depending on the load. [WRITABLE]
+    %    smoothStart (numeric s. t. smoothStart+smoothStop < limitValue): Degrees/Time 
+    %        indicating how far/long the motor should smoothly start. Depending on limitMode, 
+    %        the input is interpreted either in degrees or milliseconds. The first 
+    %        {smoothStart}-milliseconds/degrees of limitValue the motor will slowly accelerate 
+    %        until reaching its defined speed. [WRITABLE]
+    %    smoothStop (numeric s. t. smoothStart+smoothStop < limitValue): Degrees/Time 
+    %        indicating how far/long the motor should smoothly stop. Depending on limitMode, the 
+    %        input is interpreted either in degrees or milliseconds. The last 
+    %        [smoothStop]-milliseconds/degrees of limitValue the motor will slowly slow down 
+    %        until it has stopped. [WRITABLE]
+    %    limitValue (numeric>=0): Degrees/Time indicating how far/long the motor should run.
+    %        Depending on limitMode, the input is interpreted either in degrees or 
+    %        milliseconds. [WRITABLE]
+    %    limitMode ('Tacho'|'Time'): Mode for motor limit. [WRITABLE]
+    %    brakeMode ('Brake'|'Coast'): Mode for braking. If 'Coast', the motor will (at 
+    %        tacholimit, if ~=0) coast to a stop. If 'Brake', the motor will stop immediately 
+    %        (at tacholimit, if ~=0) and hold the brake. [WRITABLE]
+    %    debug (bool): Debug turned on or off. In debug mode, everytime a command is passed to 
+    %        the sublayer ('communication layer'), there is feedback in the console about what 
+    %        command has been called. [WRITABLE]
+    %    isRunning (bool): True if motor is running. [READ-ONLY]
+    %    tachoCount (numeric): Current tacho count. [READ-ONLY]
+    %    currentSpeed (numeric): Current speed of motor. If speedRegulation=on this should equal power, 
+    %        otherwise it will probably be lower than that. [READ-ONLY]
+    %    type (DeviceType): Type of connected device if any. [READ-ONLY]
+    
     
     properties  % Standard properties to be set by user
-        %power -  [Writable] Power level of motor in percent (numeric in [-100, 100])
+        % power (numeric in [-100, 100]): Power level of motor in percent. [WRITABLE]
         power;
         
-        %speedRegulation  -  [Writable] Speed regulation turned on or off (0/1/off/on/'false'/'true')
-        % When turned on, motor will try to 'hold' its speed at given power level, whatever the
-        % load. In this mode, the highest possible speed depends on the load and mostly goes up
-        % to around 70-80 (at this point, the Brick internally input 100% power).
-        % When turned off, motor will constantly input the same power into the motor. The 
-        % resulting speed will be somewhat lower, depending on the load.
+        % speedRegulation (bool): Speed regulation turned on or off. When turned on, motor will 
+        %     try to 'hold' its speed at given power level, whatever the load. In this mode, the
+        %     highest possible speed depends on the load and mostly goes up to around 70-80 (at 
+        %     this point, the Brick internally input 100% power). When turned off, motor will 
+        %     constantly input the same power into the motor. The resulting speed will be 
+        %     somewhat lower, depending on the load. [WRITABLE]
         speedRegulation;
         
-        %smoothStart -  [Writable] Degrees/Time indicating how far/long the motor should smoothly start (numeric such that smoothStart+smoothStop < limitValue)
-        % Depending on limitMode, the input is interpreted either in degrees or milliseconds.
-        % The first [smoothStart]-milliseconds/degrees of limitValue the motor will slowly
-        % accelerate until reaching it's defined speed.
-        % See also MOTOR.LIMITMODE
+        % smoothStart (numeric s. t. smoothStart+smoothStop < limitValue): Degrees/Time 
+        %     indicating how far/long the motor should smoothly start. Depending on limitMode, 
+        %     the input is interpreted either in degrees or milliseconds. The first 
+        %     {smoothStart}-milliseconds/degrees of limitValue the motor will slowly accelerate 
+        %     until reaching its defined speed. [WRITABLE]
         smoothStart;
         
-        %smoothStop -  [Writable] Degrees/Time indicating how far/long the motor should smoothly stop (numeric such that smoothStart+smoothStop < limitValue) 
-        % Depending on limitMode, the input is interpreted either in degrees or milliseconds.
-        % The last [smoothStop]-milliseconds/degrees of limitValue the motor will slowly
-        % slow down until it has stopped.
-        % See also MOTOR.LIMITMODE
+        % smoothStop (numeric s. t. smoothStart+smoothStop < limitValue): Degrees/Time 
+        %     indicating how far/long the motor should smoothly stop. Depending on limitMode, the 
+        %     input is interpreted either in degrees or milliseconds. The last 
+        %     [smoothStop]-milliseconds/degrees of limitValue the motor will slowly slow down 
+        %     until it has stopped. [WRITABLE]
         smoothStop;
         
-        %limitValue -  [Writable] Degrees/Time indicating how far/long the motor should run (numeric>=0)
-        % Depending on limitMode, the input is interpreted either in degrees or milliseconds.
-        % See also MOTOR.LIMITMODE
+        % limitValue (numeric>=0): Degrees/Time indicating how far/long the motor should run.
+        %     Depending on limitMode, the input is interpreted either in degrees or 
+        %     milliseconds. [WRITABLE] 
+        % See also MOTOR.LIMITMODE 
         limitValue;  
         
-        %limitMode -  [Writable] Mode for motor limit ('Tacho'/'Time')
+        % limitMode ('Tacho'|'Time'): Mode for motor limit. [WRITABLE]
         % See also MOTOR.SMOOTHSTART, MOTOR.SMOOTHSTOP, MOTOR.LIMITMODE
         limitMode;
         
-        %brakeMode -  [Writable] Mode for braking ('Brake'/'Coast')
-        % If 'Coast', the motor will (at tacholimit, if ~=0) coast to a stop. If
-        % 'Brake', the motor will stop immediately (at tacholimit, if ~=0) and hold the brake.
+        % brakeMode ('Brake'|'Coast'): Mode for braking. If 'Coast', the motor will (at 
+        %     tacholimit, if ~=0) coast to a stop. If 'Brake', the motor will stop immediately 
+        %     (at tacholimit, if ~=0) and hold the brake. [WRITABLE]
         brakeMode;
         
-        %debug -  [Writable] Debug turned on or off (0/1/off/on/'false'/'true')
-        % In debug mode, everytime a command is passed to the sublayer ('communication layer'),
-        % there is feedback in the console about what command has been called
+        % debug (bool): Debug turned on or off. In debug mode, everytime a command is passed to 
+        %     the sublayer ('communication layer'), there is feedback in the console about what 
+        %     command has been called. [WRITABLE]
         debug;
     end
     
     properties (Dependent)  % Read-only parameters to be read directly from physical brick
-        %isRunning -  [Read-only] True if motor is running (i.e. speed > 0)
+        % isRunning (bool): True if motor is running. [READ-ONLY]
         isRunning; 
         
-        %tachoCount -  [Read-only] Current tacho count
+        % tachoCount (numeric): Current tacho count. [READ-ONLY]
         tachoCount;
         
-        %currentSpeed -  [Read-only] Current speed of motor
-        % If speedRegulation=on this should equal power, otherwise it will probably be lower
-        % than that.
+        % currentSpeed (numeric): Current speed of motor. If speedRegulation=on this should 
+        %     equal power, otherwise it will probably be lower than that. [READ-ONLY]
         % See also MOTOR.SPEEDREGULATION
         currentSpeed;
         
-        %type -  [Read-only] Type of connected device if any
-        % See also DEVICETYPE
+        % type (DeviceType): Type of connected device if any. [READ-ONLY]
         type;
     end
     
-    properties (Hidden, Access = 'private')  % Hidden properties for internal use only 
-        commInterface;  % Communication interface
+    properties (Hidden, Access = private)  % Hidden properties for internal use only 
+        % commInterface (CommunicationInterface): Commands are created and sent via the 
+        %     communication interface class.
+        commInterface; 
         
-        %% Hidden brick parameters
-        %port -  [Read-only] Motor port
-        % This is only the string representation of the motor port to work with.
-        % Internally, either MotorPort-, MotorBitfield- or MotorInput-member will be used.
+        % port (string): Motor port. This is only the string representation of the motor port 
+        %     to work with. Internally, either MotorPort-, MotorBitfield- or MotorInput-member 
+        %     will be used.
         port; 
         
-        % brakeMode is an actual parameter on the brick. To avoid inconsistencies with other
-        % modi and to prettify the output, a string representing it is saved. In order to avoid
-        % using string comparisons each time it is used, the corresponding value, that is going 
-        % to be sent, is saved (hidden from the user).
+        % brakeMode_ (BrakeMode): Byte value, corresponding to brakeMode, that will be sent to the brick
+        %     brakeMode is an actual parameter on the brick. To avoid inconsistencies with other
+        %     modi and to prettify the output, a string representing it is saved. In order to avoid
+        %     using string comparisons each time it is used, the corresponding value, that is going 
+        %     to be sent, is saved (hidden from the user).
+        % See also BRAKEMODE
         brakeMode_;
         
-        %% Flags
-        init = true;  % Indicates 'init-phase' (True as long as constructor is running)
-        connectedToBrick = false;  % Connection to physical Brick? 
-        state = MotorState();  % State consisting of several special Motor-flags
+        % init (bool): Indicates init-phase (i.e. constructor is running).
+        init = true;
+        
+        % connectedToBrick (bool): True if virtual brick is connected to physical brick.
+        connectedToBrick = false;
+        
+        % state (MotorState): State-struct consisting of several special Motor-flags
+        % See also MOTORSTATE
+        state = MotorState();
     end
     
-    properties (Hidden, Dependent, Access = 'private')  % Hidden, dependent properties for internal use only
-        portNo;  % Port number
-        portInput;  % Port number for input functions
+    properties (Hidden, Dependent, Access = private)  % Hidden, dependent properties for internal use only
+        % portNo (PortNo): Internal number of motor port.
+        %     * Port 'A': 0
+        %     * Port 'B': 1
+        %     * Port 'C': 2
+        %     * Port 'D': 3
+        % See also PORTNO
+        portNo;
         
-        isSynced;  % Is motor running in synced mode?
-        physicalMotorConnected;  % Physical motor connected to this port?
+        %portInput (PortInput): Internal number of motor port if accessed via input-opCodes 
+        % * Port 'A': 16
+        % * Port 'B': 17
+        % * Port 'C': 18
+        % * Port 'D': 19
+        % See also PORTINPUT
+        portInput;
         
-        internalTachoCount;  % Internal tachocount used for positioning the motor with tacholimit
+        %isSynced (bool): True if motor is running in synced mode
+        isSynced;
+        
+        %physicalMotorConnected (bool): True if physical motor is connected to this port
+        physicalMotorConnected;
+        
+        %internalTachoCount (numeric): internal tacho counter used for positioning the motor with a limit
+        internalTachoCount;
     end
     
     methods  % Standard methods
         %% Constructor
         function motor = Motor(varargin)
-            %Motor Sets properties of Motor-object and indicates end of init-phase when it's done.
+            %Motor Sets properties of Motor-object and indicates end of init-phase when it's done
             %
-            % Arguments
-            %  * varargin: see EV3::setProperties(ev3, varargin)
+            % Arguments:
+            %  * varargin: see setProperties(motor, varargin)
             %
             
             motor.setProperties(varargin{:});
@@ -125,9 +179,9 @@ classdef Motor < MaskedHandle & dynamicprops
         
         %% Brick functions
         function start(motor)
-            %start Starts the motor
+            % Starts the motor
             %
-            % Notes
+            % Notes:
             %  * Right now, alternatingly calling this function with and without tacho limit
             %    may lead to unexpected behaviour. For example, if you run the motor without
             %    a tacholimit for some time using Coast, then stop using Coast, and then try 
@@ -271,7 +325,7 @@ classdef Motor < MaskedHandle & dynamicprops
         end
         
         function stop(motor)
-            %stop Stops the motor
+            % Stops the motor
             
             if ~motor.connectedToBrick
                 error('Motor::stop: Motor-Object not connected to comm handle.');
@@ -293,7 +347,7 @@ classdef Motor < MaskedHandle & dynamicprops
         end
         
         function syncedStart(motor, syncMotor, varargin)
-            %syncedStart Starts this motor synchronized with another
+            % Starts this motor synchronized with another
             % This motor acts as a 'master', meaning that the synchronized control is done via
             % this one. When syncedStart is called, the master sets some of the slave's 
             % (syncMotor) properties to keep it consistent with the physical brick. So, for 
@@ -302,32 +356,33 @@ classdef Motor < MaskedHandle & dynamicprops
             % The following parameters will be affected on the slave: power, brakeMode,
             % limitValue, speedRegulation
             %
-            % Arguments
-            %  * syncMotor (the other motor object to sync with)
-            %  * 'turnRatio', numeric in [-200,200]
+            % Arguments:
+            %    syncMotor (Motor): the motor-object to sync with
+            %    turnRatio (numeric in [-200,200]): Description of turn_ratio (Excerpt of Firmware-comments, in c_output.c): 
+            %        "Turn ratio is how tight you turn and to what direction you turn. [OPTIONAL]
+            %            * 0 value is moving straight forward
+            %            * Negative values turn to the left
+            %            * Positive values turn to the right
+            %            * Value -100 stops the left motor
+            %            * Value +100 stops the right motor
+            %            * Values less than -100 makes the left motor run the opposite
+            %                  direction of the right motor (Spin)
+            %            * Values greater than +100 makes the right motor run the opposite
+            %                  direction of the left motor (Spin)" 
             %
-            % Notes
-            %  * Description of turn_ratio (Excerpt of Firmware-comments, in c_output.c): 
-            %    "Turn ratio is how tight you turn and to what direction you turn.
-            %     -> 0 value is moving straight forward
-            %     -> Negative values turn to the left
-            %     -> Positive values turn to the right
-            %     -> Value -100 stops the left motor
-            %     -> Value +100 stops the right motor
-            %     -> Values less than -100 makes the left motor run the opposite
-            %        direction of the right motor (Spin)
-            %     -> Values greater than +100 makes the right motor run the opposite
-            %        direction of the left motor (Spin)"
-            %  * This is right now a pretty 'heavy' function, as it tests if both motors are
-            %    connected AND aren't running, wasting four packets, so keep that in mind
+            % Notes:
+            %     * This is right now a pretty 'heavy' function, as it tests if both motors are
+            %       connected AND aren't running, wasting four packets, keep that in mind
+            %     * It is necessary to call syncedStop() and not stop() for stopping the motors 
+            %       (otherwise the sync-state cannot be exited correctly)
             %
-            % Example
-            %   b = EV3(); b.connect('usb');
-            %   m = b.motorA;
-            %   m.power = 50;
-            %   m.syncedStart(b.motorB);
-            %   % Do stuff
-            %   m.syncedStop();
+            % Example:
+            %     b = EV3(); b.connect('usb');
+            %     m = b.motorA;
+            %     m.power = 50;
+            %     m.syncedStart(b.motorB);
+            %     % Do stuff
+            %     m.syncedStop();
             %
             
             turnRatio = 0;
@@ -420,7 +475,7 @@ classdef Motor < MaskedHandle & dynamicprops
         end
         
         function syncedStop(motor)
-            %syncedStop Stops both motors previously started with syncedStart
+            % Stops both motors previously started with syncedStart.
             % Obviously, if motors have not been started synchronized, this throws an error.
             %
             % See also MOTOR.SYNCEDSTART
@@ -471,7 +526,7 @@ classdef Motor < MaskedHandle & dynamicprops
         end
         
         function waitFor(motor)
-            %waitFor Stops execution of program as long as motor is running
+            % Stops execution of program as long as motor is running
             %
             % Notes:
             %  * (OLD)This one's a bit tricky. The opCode OutputReady makes the brick stop sending
@@ -529,7 +584,7 @@ classdef Motor < MaskedHandle & dynamicprops
         end
 		
         function internalReset(motor)
-            % internalReset Resets internal tacho count
+            % Resets internal tacho count
             % Use this if motor behaves weird (i.e. not starting at all, or not correctly
             % running to limitValue)
             %
@@ -559,6 +614,8 @@ classdef Motor < MaskedHandle & dynamicprops
         end
         
         function resetTachoCount(motor)
+            % Resets tachocount
+            
             if ~motor.connectedToBrick
                 error('Motor::resetTachoCount: Motor-Object not connected to comm handle.');
             elseif ~motor.physicalMotorConnected
@@ -575,10 +632,10 @@ classdef Motor < MaskedHandle & dynamicprops
         end
         
         function setBrake(motor, brake)
-            %setBrake Apply or release brake of motor
+            % Apply or release brake of motor
             %
-            % Arguments
-            %  * brake (0/1/off/on/'false'/'true')
+            % Arguments:
+            %     brake (bool): If true, brake will be pulled
             
             if ~isBool(brake)
                 error('Motor::setBrake: Given parameter is not a valid bool.');
@@ -736,28 +793,29 @@ classdef Motor < MaskedHandle & dynamicprops
         end
         
         function setProperties(motor, varargin)
-            %setProperties Sets multiple Motor properties at once using MATLAB's inputParser.
+            % Sets multiple Motor properties at once using MATLAB's inputParser.
             %
-            % Arguments
-            %  * 'debug', bool
-            %  * 'smoothStart', numeric in [0, limitValue] 
-            %  * 'smoothStop', numeric in [0, limitValue] 
-            %  * 'speedRegulation', bool
-            %  * 'brakeMode', 'Coast'/'Brake'
-            %  * 'limitMode', 'Time'/'Tacho'
-            %  * 'limitValue', numeric > 0
-            %  * 'power', numeric in  [-100,100]
-            %  * 'batteryMode', 'Voltage'/'Percentage'
+            % Arguments:
+            %     debug (bool)
+            %     smoothStart (numeric in [0, limitValue]) 
+            %     smoothStop (numeric in [0, limitValue])
+            %     speedRegulation (bool)
+            %     brakeMode ('Coast'|'Brake')
+            %     limitMode ('Time'|'Tacho')
+            %     limitValue (numeric > 0)
+            %     power (numeric in [-100,100])
+            %     batteryMode ('Voltage'|'Percentage')
             %
-            % Example
-            %  b = EV3(); 
-            %  b.connect('bt', 'serPort', '/dev/rfcomm0');
-            %  b.motorA.setProperties('debug', 'on', 'power', 50, 'limitValue', 720, 'speedRegulation', 'on');
-            %  % Instead of: b.motorA.debug = 'on'; 
-            %  %             b.motorA.power = 50;
-            %  %             b.motorA.limitValue = 720;
-            %  %             b.motorA.speedRegulation = 'on';
+            % Example:
+            %     b = EV3(); 
+            %     b.connect('bt', 'serPort', '/dev/rfcomm0');
+            %     b.motorA.setProperties('debug', 'on', 'power', 50, 'limitValue', 720, 'speedRegulation', 'on');
+            %     % Instead of: b.motorA.debug = 'on'; 
+            %     %             b.motorA.power = 50;
+            %     %             b.motorA.limitValue = 720;
+            %     %             b.motorA.speedRegulation = 'on';
             %
+            
             p = inputParser();
             p.KeepUnmatched = 1;
             
@@ -894,17 +952,20 @@ classdef Motor < MaskedHandle & dynamicprops
         end
     end
     
-    methods (Access = 'private')  % Private functions that directly interact with commLayer
+    methods (Access = private)  % Private functions that directly interact with commLayer
         function success = setPower(motor, power)
             %setPower Sets given power value on the physical Brick.
             %
             % Notes:
-            %  * If motor is running with a limit, calling outputSpeed/outputPower, to
-            %    manually set the power on the physical brick, would stop the motor and adopt
-            %    the new power value on next start. To avoid this, the motor could be 'restarted'
-            %    with the new value instantly. However, this sometimes leads to unexpected behaviour.
-            %    Therefore, if motor is running with a limit, setPower aborts with a warning.
-            %
+            %     * If motor is running with a limit, calling outputSpeed/outputPower, to
+            %       manually set the power on the physical brick, would stop the motor and adopt
+            %       the new power value on next start. To avoid this, the motor could be 'restarted'
+            %       with the new value instantly. However, this sometimes leads to unexpected behaviour.
+            %       Therefore, if motor is running with a limit, setPower aborts with a warning.
+            % 
+            % Returns:
+            %     success (bool): if true, power has successfully been set
+            
             if ~motor.connectedToBrick || ~motor.physicalMotorConnected
 %                 error('Motor::getTachoCount: Motor-Object not connected to comm handle.');
                 success = false;
@@ -1012,9 +1073,9 @@ classdef Motor < MaskedHandle & dynamicprops
             %getMotorStatus Returns whether motor is busy or not. 
             %
             % Notes:
-            %  * This *mostly* works. Sometimes this falsely returns 0 if isRunning() gets 
-            %    called immediately after starting the motor.
-            %  * Busy is set to true if motor is running with tacholimit or synced
+            %     * This *mostly* works. Sometimes this falsely returns 0 if isRunning() gets 
+            %       called immediately after starting the motor.
+            %     * Busy is set to true if motor is running with tacholimit or synced
             %
             
             if ~motor.connectedToBrick
@@ -1077,7 +1138,7 @@ classdef Motor < MaskedHandle & dynamicprops
         end
     end
     
-    methods (Access = 'private', Hidden = true)
+    methods (Access = private, Hidden = true)
         function saveState(motor)
             %saveState Saves current motor state in dynamic property
             
@@ -1118,22 +1179,18 @@ classdef Motor < MaskedHandle & dynamicprops
         end
     end
     
-    methods (Access = {?EV3})
+    methods (Access = ?EV3)
         function connect(motor,commInterface)
             %connect Connects Motor-object to physical brick.
             %
             % Notes:
-            %  * This method actually only saves a handle to a Brick-object which has been
-            %    created beforehand (probably by an EV3-object).
-            %
-            % Arguments
-            %  * commInterface: instance of Brick-class
+            %     * This method is automatically called by EV3.connect()
+            %     * This method actually only saves a handle to a Brick-object which has been
+            %       created beforehand (probably by an EV3-object). 
             %
-            % Examples (for use without EV3-class)
-            %  m = Motor();
-            %  brickInterface = Brick('usb');
-            %  m.connect(brickInterface);
-            %  % do stuff
+            % Arguments:
+            %     commInterface (CommunicationInterface): Handle to a communication interface
+            %         device
             %
             
             if motor.connectedToBrick
@@ -1162,23 +1219,17 @@ classdef Motor < MaskedHandle & dynamicprops
             %disconnect Disconnects Motor-object from physical brick.
             %
             % Notes:
-            %  * As with Motor::connect, this method actually only sets the property, in which 
-            %    the handle to the Brick-class was stored, to 0.
+            %     * This method is automatically called by EV3.disconnect()
+            %     * This method actually only sets the property, in which 
+            %       the handle to the CommInterface-class was stored, to 0. 
             %
-            % Examples (for use without EV3-class)
-            %  m = Motor();
-            %  brickInterface = Brick('usb');
-            %  m.connect(brickInterface);
-            %  % do stuff
-            %  m.disconnect();
-            %  brickInterface.delete(); % Actual disconnecting!!!
-            %   
-            
-            motor.commInterface = 0; % Note: actual deleting is done in EV3::disconnect.
+            
+            motor.commInterface = 0;
             motor.connectedToBrick = false;
         end
         
         function resetPhysicalMotor(motor)
+            %
             if ~motor.connectedToBrick || ~motor.physicalMotorConnected
                 return; 
             end
diff --git a/source/Sensor.m b/source/Sensor.m
index d275d507371c37bb35570b7031a8641fef6a9e44..59132ecb06d4f590962e1c0a2b5dc48fd64759ff 100755
--- a/source/Sensor.m
+++ b/source/Sensor.m
@@ -1,10 +1,57 @@
 classdef Sensor < MaskedHandle
-    % Sensor High-level class to work with sensors.
+    % High-level class to work with sensors.
+    % 
+    % The Sensor-class facilitates the communication with sensors. This mainly consists of 
+    % reading the sensor's type and current value in a specified mode.
     %
-    % Signature
-    %  Author: Tim Stadtmann
-    %  Date: 2016/05/20
-    %  Updated: 2016/08/15
+    % Notes:
+    %     * You don't need to create instances of this class. The EV3-class automatically creates
+    %       instances for each sensor port, and you can work with them via the EV3-object. 
+    %     * The Sensor-class represents sensor ports, not individual sensors!
+    %
+    % Attributes:
+    %    mode (DeviceMode.{Type}): Sensor mode in which the value will be read. By default, 
+    %        mode is set to DeviceMode.Default.Undefined. Once a physical sensor is connected
+    %        to the port *and* the physical Brick is connected to the EV3-object, the allowed 
+    %        mode and the default mode for a Sensor-object are the following (depending on the
+    %        sensor type): [WRITABLE]
+    %
+    %        * Touch-Sensor: 
+    %            * DeviceMode.Touch.Pushed [Default]
+    %            * DeviceMode.Touch.Bumps
+    %        * Ultrasonic-Sensor: 
+    %            * DeviceMode.UltraSonic.DistCM [Default]
+    %            * DeviceMode.UltraSonic.DistIn
+    %            * DeviceMode.UltraSonic.Listen
+    %        * Color-Sensor: 
+    %            * DeviceMode.Color.Reflect [Default]
+    %            * DeviceMode.Color.Ambient
+    %            * DeviceMode.Color.Col
+    %        * Gyro-Sensor: 
+    %            * DeviceMode.Gyro.Angular [Default]
+    %            * DeviceMode.Gyro.Rate
+    %    debug (bool): Debug turned on or off. In debug mode, everytime a command is passed to 
+    %        the sublayer ('communication layer'), there is feedback in the console about what 
+    %        command has been called. [WRITABLE]
+    %    value (numeric): Value read from hysical sensor. What the value represents depends on
+    %        sensor.mode.
+    %    type (DeviceType): Type of physical sensor connected to the port. Possible types are: [READ-ONLY]
+    %        * DeviceType.NXTTouch
+    %        * DeviceType.NXTLight
+    %        * DeviceType.NXTSound
+    %        * DeviceType.NXTColor
+    %        * DeviceType.NXTUltraSonic
+    %        * DeviceType.NXTTemperature
+    %        * DeviceType.LargeMotor
+    %        * DeviceType.MediumMotor
+    %        * DeviceType.Touch 
+    %        * DeviceType.Color 
+    %        * DeviceType.UltraSonic 
+    %        * DeviceType.Gyro 
+    %        * DeviceType.InfraRed 
+    %        * DeviceType.Unknown
+    %        * DeviceType.None 
+    %        * DeviceType.Error
     
     properties  % Standard properties to be set by user
         %mode -  [Writable] Sensor mode in which the value will be read (DeviceMode.[...])
@@ -42,7 +89,7 @@ classdef Sensor < MaskedHandle
         type; 
     end
 
-    properties (Hidden, Access = 'private')  % Hidden properties for internal use only 
+    properties (Hidden, Access = private)  % Hidden properties for internal use only 
         commInterface = 0;  % Communication interface
         
         %port -  [Read-only] Sensor port ('1'/'2'/'3'/'4')
@@ -56,7 +103,7 @@ classdef Sensor < MaskedHandle
         init = true;  % Indicates 'init-phase' (True as long as constructor is running)
     end   
     
-    properties (Hidden, Dependent, Access = 'private')
+    properties (Hidden, Dependent, Access = private)
         physicalSensorConnected;  % Physical sensor connected to this port?
     end
     
@@ -70,6 +117,7 @@ classdef Sensor < MaskedHandle
         %% Brick functions
         function reset(sensor)
             %reset Resets value on sensor
+            %
 			% Note: This clears ALL the sensors right now, no other Op-Code available... :(
             if ~sensor.connectedToBrick
                 error('Sensor::reset: Sensor-Object not connected to comm handle.');
@@ -139,16 +187,16 @@ classdef Sensor < MaskedHandle
         function setProperties(sensor, varargin)
             %setProperties Sets multiple Sensor properties at once using MATLAB's inputParser.
             %
-            % Arguments
-            %  * 'debug', 0/1/'on'/'off'/'true'/'false'
-            %  * 'mode', DeviceMode.[...]
+            % Arguments:
+            %	 * 'debug', 0/1/'on'/'off'/'true'/'false'
+            %    * 'mode', DeviceMode.[...]
             %
-            % Example
-            %  b = EV3(); 
-            %  b.connect('bt', 'serPort', '/dev/rfcomm0');
-            %  b.sensor1.setProperties('debug', 'on', 'mode', DeviceMode.Color.Ambient);
-            %  % Instead of: b.sensor1.debug = 'on'; 
-            %  %             b.sensor1.mode = DeviceMode.Color.Ambient;
+            % Example:
+            %      b = EV3(); 
+            %      b.connect('bt', 'serPort', '/dev/rfcomm0');
+            %      b.sensor1.setProperties('debug', 'on', 'mode', DeviceMode.Color.Ambient);
+            %      % Instead of: b.sensor1.debug = 'on'; 
+            %      %             b.sensor1.mode = DeviceMode.Color.Ambient;
             %
             
             p = inputParser();
@@ -221,7 +269,7 @@ classdef Sensor < MaskedHandle
         end
     end
     
-    methods (Access = 'private')  % Private brick functions that are wrapped by dependent params
+    methods (Access = private)  % Private brick functions that are wrapped by dependent params
         function setMode(sensor, mode)
             if ~sensor.connectedToBrick
                 error('Sensor::getTachoCount: Sensor-Object not connected to comm handle.');
@@ -242,7 +290,7 @@ classdef Sensor < MaskedHandle
         function val = getValue(sensor, varargin)
             %getValue Reads value from sensor
             % 
-            % Notes
+            % Notes:
             %  * After changing the mode, sensors initially always send an invalid value. In
             %    this case, the inputReadSI-opCode is sent again to get the correct value.
             %
@@ -324,7 +372,7 @@ classdef Sensor < MaskedHandle
         
     end
     
-    methods (Access = {?EV3})
+    methods (Access = ?EV3)
         function connect(sensor,commInterface)
             %connect Connects Sensor-object to physical brick
             
@@ -368,4 +416,3 @@ classdef Sensor < MaskedHandle
         end
     end
 end
-
diff --git a/source/bitfield2input.m b/source/private/bitfield2input.m
similarity index 100%
rename from source/bitfield2input.m
rename to source/private/bitfield2input.m
diff --git a/source/bitfield2port.m b/source/private/bitfield2port.m
similarity index 100%
rename from source/bitfield2port.m
rename to source/private/bitfield2port.m
diff --git a/source/bool2str.m b/source/private/bool2str.m
similarity index 100%
rename from source/bool2str.m
rename to source/private/bool2str.m
diff --git a/source/brake2str.m b/source/private/brake2str.m
similarity index 100%
rename from source/brake2str.m
rename to source/private/brake2str.m
diff --git a/source/input2bitfield.m b/source/private/input2bitfield.m
similarity index 100%
rename from source/input2bitfield.m
rename to source/private/input2bitfield.m
diff --git a/source/input2port.m b/source/private/input2port.m
similarity index 100%
rename from source/input2port.m
rename to source/private/input2port.m
diff --git a/source/isBool.m b/source/private/isBool.m
similarity index 100%
rename from source/isBool.m
rename to source/private/isBool.m
diff --git a/source/isCommInterfaceValid.m b/source/private/isCommInterfaceValid.m
similarity index 100%
rename from source/isCommInterfaceValid.m
rename to source/private/isCommInterfaceValid.m
diff --git a/source/isDeviceValid.m b/source/private/isDeviceValid.m
similarity index 100%
rename from source/isDeviceValid.m
rename to source/private/isDeviceValid.m
diff --git a/source/isModeValid.m b/source/private/isModeValid.m
similarity index 100%
rename from source/isModeValid.m
rename to source/private/isModeValid.m
diff --git a/source/isPortEnumValid.m b/source/private/isPortEnumValid.m
similarity index 100%
rename from source/isPortEnumValid.m
rename to source/private/isPortEnumValid.m
diff --git a/source/isPortStrValid.m b/source/private/isPortStrValid.m
similarity index 100%
rename from source/isPortStrValid.m
rename to source/private/isPortStrValid.m
diff --git a/source/isSyncedBitfield.m b/source/private/isSyncedBitfield.m
similarity index 100%
rename from source/isSyncedBitfield.m
rename to source/private/isSyncedBitfield.m
diff --git a/source/port2bitfield.m b/source/private/port2bitfield.m
similarity index 100%
rename from source/port2bitfield.m
rename to source/private/port2bitfield.m
diff --git a/source/port2input.m b/source/private/port2input.m
similarity index 100%
rename from source/port2input.m
rename to source/private/port2input.m
diff --git a/source/port2str.m b/source/private/port2str.m
similarity index 100%
rename from source/port2str.m
rename to source/private/port2str.m
diff --git a/source/str2PortParam.m b/source/private/str2PortParam.m
similarity index 100%
rename from source/str2PortParam.m
rename to source/private/str2PortParam.m
diff --git a/source/str2bool.m b/source/private/str2bool.m
similarity index 100%
rename from source/str2bool.m
rename to source/private/str2bool.m
diff --git a/source/str2brake.m b/source/private/str2brake.m
similarity index 100%
rename from source/str2brake.m
rename to source/private/str2brake.m
diff --git a/tools/setupBackground.sh b/tools/setupBackground.sh
new file mode 100755
index 0000000000000000000000000000000000000000..613576ff8e6d8ed0800eefbdb3215c5cb0e1513f
--- /dev/null
+++ b/tools/setupBackground.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# something else is also changing these settings at startup, wait for a short moment, then put our settings
+sleep 5s
+gsettings set org.gnome.desktop.background picture-options 'stretched'
+