diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md
new file mode 100644
index 0000000..847d886
--- /dev/null
+++ b/CONTRIBUTION.md
@@ -0,0 +1,56 @@
+Contribution
+============
+
+- [Code guidelines](#code-guidelines)
+- [Feature request](#feature-request)
+- [Development](#development)
+
+[cpp core guideline]: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
+
+[google python style guide]: https://github.com/google/styleguide/blob/gh-pages/pyguide.md
+
+[clean code]: https://medium.com/mindorks/how-to-write-clean-code-lessons-learnt-from-the-clean-code-robert-c-martin-9ffc7aef870c
+
+[meaningful variable names]: https://medium.com/coding-skills/clean-code-101-meaningful-names-and-functions-bf450456d90c
+
+[commit message template]: .github/.gitmessage_template
+
+## Code guidelines
+
+* Follow the C++ Core Guidelines [cpp core guideline]
+* Try to follow PEP guidelines and [google python style guide]
+* Try to follow the SOLID principles of [clean code]
+* Use [meaningful variable names]
+* For most important commits use [commit message template]
+
+## Feature request
+
+1. Open issue with full feature description
+
+2. Wait for response from core team
+
+## Development
+
+1. Open an issue
+
+2. Create new branch and code there
+
+3. Commit your work using [commit message template]
+
+4. Be sure that you are not behind the master, if so, rebase your branch
+
+5. Make a pull request to master branch with meaningful description and sign the CLA which is part of the PR checks
+
+6. Wait for review
+
+7. Apply / argue the code review comments
+
+8. Clean up the comment history if needed
+
+9. Push the changes again
+
+10. Repeat steps 4-10 until convergence
+
+Side note: **DO NOT USE** `git merge master` or `git pull master` to align your
+branch with master, use `git rebase master` for it!
+