diff --git a/documentation/18.11/_images/Definition_icon_2.png b/documentation/18.11/_images/Definition_icon_2.png new file mode 100644 index 00000000..7f7fadf8 Binary files /dev/null and b/documentation/18.11/_images/Definition_icon_2.png differ diff --git a/documentation/18.11/_images/Definition_icon_2.png.data b/documentation/18.11/_images/Definition_icon_2.png.data new file mode 100644 index 00000000..d9e07682 --- /dev/null +++ b/documentation/18.11/_images/Definition_icon_2.png.data @@ -0,0 +1,3 @@ +title=LogoDefinition +author=halw +path=content/logodefinition diff --git a/documentation/18.11/_images/LogoBeta.png b/documentation/18.11/_images/LogoBeta.png new file mode 100644 index 00000000..057d5bd1 Binary files /dev/null and b/documentation/18.11/_images/LogoBeta.png differ diff --git a/documentation/18.11/_images/LogoBeta.png.data b/documentation/18.11/_images/LogoBeta.png.data new file mode 100644 index 00000000..98777939 --- /dev/null +++ b/documentation/18.11/_images/LogoBeta.png.data @@ -0,0 +1,3 @@ +title=LogoBeta +author=halw +path=content/logobeta diff --git a/documentation/18.11/_images/LogoUpdateNeeded.png b/documentation/18.11/_images/LogoUpdateNeeded.png new file mode 100644 index 00000000..e9c8a89d Binary files /dev/null and b/documentation/18.11/_images/LogoUpdateNeeded.png differ diff --git a/documentation/18.11/_images/LogoUpdateNeeded.png.data b/documentation/18.11/_images/LogoUpdateNeeded.png.data new file mode 100644 index 00000000..6d1b689f --- /dev/null +++ b/documentation/18.11/_images/LogoUpdateNeeded.png.data @@ -0,0 +1,3 @@ +title=LogoUpdateNeeded +author=halw +path=content/logoupdateneeded diff --git a/documentation/18.11/_images/Review_icon_1.png b/documentation/18.11/_images/Review_icon_1.png new file mode 100644 index 00000000..b6ea96b4 Binary files /dev/null and b/documentation/18.11/_images/Review_icon_1.png differ diff --git a/documentation/18.11/_images/Review_icon_1.png.data b/documentation/18.11/_images/Review_icon_1.png.data new file mode 100644 index 00000000..4b06db70 --- /dev/null +++ b/documentation/18.11/_images/Review_icon_1.png.data @@ -0,0 +1,3 @@ +title=LogoReviewRequested +author=halw +path=content/logoreviewrequested diff --git a/documentation/18.11/_images/Rule_icon_4_2.png b/documentation/18.11/_images/Rule_icon_4_2.png new file mode 100644 index 00000000..e0402369 Binary files /dev/null and b/documentation/18.11/_images/Rule_icon_4_2.png differ diff --git a/documentation/18.11/_images/Rule_icon_4_2.png.data b/documentation/18.11/_images/Rule_icon_4_2.png.data new file mode 100644 index 00000000..89e76614 --- /dev/null +++ b/documentation/18.11/_images/Rule_icon_4_2.png.data @@ -0,0 +1,3 @@ +title=LogoRule +author=halw +path=content/logorule diff --git a/documentation/18.11/_images/tpl_Construction.png b/documentation/18.11/_images/tpl_Construction.png new file mode 100644 index 00000000..a3701d81 Binary files /dev/null and b/documentation/18.11/_images/tpl_Construction.png differ diff --git a/documentation/18.11/_images/tpl_Construction.png.data b/documentation/18.11/_images/tpl_Construction.png.data new file mode 100644 index 00000000..2c501459 --- /dev/null +++ b/documentation/18.11/_images/tpl_Construction.png.data @@ -0,0 +1,3 @@ +title=LogoConstruction +author=admin +path=content/logoconstruction diff --git a/documentation/18.11/_images/tpl_Information.png b/documentation/18.11/_images/tpl_Information.png new file mode 100644 index 00000000..86c67e02 Binary files /dev/null and b/documentation/18.11/_images/tpl_Information.png differ diff --git a/documentation/18.11/_images/tpl_Information.png.data b/documentation/18.11/_images/tpl_Information.png.data new file mode 100644 index 00000000..8e74a8f3 --- /dev/null +++ b/documentation/18.11/_images/tpl_Information.png.data @@ -0,0 +1,3 @@ +title=LogoInformation +author=admin +path=content/logoinformation diff --git a/documentation/18.11/_images/tpl_Recommended.png b/documentation/18.11/_images/tpl_Recommended.png new file mode 100644 index 00000000..a52b8d5b Binary files /dev/null and b/documentation/18.11/_images/tpl_Recommended.png differ diff --git a/documentation/18.11/_images/tpl_Recommended.png.data b/documentation/18.11/_images/tpl_Recommended.png.data new file mode 100644 index 00000000..78312ab9 --- /dev/null +++ b/documentation/18.11/_images/tpl_Recommended.png.data @@ -0,0 +1,3 @@ +title=LogoRecommended +author=admin +path=content/logorecommended diff --git a/documentation/18.11/_images/tpl_Warning.png b/documentation/18.11/_images/tpl_Warning.png new file mode 100644 index 00000000..67737269 Binary files /dev/null and b/documentation/18.11/_images/tpl_Warning.png differ diff --git a/documentation/18.11/_images/tpl_Warning.png.data b/documentation/18.11/_images/tpl_Warning.png.data new file mode 100644 index 00000000..2c804c09 --- /dev/null +++ b/documentation/18.11/_images/tpl_Warning.png.data @@ -0,0 +1,3 @@ +title=LogoWarning +author=admin +path=content/logowarning diff --git a/documentation/18.11/_others/community/index.wiki b/documentation/18.11/_others/community/index.wiki new file mode 100644 index 00000000..777cb81f --- /dev/null +++ b/documentation/18.11/_others/community/index.wiki @@ -0,0 +1,116 @@ +[[Property:title|Community]] +[[Property:description|Members of the Eiffel community can contribute to this documentation through this book]] +[[Property:weight|15]] +[[Property:uuid|75c75712-7c3e-2757-51b7-77b404471e2e]] +=You can become a contributor!= + +Eiffel is a community. Members of the Eiffel community can contribute to this documentation through this book. + +EiffelStudio documentation is available in a convenient Wiki format. This makes it possible to improve the documentation continuously and make sure it is always up to date. + +Community input is welcome. + +==Using the Comments pages== + +Each documentation page has an associated '''Comments''' page. Any viewer can add comments to a Comments page. These comments are periodically reviewed and appropriate content is "published," that is, made visible to the community. + +===Guidelines for Comments pages=== + +#The '''Comments''' pages are intended to be used to record and communicate issues concerning the documentation. Use Comments pages to post comments which report problems with the documentation or which suggest improvements to the documentation. +# '''Any material you add to this site becomes the property of Eiffel Software, and may be shared with the community.''' +# Comments pages should ''not'' be used for product support questions, product feature requests, or bug reports. ''Comments of this sort will be deleted.'' For help with products join the [http://groups.eiffel.com Eiffel Software User Group] and use the resources at the [http://community.eiffel.com Eiffel Community site]. + +===Comment lifecycle=== + +Although the procedure for how editors deal with comments is flexible, some general guidelines can be given: + +# For comments requesting action (e. g., fix a problem, add more information): +## For those actions which can be accomplished immediately: +### The comment will not be published. +### The requested action will be fixed. +### The original comment's subject line will be prepended with "FIXED". +## For those actions which cannot be accomplished quickly or require special handling: +### The comment will be published +### A response to the comment will be made via "reply", and +#### The original comment's subject line will be prepended with: +##### FIXED, if and when the request can be satisfied. +##### ANALYZED, otherwise, plus explanation of delaying or not acting on request. +## For actions affecting docs.eiffel.com plus the Eiffel distribution: +### Submit a problem report requesting feedback when problem is fixed so that docs.eiffel.com can be updated in kind. +# For comments not requesting action, but adding relevant information related to the page: +## The comment will be published. +## If appropriate: +### The content of the comment will be integrated into the page. +### The original comment's subject line prepended with FIXED. +# Periodically, an audit will remove older comments marked as FIXED and ANALYZED. + +==Contributors and Editors== + +If you are interested in a more active role in improving and developing EiffelStudio documentation, you can become: + +* A contributor: authorized to edit existing pages to any book, and to add pages to the "Community" book. +**"Community" book pages can be added to other books by an editor. + +* An editor: authorized to modify and add pages in any book. + +To become a contributor, you should be proficient in Eiffel technology and have good written English skills. To become an editor, you should already be a contributor and have contributed significant improvements or additions to the documentation. + +If you are interested in becoming a contributor, you can [[path:user/register|register]] for an account, and then please [[path:contact|contact us]] with a short description of your Eiffel experience and any other relevant background. + +===Guidelines for contributors=== + +# '''Entering log messages:''' When you change pages in the documentation, it can help sometimes if you can provide an explanation of your intent in the '''Log message''' box on the '''Edit''' page. This can eliminate confusion about why things have been changed. Of course, it is not necessary to provide a log message for every change. For fixing typographical errors or other simple changes, it generally would not be necessary, but putting a single lowercase '''"m"''' in the '''Log message''' field will convey the message that this was a minor update. If you are evolving new pages or a complex set of related changes to one or more pages, it should suffice to enter a single log message at the beginning of the series of edits. Use common sense here. +#* In cases in which a change is directly related to an external document or policy, it may be helpful to mention the impetus in the log message. For example, documentation changes made to satisfy Eiffel Software problem reports should reference the report in the log message. +# '''Renaming pages or moving pages to Trash:''' Before you rename a page or move it to the Trash, you should use the '''References''' tab to make certain that there are no current references to the page. If there are, make sure you resolve those references before renaming or moving the page. +# '''Replacing pages:''' If you need to replace a page completely, do so by replacing the '''content''' of the existing page, rather than moving the page to the Trash and creating a new page in its place. Replacing the content will leave the original page (and its UUID) in place, but with the new content. UUID's are used by the [[Eiffel Information System]] (EIS) to link EiffelStudio to documentation pages, and will be broken if the original page were to be deleted. +# '''Using templates:''' +## There are several "templates" available for use within the text of documentation pages. For example, "Note", "SeeAlso", "Rule", "Definition", "Caution". You can click on "List templates" in the left margin to see the list of available templates. +## While developing new pages or make significant changes to existing pages you may want to mark the tops of these pages temporarily with certain templates during the development process. The "top-of-the-page" templates most useful during page maintenance are Beta, ReviewRequested, UnderConstruction, and UpdateNeeded. The meanings of these are described below. + +==="Top-of-the-page" Documentation template meanings=== + +====Beta==== + +Looks like this: + +{{Beta}} + +Means this: + +:''Use this page with caution. This page is currently under development as a new page or a replacement for a previously existing page. It may contain information which describes capabilities not yet implemented. Avoid linking to this page. When this page comes out of beta, it is likely that the name and/or UUID of this page will change.'' + + +====ReviewRequested==== + +Looks like this: + +{{ReviewRequested}} + +Means this: + +:''The material on this page needs to be reviewed for completeness and accuracy. If you have knowledge of this material, please review this page. If you are a [[Community|contributor]], feel free to make any appropriate additions and/or corrections, then remove this template. If not, you can note improvements on the [[Community#Using the Comments pages|comments]] page.'' + + +====UnderConstruction==== + +Looks like this: + +{{UnderConstruction}} + +Means this: + +:''Use this page with caution. This page is currently under development. It is likely that the information on this page is still incomplete. '' + + +====UpdateNeeded==== + +Looks like this: + +{{UpdateNeeded}} + +Means this: + +:''Use this page with caution. This page has been identified as needing update. If you are a [[Community|contributor]], you can help by updating this page so that the information on it is current.'' + + + diff --git a/documentation/18.11/_others/draft/index.wiki b/documentation/18.11/_others/draft/index.wiki new file mode 100644 index 00000000..761f5714 --- /dev/null +++ b/documentation/18.11/_others/draft/index.wiki @@ -0,0 +1,5 @@ +[[Property:title|Draft]] +[[Property:weight|99]] +[[Property:uuid|c277e707-67a0-14a2-099e-5b861f2480ad]] + + diff --git a/documentation/18.11/_others/draft/multiple-inheritance.wiki b/documentation/18.11/_others/draft/multiple-inheritance.wiki new file mode 100644 index 00000000..bd7ff4a8 --- /dev/null +++ b/documentation/18.11/_others/draft/multiple-inheritance.wiki @@ -0,0 +1,49 @@ +[[Property:title|Multiple inheritance]] +[[Property:weight|0]] +[[Property:uuid|7f54afce-fd1d-fba7-7a55-f74604ea9846]] +
+ scan_and_print
+ -- Scan a page and print it.
+ do
+ scan -- Leaves result of scan in `scanned'
+ print (scanned)
+ end
+
+
+
+
+
+
+
+
+
+
diff --git a/documentation/18.11/_others/draft/test-page.wiki b/documentation/18.11/_others/draft/test-page.wiki
new file mode 100644
index 00000000..a3f103ff
--- /dev/null
+++ b/documentation/18.11/_others/draft/test-page.wiki
@@ -0,0 +1,5 @@
+[[Property:title|Test page]]
+[[Property:weight|0]]
+[[Property:uuid|6dc09e0f-b713-8c5b-799f-36a60264e8f8]]
+Test page for Book "Draft"
+
diff --git a/documentation/18.11/_others/guide/_images/static_documentation_page_0.png b/documentation/18.11/_others/guide/_images/static_documentation_page_0.png
new file mode 100644
index 00000000..e3f9218e
Binary files /dev/null and b/documentation/18.11/_others/guide/_images/static_documentation_page_0.png differ
diff --git a/documentation/18.11/_others/guide/_images/static_documentation_page_0.png.data b/documentation/18.11/_others/guide/_images/static_documentation_page_0.png.data
new file mode 100644
index 00000000..1a8c9a7b
--- /dev/null
+++ b/documentation/18.11/_others/guide/_images/static_documentation_page_0.png.data
@@ -0,0 +1,3 @@
+title=static documentation page
+author=halw
+path=content/static-documentation-page
diff --git a/documentation/18.11/_others/guide/index.wiki b/documentation/18.11/_others/guide/index.wiki
new file mode 100644
index 00000000..30c5a797
--- /dev/null
+++ b/documentation/18.11/_others/guide/index.wiki
@@ -0,0 +1,186 @@
+[[Property:title|Guide]]
+[[Property:description|Central repository of information about Eiffel and the products and technologies of Eiffel Software]]
+[[Property:link_title|Information Guide]]
+[[Property:weight|10]]
+[[Property:uuid|68b37685-64e9-f564-9258-29e709a55f44]]
+'''Guide to Eiffel Information'''
+
+These pages are the central repository of information about Eiffel and the products and technologies of Eiffel Software. They cover the online documentation, but also link to many valuable resources outside the documentation set.
+
+If you are interested in [[Learning Eiffel|learning Eiffel, there is a list of resources]] dedicated to that purpose.
+
+The online documentation is organized into virtual books. Each book covers an important aspect of the world of Eiffel. For cases in which it is not always possible to use the online version of the documentation, all or selected parts of the documentation set can be [[Offline use of the Eiffel documentation|downloaded for offline use]].
+
+* [[Guide]] -- Guide to Eiffel Information
+* [[EiffelStudio]] -- The EiffelStudio Interactive Development Environment
+* [[Solutions]] -- Eiffel Solutions, Technologies, and Class Libraries
+* [[Platform specifics]] -- Specific support for particular platforms, e.g., Microsoft Windows
+* [[Method|Method and Language]] -- The Eiffel Method and Language
+* [[Why Eiffel?]] -- Why Eiffel?
+* [[Papers]] -- Technical and position papers relating to Eiffel and the engineering of high quality software
+* [[Examples]] -- Contributor supported examples of Eiffel solutions to common programming problems
+* [[Community]] -- Community Contributions
+
+Sources of information on Eiffel include:
+
+==Books in the Eiffel Documentation==
+----
+
+===[[Guide]] -- Guide to Eiffel Information===
+
+:You are reading this book now.
+
+===[[EiffelStudio]] -- The EiffelStudio Interactive Development Environment===
+
+:Information about installing and using EiffelStudio
+
+===[[Solutions]] -- Eiffel Solutions, Technologies, and Class Libraries===
+
+:Technologies available with Eiffel provide solutions to many ordinary development needs ... and some extraordinary needs too. This book addresses these requirements and the Eiffel technologies that satisfy them.
+
+===[[Platform specifics]] -- Support for particular operating systems===
+
+:Although most Eiffel technology is completely platform-independent, Eiffel also provides important platform-specific solutions, described in this book.
+
+===[[Method|Method and Language]] -- The Eiffel Method and Language===
+
+:Materials promoting the understanding of the Eiffel software development method and the Eiffel programming language.
+
+===[[Why Eiffel?]] -- Why Eiffel? ===
+
+:A summary of the arguments for using Eiffel.
+
+===[[Papers]] -- Technical and position papers relating to Eiffel===
+
+:This book is a place for white papers which provide background, foundation, or supplemental information about the the Eiffel method and language as well as the goal of engineering high quality software.
+
+===[[Examples]] -- Contributor supported examples of Eiffel solutions to common programming problems===
+
+:Let's build a set of examples that can be shared on popular WWW program chrestomathies.
+
+===[[Community]] -- You can contribute to the documentation!===
+
+:EiffelStudio documentation is available in a convenient Wiki format. This makes it possible to improve the documentation continuously and make sure it is always up to date.
+
+
+
+'''Community input''' is welcome. If you are interested in improving and developing EiffelStudio documentation, you can become a ''contributor'' or ''editor'':
+
+* Contributors can edit existing pages in any book and add pages to Community Contributions books.
+
+* Editors can modify and add pages in any book (including adding Community Contribution pages to an existing book).
+
+To become a contributor, you should be proficient in Eiffel technology and have good written English skills. To become an editor, you should already have made significant improvements or additions as a contributor.
+
+If you are interested in becoming a contributor, please send an email to info@eiffel.com with a short description of your Eiffel experience and any other relevant background. We look forward to your contributions!
+
+
+
+----
+
+==Other sources of information on Eiffel==
+
+----
+
+
+===The [http://eiffel.com Eiffel.com] website===
+
+Eiffel Software's website [http://eiffel.com Eiffel.com] contains an enormous amount of information about Eiffel. There are product descriptions, special pages for developers and their managers, case studies and testimonials, the latest Eiffel news, and much more.
+
+
+----
+
+===[http://eiffel.com/developers/presentations/ Web Presentations] on Eiffel.com===
+
+Learn quickly about Eiffel and the things that help make it special, like Design by Contract and EiffelStudio. Learn how Eiffel fits in with and compares to other popular technologies. All this and more is available on the [http://eiffel.com/developers/presentations/ presentations page] on Eiffel.com.
+
+
+----
+
+===[http://eiffel.com/developers/learning_maps/ Learning Maps] on Eiffel.com===
+
+Get an in-depth view of topics by navigating the [http://eiffel.com/developers/learning_maps/ Eiffel Learning Maps]. Learning maps represent knowledge as a network of interrelated concepts. Attached to the concepts you may find links to additional resources. These resources can be just about anything. You'll find plain text files, web pages, screen shots, and even Eiffel Learnlets. Learnlets are small units of learning in web presentation form that are designed to take no more than 30 minutes to view ... just right for your lunch break.
+
+
+----
+
+===The [http://www.eiffelroom.com/ EiffelRoom] Website===
+
+[http://www.eiffelroom.com/ EiffelRoom] is an Eiffel community website on which Eiffel developers from across the globe come together and share their experiences ... and their products. You'll find how-to articles, tips and tricks, example code, whole libraries of EIffel classes, and specialized products. It is easy to contribute to EiffelRoom and start giving back to the community.
+
+
+----
+
+===The Eiffel Software User Group===
+
+The Eiffel Software Users' Group is a focus group for those who use the products of Eiffel Software. Its primary communication vehicle is a [http://groups.eiffel.com/ collaborative discussion group]. The group mailing list is monitored by Eiffel Software developers and many highly experienced Eiffel programmers. So if you have questions or comments about Eiffel Software products, this is a good place to be.
+
+
+----
+
+===The EiffelWorld Newsletter===
+
+A few times a year, we send out an email newsletter containing announcements of new versions of products, upcoming events, newly added technologies, website changes, editorials, and contributions from the community. To subscribe send a request to [mailto:info@eiffel.com info@eiffel.com].
+
+
+----
+
+===[[Object-Oriented Software Construction, 2nd Edition]]===
+
+There is no better place to gain an in-depth understanding of the Eiffel software development method than [[Object-Oriented Software Construction, 2nd Edition]], by Bertrand Meyer, published by Prentice Hall. It is the world's most complete guide to building great object-oriented software.
+
+
+----
+
+===Other [[Books about the Eiffel Method and Language|books about the Eiffel Method and Language]]===
+
+
+----
+
+===The Standard: ''Eiffel: Analysis, Design, and Programming Language''===
+
+Eiffel has been standardized under ISO and ECMA. The comprehensive description of the standard Eiffel programming language is presented in [http://www.ecma-international.org/publications/standards/Ecma-367.htm Standard ECMA-367].
+
+
+
+----
+
+===Contribute to Eiffel===
+
+You can help Eiffel by contributing your time, expertise, and products. Here are some websites that you can visit to see what's up with the development of Eiffel Software products.
+
+====[http://dev.eiffel.com dev.eiffel.com]====
+
+:This [http://dev.eiffel.com wiki site] is the hub of development activity for the EiffelStudio interactive development environment. Even if you do not plan to contribute, dev.eiffel.com is a valuable source of information concerning where EiffelStudio is going ... and, if you're curious, where it has been.
+
+====[http://eiffelstudio.origo.ethz.ch/ EiffelStudio on Origo]====
+
+:[http://eiffelstudio.origo.ethz.ch/ EiffelStudio on Origo] contains blogs and forums focusing on Eiffel and EiffelStudio topics.
+
+
+
+
+
+----
+
+==[[uuid:b8c10baa-4f50-adfe-a6f8-9cb56a8f1917|Glossary of Object Technology]]==
+
+----
+
+
+This is a relatively comprehensive glossary of terms used in Object-Oriented Analysis, Design, and programming, but are not specific to the Eiffel Language, since object-oriented principles can be applied to any programming language. It contains all the terms from the glossary in [[Object-Oriented Software Construction, 2nd Edition]], plus others used in this website, added for clarity and ease of reference.
+
+This glossary is useful all by itself, since a review of it can serve as a refresher (in case you have been away from Object Technology for a while). It is used in this website to assist the reader by providing easy links to technical terms that are used throughout the website.
+
+Additionally, it is possible to link to terms in this glossary from other websites by using links that look like this:
+
+:[[Image:LogoWarning|24px]] '''Caution:''' {{{1}}}
+ diff --git a/documentation/18.11/_templates/Caution.tpl.data b/documentation/18.11/_templates/Caution.tpl.data new file mode 100644 index 00000000..f41bf645 --- /dev/null +++ b/documentation/18.11/_templates/Caution.tpl.data @@ -0,0 +1,3 @@ +title=Caution +author=admin +path=content/caution-0 diff --git a/documentation/18.11/_templates/Info.tpl b/documentation/18.11/_templates/Info.tpl new file mode 100644 index 00000000..3c38d64f --- /dev/null +++ b/documentation/18.11/_templates/Info.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Info.tpl.data b/documentation/18.11/_templates/Info.tpl.data new file mode 100644 index 00000000..dc6791fd --- /dev/null +++ b/documentation/18.11/_templates/Info.tpl.data @@ -0,0 +1,3 @@ +title=Info +author=admin +path=content/info diff --git a/documentation/18.11/_templates/Inline-Error.tpl b/documentation/18.11/_templates/Inline-Error.tpl new file mode 100644 index 00000000..64076adc --- /dev/null +++ b/documentation/18.11/_templates/Inline-Error.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Inline-Info.tpl b/documentation/18.11/_templates/Inline-Info.tpl new file mode 100644 index 00000000..a32c6bbd --- /dev/null +++ b/documentation/18.11/_templates/Inline-Info.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Inline-Success.tpl b/documentation/18.11/_templates/Inline-Success.tpl new file mode 100644 index 00000000..0351750e --- /dev/null +++ b/documentation/18.11/_templates/Inline-Success.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Inline-Warning.tpl b/documentation/18.11/_templates/Inline-Warning.tpl new file mode 100644 index 00000000..1a097523 --- /dev/null +++ b/documentation/18.11/_templates/Inline-Warning.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Key.tpl b/documentation/18.11/_templates/Key.tpl new file mode 100644 index 00000000..b0eece42 --- /dev/null +++ b/documentation/18.11/_templates/Key.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Key.tpl.data b/documentation/18.11/_templates/Key.tpl.data new file mode 100644 index 00000000..d26a2509 --- /dev/null +++ b/documentation/18.11/_templates/Key.tpl.data @@ -0,0 +1,3 @@ +title=Key +author=admin +path=content/key diff --git a/documentation/18.11/_templates/Note.tpl b/documentation/18.11/_templates/Note.tpl new file mode 100644 index 00000000..1b00b242 --- /dev/null +++ b/documentation/18.11/_templates/Note.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Note.tpl.data b/documentation/18.11/_templates/Note.tpl.data new file mode 100644 index 00000000..855e9265 --- /dev/null +++ b/documentation/18.11/_templates/Note.tpl.data @@ -0,0 +1,3 @@ +title=Note +author=admin +path=content/note diff --git a/documentation/18.11/_templates/Recommended.tpl b/documentation/18.11/_templates/Recommended.tpl new file mode 100644 index 00000000..43521ac7 --- /dev/null +++ b/documentation/18.11/_templates/Recommended.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Recommended.tpl.data b/documentation/18.11/_templates/Recommended.tpl.data new file mode 100644 index 00000000..9b7bf199 --- /dev/null +++ b/documentation/18.11/_templates/Recommended.tpl.data @@ -0,0 +1,3 @@ +title=Recommended +author=admin +path=content/recommended diff --git a/documentation/18.11/_templates/ReviewRequested.tpl b/documentation/18.11/_templates/ReviewRequested.tpl new file mode 100644 index 00000000..c927b85c --- /dev/null +++ b/documentation/18.11/_templates/ReviewRequested.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/ReviewRequested.tpl.data b/documentation/18.11/_templates/ReviewRequested.tpl.data new file mode 100644 index 00000000..89fcc23e --- /dev/null +++ b/documentation/18.11/_templates/ReviewRequested.tpl.data @@ -0,0 +1,3 @@ +title=ReviewRequested +author=vwheeler +path=content/reviewrequested diff --git a/documentation/18.11/_templates/Rule.tpl b/documentation/18.11/_templates/Rule.tpl new file mode 100644 index 00000000..5a2ab11a --- /dev/null +++ b/documentation/18.11/_templates/Rule.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Rule.tpl.data b/documentation/18.11/_templates/Rule.tpl.data new file mode 100644 index 00000000..1eb02663 --- /dev/null +++ b/documentation/18.11/_templates/Rule.tpl.data @@ -0,0 +1,3 @@ +title=Rule +author=halw +path=content/rule diff --git a/documentation/18.11/_templates/Sample.tpl b/documentation/18.11/_templates/Sample.tpl new file mode 100644 index 00000000..cfb7647c --- /dev/null +++ b/documentation/18.11/_templates/Sample.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Sample.tpl.data b/documentation/18.11/_templates/Sample.tpl.data new file mode 100644 index 00000000..424705cd --- /dev/null +++ b/documentation/18.11/_templates/Sample.tpl.data @@ -0,0 +1,3 @@ +title=Sample +author=admin +path=content/sample diff --git a/documentation/18.11/_templates/SeeAlso.tpl b/documentation/18.11/_templates/SeeAlso.tpl new file mode 100644 index 00000000..5cae363f --- /dev/null +++ b/documentation/18.11/_templates/SeeAlso.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/SeeAlso.tpl.data b/documentation/18.11/_templates/SeeAlso.tpl.data new file mode 100644 index 00000000..b6d7a6d1 --- /dev/null +++ b/documentation/18.11/_templates/SeeAlso.tpl.data @@ -0,0 +1,3 @@ +title=SeeAlso +author=admin +path=content/seealso diff --git a/documentation/18.11/_templates/Tip.tpl b/documentation/18.11/_templates/Tip.tpl new file mode 100644 index 00000000..fb97fb41 --- /dev/null +++ b/documentation/18.11/_templates/Tip.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Tip.tpl.data b/documentation/18.11/_templates/Tip.tpl.data new file mode 100644 index 00000000..b08eb551 --- /dev/null +++ b/documentation/18.11/_templates/Tip.tpl.data @@ -0,0 +1,3 @@ +title=Tip +author=admin +path=content/tip diff --git a/documentation/18.11/_templates/UnderConstruction.tpl b/documentation/18.11/_templates/UnderConstruction.tpl new file mode 100644 index 00000000..8690bef8 --- /dev/null +++ b/documentation/18.11/_templates/UnderConstruction.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/UnderConstruction.tpl.data b/documentation/18.11/_templates/UnderConstruction.tpl.data new file mode 100644 index 00000000..03ee0be2 --- /dev/null +++ b/documentation/18.11/_templates/UnderConstruction.tpl.data @@ -0,0 +1,3 @@ +title=UnderConstruction +author=vwheeler +path=content/underconstruction diff --git a/documentation/18.11/_templates/UpdateNeeded.tpl b/documentation/18.11/_templates/UpdateNeeded.tpl new file mode 100644 index 00000000..67c6d834 --- /dev/null +++ b/documentation/18.11/_templates/UpdateNeeded.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/UpdateNeeded.tpl.data b/documentation/18.11/_templates/UpdateNeeded.tpl.data new file mode 100644 index 00000000..ba14a901 --- /dev/null +++ b/documentation/18.11/_templates/UpdateNeeded.tpl.data @@ -0,0 +1,3 @@ +title=UpdateNeeded +author=vwheeler +path=content/updateneeded diff --git a/documentation/18.11/_templates/Warning.tpl b/documentation/18.11/_templates/Warning.tpl new file mode 100644 index 00000000..78c79dcd --- /dev/null +++ b/documentation/18.11/_templates/Warning.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/Warning.tpl.data b/documentation/18.11/_templates/Warning.tpl.data new file mode 100644 index 00000000..fb2d9462 --- /dev/null +++ b/documentation/18.11/_templates/Warning.tpl.data @@ -0,0 +1,3 @@ +title=Warning +author=admin +path=content/warning diff --git a/documentation/18.11/_templates/definition.tpl b/documentation/18.11/_templates/definition.tpl new file mode 100644 index 00000000..b6ee693f --- /dev/null +++ b/documentation/18.11/_templates/definition.tpl @@ -0,0 +1 @@ + diff --git a/documentation/18.11/_templates/definition.tpl.data b/documentation/18.11/_templates/definition.tpl.data new file mode 100644 index 00000000..9990e7a0 --- /dev/null +++ b/documentation/18.11/_templates/definition.tpl.data @@ -0,0 +1,3 @@ +title=definition +author=halw +path=content/definition diff --git a/documentation/18.11/contribute/documentation.wiki b/documentation/18.11/contribute/documentation.wiki new file mode 100644 index 00000000..8ebcc5a1 --- /dev/null +++ b/documentation/18.11/contribute/documentation.wiki @@ -0,0 +1,44 @@ +[[Property:title|How to contribute to documentation]] +[[Property:link_title|To documentation]] +[[Property:weight|2]] +[[Property:uuid|A2DED192-B50A-4E59-B214-FDC3FEDC7A44]] + += Current documentation system = +* The documentation is written using wikitext syntax (similar to wikipedia). +* Each documentation page is stored in a wiki file on disk. +* Those files come from the subversion repository: [https://svn.eiffel.com/eiffel-org/trunk/documentation/trunk] . +* The outline of book are following the underlying directory structure, and each wiki file can have properties that hold metadata such as: +
+[[Property:title|The page title]]
+[[Property:link_title|short title]]
+[[Property:weight|5]]
+
+** '''link_title''' is used to have a short title in menu, or various links.
+** '''weight''' is used to order sibling pages (lower weight goes before, upper weight goes after).
+
+= To contribute =
+* First, you can post comment on any page (see comment form at the bottom of each page).
+* As one would contribute to any source maintained on a subversion repository, one can contribute via the repository [https://svn.eiffel.com/eiffel-org/trunk/documentation/trunk/] and provide patch.
+* Note there is also a git mirror at [https://github.com/eiffelsoftware/eiffel-org] so you can also contribute via github by sending pull request.
+
+= Step by step with git =
+* Go to [https://github.com/eiffelsoftware/eiffel-org] for the project, then git clone on your machine.
+* create a git branch.
+* add or edit the files locally.
+* once you want to share your changes.
+** git commit your changes.
+** git push them to your github repository.
+** then create a pull request so that the Eiffel.org documentation team can review and integrate the changes.
+* See current pull requests at [https://github.com/EiffelSoftware/eiffel-org/pulls].
+
+= Step by step with subversion =
+* svn checkout https://svn.eiffel.com/eiffel-org/trunk/documentation/trunk/.
+* add or edit the files locally.
+* once you want to share your changes.
+** svn update.
+** Send the patch via [https://codereview.appspot.com/]. (note: follow the instructions from codereview site, you will need to use a python script "upload.py" distributed by the codereview site).
+* See current patches at [https://codereview.appspot.com/search?base=https://svn.eiffel.com/eiffel-org/trunk/documentation/trunk/].
+
+= Live editing on this site =
+* If you are a trusted editor, you can edit the documentation directly.
+* To be a trusted editor, please request it via the [https://www.eiffel.org/contact contact] page (do not forget to mention who you are and why you think you should be a trusted editor).
diff --git a/documentation/18.11/contribute/editing_help.wiki b/documentation/18.11/contribute/editing_help.wiki
new file mode 100644
index 00000000..dcf54b89
--- /dev/null
+++ b/documentation/18.11/contribute/editing_help.wiki
@@ -0,0 +1,123 @@
+[[Property:title|Help to edit documentation]]
+[[Property:link_title|Editing help]]
+[[Property:weight|3]]
+
+= Wikitext syntax =
+* Have a look at [https://en.wikipedia.org/wiki/Help:Wiki_markup Wikipedia markup] documentation.
+* The current website does not support the full Wikipedia syntax, but still most of the needed cases.
+
+* To embed inline code:
+** `` `foo.bar` ``
+** `foo.bar`
+** `
+ class FOOBAR
+
+```
+
+```xml
+
+```eiffel
+ class FOOBAR
+```
+
+
+Note: if you do not specify the lang, it is defaulted to "eiffel"
+
+
+
+= Templates =
+== Top page templates ==
+Used to qualify the current page.
+
+=== ReviewRequested ===
+:NEXT x instruction:
+
+
+myprogram -c "alpha beta" -h "gamma"
+
+
+==Notes==
+
+This class inherits functionality for dealing with command line arguments from class ARGUMENTS. It uses the feature separate_character_option_value to return the values by option name for each of the two arguments. ARGUMENTS provides a rich set of features for command line argument processing.
+
+The simple version in [[#Solution|Solution]] below is as submitted to Rosetta Code to illustrate class ARGUMENTS, but it should be noted that separate_character_option_value is of a detached type and will return a void reference if no value is found for a specified character option. Therefore, a safer version of the use of separate_character_option_value would include object test on the result:
+
+
+ if attached separate_character_option_value ('c') as l_val then
+ print ("Command line argument value for option 'c' is: ")
+ print (l_val + "%N")
+ end
+ if attached separate_character_option_value ('h') as l_val then
+ print ("Command line argument value for option 'h' is: ")
+ print (l_val + "%N")
+ end
+
+
+==Source==
+
+Problem description from [http://rosettacode.org/wiki/Command-line_arguments Rosetta Code]
+
+==Solution==
+
+
+class
+ APPLICATION
+inherit
+ ARGUMENTS
+create
+ make
+feature {NONE} -- Initialization
+ make
+ -- Print values for arguments with options 'c' and 'h'.
+ do
+ print ("Command line argument value for option 'c' is: ")
+ print (separate_character_option_value ('c') + "%N")
+ print ("Command line argument value for option 'h' is: ")
+ print (separate_character_option_value ('h') + "%N")
+ io.read_line -- Keep console window open
+ end
+end
+
+
+
+==Output (for command line arguments: -c "alpha beta" -h "gamma")==
+
+
+Command line argument value for option 'c' is: alpha beta
+Command line argument value for option 'h' is: gamma
+
+
+
+{{SeeAlso|[[Execution_profiles|How to run with arguments]]}}
+
+
diff --git a/documentation/18.11/eiffel/Examples/example-environment-variables.wiki b/documentation/18.11/eiffel/Examples/example-environment-variables.wiki
new file mode 100644
index 00000000..2f214bfb
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/example-environment-variables.wiki
@@ -0,0 +1,41 @@
+[[Property:title|Example: Environment variables]]
+[[Property:weight|0]]
+[[Property:uuid|60c39a34-0794-4c1f-a150-7431afa3e693]]
+==Description==
+
+Using features from the class EXECUTION_ENVIRONMENT to create and retrieve an environment variable.
+
+==Notes==
+
+The make procedure of the class APPLICATION below uses the features put and get, inherited from the class EXECUTION_ENVIRONMENT, to create the environment variable MY_VARIABLE with value "Hello World!", and then to retrieve the value by key and print it.
+
+==Solution==
+
+
+class
+ APPLICATION
+
+inherit
+ EXECUTION_ENVIRONMENT
+
+create
+ make
+
+feature {NONE} -- Initialization
+ make
+ -- Create and retrieve an environment variable.
+ do
+ put ("Hello World!", "MY_VARIABLE")
+ print (get ("MY_VARIABLE"))
+ end
+end
+
+
+
+==Output==
+
+
+Hello World!
+
+
+
diff --git a/documentation/18.11/eiffel/Examples/example-file-io.wiki b/documentation/18.11/eiffel/Examples/example-file-io.wiki
new file mode 100644
index 00000000..abaafd16
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/example-file-io.wiki
@@ -0,0 +1,52 @@
+[[Property:title|Example: File IO]]
+[[Property:weight|0]]
+[[Property:uuid|b26aa8e3-5963-94ae-b523-642c8b79637b]]
+==Description==
+
+Create a file "output.txt" containing the contents of "input.txt".
+
+
+==Source==
+
+Problem description from [http://rosettacode.org/wiki/File_IO Rosetta Code: File IO]
+
+==Solution==
+
+
+class
+ APPLICATION
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make
+ -- Run application.
+ do
+ create input_file.make_open_read ("input.txt")
+ create output_file.make_open_write ("output.txt")
+
+ from
+ input_file.read_character
+ until
+ input_file.exhausted
+ loop
+ output_file.put (input_file.last_character)
+ input_file.read_character
+ end
+
+ input_file.close
+ output_file.close
+ end
+
+feature -- Access
+
+ input_file: PLAIN_TEXT_FILE
+ output_file: PLAIN_TEXT_FILE
+
+end
+
+
+
+
diff --git a/documentation/18.11/eiffel/Examples/example-polymorphism.wiki b/documentation/18.11/eiffel/Examples/example-polymorphism.wiki
new file mode 100644
index 00000000..3896a8a2
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/example-polymorphism.wiki
@@ -0,0 +1,218 @@
+[[Property:title|Example: Polymorphism]]
+[[Property:weight|0]]
+[[Property:uuid|e4a9db32-c087-21b7-f0d6-4685f0ce249d]]
+==Description==
+
+Create a class POINT and its heir CIRCLE to demonstrate polymorphic attachment and dynamic binding.
+
+
+==Source==
+
+Problem description from [http://rosettacode.org/wiki/Polymorphism Rosetta Code: Polymorphism]
+
+Solution varies from Rosetta Code description (e. g., feature out is redefined in this solution, versus feature print.)
+
+==Solution==
+
+
+class
+ POINT
+inherit
+ ANY
+ redefine
+ out
+ end
+create
+ make, make_origin
+
+feature -- Initialization
+
+ make (a_x, a_y: INTEGER)
+ -- Create with values `a_x' and `a_y'
+ do
+ set_x (a_x)
+ set_y (a_y)
+ ensure
+ x_set: x = a_x
+ y_set: y = a_y
+ end
+
+ make_origin
+ -- Create at origin
+ do
+ ensure
+ x_set: x = 0
+ y_set: y = 0
+ end
+
+feature -- Access
+
+ x: INTEGER assign set_x
+ -- Horizontal axis coordinate
+
+ y: INTEGER assign set_y
+ -- Vertical axis coordinate
+
+feature -- Element change
+
+ set_x (a_x: INTEGER)
+ -- Set `x' coordinate to `a_x'
+ do
+ x := a_x
+ ensure
+ x_set: x = a_x
+ end
+
+ set_y (a_y: INTEGER)
+ -- Set `y' coordinate to `a_y'
+ do
+ y := a_y
+ ensure
+ y_set: y = a_y
+ end
+
+feature -- Output
+
+ out: STRING
+ -- Display as string
+ do
+ Result := "Point: x = " + x.out + " y = " + y.out
+ end
+end
+
+
+
+
+class
+ CIRCLE
+
+inherit
+ POINT
+ rename
+ make as point_make
+ redefine
+ make_origin,
+ out
+ end
+create
+ make, make_origin, make_from_point
+
+feature -- Initialization
+
+ make (a_x, a_y, a_r: INTEGER)
+ -- Create with values `a_x' and `a_y' and `a_r'
+ require
+ non_negative_radius_argument: a_r >= 0
+ do
+ point_make (a_x, a_y)
+ set_r (a_r)
+ ensure
+ x_set: x = a_x
+ y_set: y = a_y
+ r_set: r = a_r
+ end
+
+ make_origin
+ -- Create at origin with zero radius
+ do
+ Precursor
+ ensure then
+ r_set: r = 0
+ end
+
+ make_from_point (a_p: POINT; a_r: INTEGER)
+ -- Initialize from `a_r' with radius `a_r'.
+ require
+ non_negative_radius_argument: a_r >= 0
+ do
+ set_x (a_p.x)
+ set_y (a_p.y)
+ set_r (a_r)
+ ensure
+ x_set: x = a_p.x
+ y_set: y = a_p.y
+ r_set: r = a_r
+ end
+
+feature -- Access
+
+ r: INTEGER assign set_r
+ -- Radius
+
+feature -- Element change
+
+ set_r (a_r: INTEGER)
+ -- Set radius (`r') to `a_r'
+ require
+ non_negative_radius_argument: a_r >= 0
+ do
+ r := a_r
+ ensure
+ r_set: r = a_r
+ end
+
+feature -- Output
+
+ out: STRING
+ -- Display as string
+ do
+ Result := "Circle: x = " + x.out + " y = " + y.out + " r = " + r.out
+ end
+
+invariant
+
+ non_negative_radius: r >= 0
+
+end
+
+
+
+
+class
+ APPLICATION
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make
+ -- Run application.
+ local
+ my_point: POINT
+ my_circle: CIRCLE
+ do
+ create my_point.make_origin
+ print (my_point.out + "%N")
+
+ create {CIRCLE} my_point.make_origin
+ print (my_point.out + "%N")
+
+ create my_point.make (10, 15)
+ print (my_point.out + "%N")
+
+ create {CIRCLE} my_point.make (20, 25, 5)
+ print (my_point.out + "%N")
+
+ create my_circle.make (30, 35, 10)
+ print (my_circle.out + "%N")
+
+ create my_circle.make_from_point (my_point, 35)
+ print (my_circle.out + "%N")
+ end
+
+end
+
+
+
+==Output==
+
+
+Point: x = 0 y = 0
+Circle: x = 0 y = 0 r = 0
+Point: x = 10 y = 15
+Circle: x = 20 y = 25 r = 5
+Circle: x = 30 y = 35 r = 10
+Circle: x = 20 y = 25 r = 35
+
+
diff --git a/documentation/18.11/eiffel/Examples/example-reverse-string.wiki b/documentation/18.11/eiffel/Examples/example-reverse-string.wiki
new file mode 100644
index 00000000..cd29c929
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/example-reverse-string.wiki
@@ -0,0 +1,41 @@
+[[Property:title|Example: Reverse a string]]
+[[Property:weight|0]]
+[[Property:uuid|d888d308-6bb7-edd5-ee25-92d04b5658d3]]
+==Description==
+
+Reverse the order of the characters in a give string of characters.
+
+
+==Source==
+
+Problem description from [http://rosettacode.org/wiki/Reverse_a_string Rosetta Code]
+
+
+==Solution==
+
+
+class
+ APPLICATION
+create
+ make
+feature
+ make
+ -- Demonstrate string reversal.
+ do
+ my_string := "Hello World!"
+ my_string.mirror
+ print (my_string)
+ end
+ my_string: STRING
+ -- Used for reversal
+end
+
+
+
+==Output==
+
+
+!dlroW olleH
+
+
+
diff --git a/documentation/18.11/eiffel/Examples/example-self-initializing-attributes-and-assigner-commands.wiki b/documentation/18.11/eiffel/Examples/example-self-initializing-attributes-and-assigner-commands.wiki
new file mode 100644
index 00000000..38f0a2ab
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/example-self-initializing-attributes-and-assigner-commands.wiki
@@ -0,0 +1,84 @@
+[[Property:title|Example: Self-initializing attributes and assigner commands]]
+[[Property:weight|0]]
+[[Property:uuid|dbc107a4-42cd-606a-71b2-e0b70ac5482e]]
+==Description==
+
+Example of using a [[Void-safety: Background, definition, and tools#Self-initializing attributes|self-initializing attribute]] and an [[ET: The Dynamic Structure: Execution Model#Assigner commands|assigner command]].
+
+==Notes==
+
+The concepts of [[Void-safety: Background, definition, and tools#Self-initializing attributes|self-initializing attributes]] and [[ET: The Dynamic Structure: Execution Model#Assigner commands|assigner commands]] are independent of one another. However, this example shows how each works in a small amount of code.
+
+The example consists of two classes: a root class, and class PERSON. The PERSON class has a self-initializing attribute of type STRING named mood. If mood is accessed before it is explicitly initialized, then the self-initializing code after the keyword attribute will be executed, setting the default mood to "Happy".
+
+The attribute mood also has an assigner command, the procedure set_mood, designated as such by the assign keyword. This allows clients of class PERSON to appear to assign directly to mood. However, the assigner command set_mood will always get executed, and its precondition will be in force during such an apparent assignment.
+
+The root class APPLICATION creates an instance of PERSON and prints the value of mood, getting the self-iniitalized value. Then it assigns to mood. When it prints again, it gets the updated value.
+
+==Source==
+
+Adapted from an example given on the Eiffel Software Users Group.
+
+==Solution==
+
+A root class:
+
+
+class
+ APPLICATION
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make
+ -- Print and set mood of `my_person'.
+ do
+ create my_person
+ print ("Mood: " + my_person.mood + "%N")
+ my_person.mood := "Ecstatic"
+ print ("Mood: " + my_person.mood + "%N")
+ end
+
+feature -- Access
+
+ my_person: PERSON
+
+end
+
+
+
+Class PERSON:
+
+
+class
+ PERSON
+
+feature -- Access
+
+ mood: STRING assign set_mood
+ attribute
+ Result := "Happy"
+ end
+
+feature -- Element change
+
+ set_mood (a_string: STRING)
+ require
+ single_token: a_string.occurrences (' ') = 0
+ do
+ mood := a_string
+ ensure
+ mood_set: mood = a_string
+ end
+end
+
+
+==Output==
+
+
+Mood: Happy
+Mood: Ecstatic
+
+
diff --git a/documentation/18.11/eiffel/Examples/example-sieve-eratosthenes.wiki b/documentation/18.11/eiffel/Examples/example-sieve-eratosthenes.wiki
new file mode 100644
index 00000000..f5b891f5
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/example-sieve-eratosthenes.wiki
@@ -0,0 +1,64 @@
+[[Property:title|Example: Sieve of Eratosthenes]]
+[[Property:weight|0]]
+[[Property:uuid|e825c874-4266-b5ee-501c-221e6940dacd]]
+==Description==
+
+Deliver prime numbers up to a specified integer limit. Compute prime numbers using sieve of Eratosthenes.
+
+==Notes==
+
+This example uses the ''iteration'' (across) form of the Eiffel loop construct to traverse a list, an array, and an integer interval.
+
+==Source==
+
+Problem description from [http://rosettacode.org/wiki/Sieve_of_Eratosthenes Rosetta Code]
+
+
+==Solution==
+
+
+class
+ APPLICATION
+
+create
+ make
+
+feature
+ make
+ -- Run application.
+ do
+ across primes_through (100) as ic loop print (ic.item.out + " ") end
+ end
+
+ primes_through (a_limit: INTEGER): LINKED_LIST [INTEGER]
+ -- Prime numbers through `a_limit'
+ require
+ valid_upper_limit: a_limit >= 2
+ local
+ l_tab: ARRAY [BOOLEAN]
+ do
+ create Result.make
+ create l_tab.make_filled (True, 2, a_limit)
+ across
+ l_tab as ic
+ loop
+ if ic.item then
+ Result.extend (ic.target_index)
+ across ((ic.target_index * ic.target_index) |..| l_tab.upper).new_cursor.with_step (ic.target_index) as id
+ loop
+ l_tab [id.item] := False
+ end
+ end
+ end
+ end
+end
+
+
+
+==Output==
+
+
+2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
+
+
+
diff --git a/documentation/18.11/eiffel/Examples/example-sleep.wiki b/documentation/18.11/eiffel/Examples/example-sleep.wiki
new file mode 100644
index 00000000..c3003c3b
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/example-sleep.wiki
@@ -0,0 +1,54 @@
+[[Property:title|Example: Sleep]]
+[[Property:weight|0]]
+[[Property:uuid|a846db1c-2096-43a9-bb8b-a233c9e21421]]
+==Description==
+
+Write a program that does the following in this order:
+# Input an amount of time to sleep in whatever units are most natural for your language (milliseconds, seconds, ticks, etc.). This unit should be noted in comments or in a description.
+# Print "Sleeping..."
+# Sleep the main thread for the given amount of time.
+# Print "Awake!"
+# End.
+
+==Notes==
+
+The feature sleep is defined in the library class EXECUTION_ENVIRONMENT. So the demonstration class APPLICATION inherits from EXECUTION_ENVIRONMENT in order to make sleep available.
+
+sleep takes an argument which declares the number of nanoseconds to suspend the thread's execution.
+
+==Source==
+
+Problem description from [http://rosettacode.org/wiki/Sleep Rosetta Code]
+
+==Solution==
+
+
+class
+ APPLICATION
+inherit
+ EXECUTION_ENVIRONMENT
+create
+ make
+feature -- Initialization
+ make
+ -- Sleep for a given number of nanoseconds.
+ do
+ print ("Enter a number of nanoseconds: ")
+ io.read_integer_64
+ print ("Sleeping...%N")
+ sleep (io.last_integer_64)
+ print ("Awake!%N")
+ end
+end
+
+
+
+==Output (sleeping 10 seconds)==
+
+
+Enter a number of nanoseconds: 10000000000
+Sleeping...
+Awake!
+
+
+
diff --git a/documentation/18.11/eiffel/Examples/index.wiki b/documentation/18.11/eiffel/Examples/index.wiki
new file mode 100644
index 00000000..35c8fbb5
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/index.wiki
@@ -0,0 +1,10 @@
+[[Property:title|Examples]]
+[[Property:description|how common programming problems can be solved using Eiffel]]
+[[Property:weight|6]]
+[[Property:uuid|1a59e03b-8bf0-8426-43b4-577761e40790]]
+Here you will find examples of how common programming problems can be solved using Eiffel.
+
+A set of examples is also included with the EiffelStudio distribution kit.
+
+
+
diff --git a/documentation/18.11/eiffel/Examples/introduction-examples-book.wiki b/documentation/18.11/eiffel/Examples/introduction-examples-book.wiki
new file mode 100644
index 00000000..755605a5
--- /dev/null
+++ b/documentation/18.11/eiffel/Examples/introduction-examples-book.wiki
@@ -0,0 +1,26 @@
+[[Property:modification_date|Mon, 10 Sep 2018 09:10:34 GMT]]
+[[Property:publication_date|Mon, 10 Sep 2018 09:10:34 GMT]]
+[[Property:title|Introduction to the Examples Book]]
+[[Property:weight|-1]]
+[[Property:uuid|044fa742-f3ca-9f5b-01cc-7194ee172b08]]
+
+EiffelStudio comes with a rich set of examples that you can use to learn how to use the many Eiffel facilities and libraries. You should look first to the examples distributed with EiffelStudio as your primary source of samples of Eiffel in use.
+
+The examples in this book are somewhat different in nature and serve a different purpose.
+
+Although some of the examples included here are provided by Eiffel Software, the intent is that the majority of the entries will be contributed by people like you who use Eiffel daily to solve real problems.
+
+The inspiration for this book is the many ''program chrestomathies'' on the World-Wide Web. In natural language, a chrestomathy is a set of literary passages explicitly selected for the purpose of helping learn a language. A program chrestomathy is a set of problems for which solutions are represented in various programming languages with the aim of allowing programmers to compare language capabilities and programming techniques.
+
+Program chrestomathies vary widely. At one end of the spectrum [http://99-bottles-of-beer.net/ 99 Bottles of Beer] has collected solutions in over one thousand programming languages, all targeted to a single problem: generate and print the complete lyrics of the song ''99 Bottles of Beer on the Wall''. There are several "Hello world!" chrestomathies. Other sites host multiple programming problems, all with solutions in many languages. One large multi-problem site is [http://rosettacode.org/wiki/Main_Page Rosetta Code]. In fact, Rosetta Code maintains a [http://rosettacode.org/wiki/Help:Similar_Sites list of links to many of the Web's other programming chrestomathy projects].
+
+Eiffel has a presence on many of these sites. Still, the more examples, the better.
+
+The purpose of the examples in this book, then, is two-fold. First, we get a set of Eiffel examples in the Eiffel online documentation with solutions to a different set of problems than the examples distributed with EiffelStudio. Second, examples from this set can be migrated to Rosetta Code or one of the other chrestomathies to improve Eiffel's presence on those sites. (The caveat to contributors is clear: '''Contribute only work that you have the authority to release, and only if you are willing to have your work shared on one or more of the program chrestomathies.''' By submitting content to this Examples book, you agree to release that content under terms no more restrictive than the GNU Free Documentation License.)
+
+Sites like Rosetta Code and [http://en.literateprograms.org/LiteratePrograms:Welcome Literate Programs] offer a wide variety of programming problems or tasks for comparison of languages and techniques. Rosetta Code provides an index to the [http://rosettacode.org/wiki/Reports:Tasks_not_implemented_in_Eiffel tasks not yet implemented in Eiffel].
+
+This book should include, but not necessarily be limited to, certain of the problems used as challenges by program chrestomathies.
+
+
+
diff --git a/documentation/18.11/eiffel/Language_reference/index.wiki b/documentation/18.11/eiffel/Language_reference/index.wiki
new file mode 100644
index 00000000..a0aabc78
--- /dev/null
+++ b/documentation/18.11/eiffel/Language_reference/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|Language reference]]
+[[Property:link_title|Language]]
+[[Property:weight|3]]
+[[Property:uuid|17412f30-0451-4b2b-bdec-578ca2e619a6]]
+
+
diff --git a/documentation/18.11/eiffel/Language_reference/quick-reference-eiffel-programming-language/Expressions/Conditional-expression.wiki b/documentation/18.11/eiffel/Language_reference/quick-reference-eiffel-programming-language/Expressions/Conditional-expression.wiki
new file mode 100644
index 00000000..a096da5e
--- /dev/null
+++ b/documentation/18.11/eiffel/Language_reference/quick-reference-eiffel-programming-language/Expressions/Conditional-expression.wiki
@@ -0,0 +1,30 @@
+[[Property:uuid|C652AC71-8BAD-4387-A46C-21C9F5C3A68F]]
+[[Property:weight|0]]
+[[Property:title|Conditional expression]]
+[[Property:link_title|Conditional]]
+
+[[Eiffel%20Programming%20Language%20Syntax#Conditionals|Conditional expressions]] compute a value using different expressions depending on one or more conditions. If all expressions have the same type, the conditional expression as a whole has this type as well:
+
+do and end. Non-keyword reserved words are those that do carry semantic value, such as True and Current.}}
+
+
+{{note|The set of reserved words supported by the Eiffel Software implementation may vary somewhat from those specified in the current standard. See the [[Differences between standard ECMA-367 and Eiffel Software implementation|"differences" chapter of the online documentation]] for information on these variances.}}
+
+
+==Reserved words==
+
+===across===
+
+Introduces an [[ET: Instructions#Loop|iteration]].
+
+===agent===
+
+Used to specify an [[ET: Agents|agent]].
+
+:[[Eiffel programming language syntax#Agents|Syntax.]]
+
+
+===alias===
+
+Used to identify an alternative or alias feature name.
+
+:[[Eiffel programming language syntax#Feature names|Syntax.]]
+
+[[ET: The Dynamic Structure: Execution Model#Infix and prefix notations|Usage for infix/prefix notations.]]
+
+[[ET: The Static Picture: System Organization#External software|Usage in interfaces to external software.]]
+
+:[[Eiffel programming language syntax#External routines|Syntax.]]
+
+
+===all===
+
+Used in [[ET: Inheritance#Changing the export status|export adaptation]] to indicate that a chosen export status applies to all features inherited from a given parent.
+
+:[[Eiffel programming language syntax#Export adaptation|Syntax.]]
+
+
+===and===
+
+The logical conjunction [[Eiffel programming language syntax#Operators|operator]]. Strict when used alone, nonstrict when used with [[#then|then]].
+
+
+===as===
+
+Used when [[ET: Inheritance#Multiple inheritance and renaming|renaming]] features in descendant classes.
+
+:[[Eiffel programming language syntax#Rename clauses|Syntax.]]
+
+
+===assign===
+
+Used to designate [[ET: The Dynamic Structure: Execution Model#Abstraction|assigner commands]].
+
+:[[Eiffel programming language syntax#Assigner marks|Syntax.]]
+
+
+===attribute===
+
+Introduces an attribute body, as in [[Void-safety: Background, definition, and tools#Self-initializing attributes|self-initializing attributes]].
+
+:[[Eiffel programming language syntax#Attribute bodies|Syntax.]]
+
+
+===check===
+
+Identifies a [[ET: Other Mechanisms#Check|check instruction]].
+
+:[[Eiffel programming language syntax#Check instructions|Syntax.]]
+
+
+===class===
+
+Used in a class header in the declaration of a [[ET: The Dynamic Structure: Execution Model#A simple class|class]].
+
+:[[Eiffel programming language syntax#Class headers|Class header syntax.]]
+
+
+===convert===
+
+Used in converter clauses.
+
+:[[Eiffel programming language syntax#Converter clauses|Syntax.]]
+
+Used in feature names for operator aliases, supporting mixed type expressions causing a conversion of the target (8.5.14).
+
+:[[Eiffel programming language syntax#Feature names|Syntax.]]
+
+
+===create===
+
+In the creators part of a class, introduces those procedures which can be used to [[ET: The Dynamic Structure: Execution Model#Creating and initializing objects|initialize instances]].
+
+:[[Eiffel programming language syntax#Creators parts|Syntax.]]
+
+Introduces a [[ET: The Dynamic Structure: Execution Model#Creating and initializing objects|creation instruction]].
+
+:[[Eiffel programming language syntax#Creation instructions|Syntax.]]
+
+Introduces a creation expression (8.20.18)
+
+:[[Eiffel programming language syntax#Creation expressions|Syntax.]]
+
+In [[ET: Inheritance#Constrained genericity|constrained genericity]], introduces a list of names of features which can be used as creation procedures with a generic class for a particular formal generic parameter. (8.12.10)
+
+:[[Eiffel programming language syntax#Generic constraints|Syntax.]]
+
+
+===Current===
+
+A predefined entity indicating the current object.
+
+:[[Eiffel programming language syntax#Entities and variables|Entity syntax.]]
+
+:[[Eiffel programming language syntax#Types|Anchored types syntax.]]
+
+
+===debug===
+
+Introduces a [[ET: Other Mechanisms#Debug|debug instruction]].
+
+:[[Eiffel programming language syntax#Debug Instructions|Syntax.]]
+
+
+===deferred===
+
+Used in class header to indicate a [[ET: Inheritance#Deferred features and classes|deferred class]].
+
+:[[Eiffel programming language syntax#Class headers|Syntax.]]
+
+Used in routine body to indicate a [[ET: Inheritance#Deferred features and classes|deferred feature]].
+
+:[[Eiffel programming language syntax#Routine bodies|Syntax.]]
+
+
+===do===
+
+Introduces a sequence of instructions as a routine body, as shown in the [[ET: Hello World|Hello World]] example.
+
+:[[Eiffel programming language syntax#Routine bodies|Syntax.]]
+
+
+===else===
+
+Used in [[ET: Other Mechanisms#Conditional|conditional]] and [[ET: Other Mechanisms#Multi-branch|multi-branch]] instructions to introduce a sequence of instructions to be executed in the case that no specified conditions are met.
+
+:[[Eiffel programming language syntax#Conditionals|Conditional syntax.]]
+
+:[[Eiffel programming language syntax#Multi-branch instructions|Multi-branch syntax.]]
+
+Used as part of the double reserved word or else, the semi-strict disjunction operator.
+
+:[[Eiffel programming language syntax#Operators|Syntax.]]
+
+Used after the reserved word [[#require|require]] as a precondition extension, allowing the weakening of an inherited precondition (8.10.3).
+
+:[[Eiffel programming language syntax#Assertions|Syntax.]]
+
+
+===elseif===
+
+Used in [[ET: Other Mechanisms#Conditional|conditional]] instructions to effect a "multi-branch" choice instruction.
+
+:[[Eiffel programming language syntax#Conditionals|Syntax.]]
+
+
+===end===
+
+Serves to terminate several Eiffel programming language constructs.
+
+:Syntax for:
+::[[Eiffel programming language syntax#Class declarations|Class declarations]]
+::[[Eiffel programming language syntax#Feature bodies|Feature bodies]]
+::[[Eiffel programming language syntax#Inheritance parts|Inheritance parts]]
+::[[Eiffel programming language syntax#Check instructions|Check instructions]]
+::[[Eiffel programming language syntax#Generic constraints|Generic constraints: renaming and constraint creators]]
+::[[Eiffel programming language syntax#Conditionals|Conditional instructions]]
+::[[Eiffel programming language syntax#Multi-branch instructions|Multi-branch instructions]]
+::[[Eiffel programming language syntax#Loops|Loops]]
+::[[Eiffel programming language syntax#Debug instructions|Debug instructions]]
+
+
+===ensure===
+
+Introduces a [[ET: Design by Contract (tm), Assertions and Exceptions#Expressing assertions|postcondition]].
+
+When followed by the reserved word [[#then|then]] denotes a postcondition extension, allowing the strengthening of an inherited postcondition (8.10.3).
+
+:[[Eiffel programming language syntax#Assertions|Syntax.]]
+
+
+===expanded===
+
+Used in a class header to indicate that a class is [[ET: The Dynamic Structure: Execution Model#Type categories|expanded]].
+
+:[[Eiffel programming language syntax#Class headers|Syntax.]]
+
+
+===export===
+
+Used to [[ET: Inheritance#Changing the export status|change the export status]] (availability to clients) of inherited features.
+
+:[[Eiffel programming language syntax#Export adaptation|Syntax.]]
+
+
+===external===
+
+Denotes an [[ET: The Static Picture: System Organization#External software|external routine]]. External routines are commonly defined to interface with [[C externals|C external routines]] and [[C++ Externals|C++ external routines]].
+
+:[[Eiffel programming language syntax#External routines|Syntax]]
+
+
+===False===
+
+Boolean manifest constant.
+
+:[[Eiffel programming language syntax#Manifest constants|Syntax.]]
+
+
+===feature===
+
+Introduces a [[ET: Hello World|feature clause]].
+
+:[[Eiffel programming language syntax#Feature parts|Syntax.]]
+
+
+===from===
+
+Used in [[ET: Other Mechanisms#Loop|loop]] initialization.
+
+:[[Eiffel programming language syntax#Loops|Syntax.]]
+
+
+===frozen===
+
+Used in a class header to mark a class explicitly as frozen. A frozen class prohibits it from serving as a "conforming parent" to other classes. (8.4.5).
+
+:[[Eiffel programming language syntax#Class headers|Syntax.]]
+
+Used in a feature declaration to mark a feature as frozen. A frozen feature cannot be redefined by heir classes.
+
+:[[Eiffel programming language syntax#New feature lists|Syntax.]]
+
+Used with a formal generic parameter to indicate that conformance of generic derivations of the class require identical actual generic parameters. (8.12.3)
+
+:[[Eiffel programming language syntax#Formal generic parameters|Syntax.]]
+
+
+===if===
+
+Introduces a [[ET: Other Mechanisms#Conditional|conditional]].
+
+:[[Eiffel programming language syntax#Conditionals|Syntax.]]
+
+
+===implies===
+
+The semi-strict logical implication [[Eiffel programming language syntax#Operators|operator]].
+
+
+===inherit===
+
+Used in an [[ET: Inheritance|inherit]] clause.
+
+:[[Eiffel programming language syntax#Inheritance parts|Syntax.]]
+
+
+===inspect===
+
+Introduces a [[ET: Other Mechanisms#Multi-branch|multi-branch]] instruction.
+
+:[[Eiffel programming language syntax#Multi-branch instructions|Syntax.]]
+
+
+===invariant===
+
+Used to introduce an invariant assertion as a [[ET: Design by Contract (tm), Assertions and Exceptions#Class invariants|class invariant]] or [[ET: Instructions#Loop|loop invariant]].
+
+:[[Eiffel programming language syntax#Assertions|Assertions syntax.]]
+
+:[[Eiffel programming language syntax#Class declarations|Syntax of class declaration including class invariant.]]
+
+:[[Eiffel programming language syntax#Loops|Syntax of loop including loop invariant.]]
+
+
+===like===
+
+Used in the declaration of an [[ET: Inheritance#Covariance and anchored declarations|anchored]] entity.
+
+:[[Eiffel programming language syntax#Types|Syntax.]]
+
+
+===local===
+
+Introduces the [[ET: The Dynamic Structure: Execution Model#Entities|local variable]] declarations in a feature body.
+
+:[[Eiffel programming language syntax#Feature bodies|Feature bodies syntax.]]
+
+:[[Eiffel programming language syntax#Local variables|Local variable declarations syntax.]]
+
+
+===loop===
+
+Introduces a [[ET: Other Mechanisms#Loop|loop]] body.
+
+:[[Eiffel programming language syntax#Loops|Syntax.]]
+
+
+===not===
+
+The logical negation [[Eiffel programming language syntax#Operators|operator]].
+
+
+===note===
+
+Used to begin a Notes part, in a [[Eiffel programming language syntax#Class declarations|class declaration]], a [[Eiffel programming language syntax#Feature declarations|feature declaration]], or a [[Eiffel programming language syntax#Check instructions|check instruction]].
+
+:[[Eiffel programming language syntax#Notes|Syntax.]]
+
+
+===obsolete===
+
+Used to mark [[ET: Other Mechanisms#Obsolete features and classes|obsolete features and classes]].
+
+:[[Eiffel programming language syntax#Feature declarations|Feature declarations syntax.]]
+
+:[[Eiffel programming language syntax#Class declarations|Class declarations declarations syntax.]]
+
+:[[Eiffel programming language syntax#Obsolete marks|Obsolete mark syntax.]]
+
+
+===old===
+
+Introduces an ''old expression''. Old expressions are valid only in the [[ET: Design by Contract (tm), Assertions and Exceptions#Postconditions|postconditions]] of routines.
+
+:[[Eiffel programming language syntax#Old postcondition expressions|Syntax.]]
+
+
+===once===
+
+Used to introduce [[ET: Other Mechanisms#Once routines and shared objects|once routines]] and once string expressions.
+
+:[[Eiffel programming language syntax#Routine bodies|Once routine syntax.]]
+
+:[[Eiffel programming language syntax#Expressions|Once string syntax.]]
+
+
+===only===
+
+Used in an ''only postcondition clause''. (8.9.11)
+
+:[[Eiffel programming language syntax#"Old" postcondition expressions|Syntax.]]
+
+
+===or===
+
+The logical disjunction [[Eiffel programming language syntax#Operators|operator]]. Strict when used alone, nonstrict when used with [[#else|else]].
+
+
+===Precursor===
+
+Allows a redefined routine to access the routine it redefines, i.e, its [[ET: Inheritance#Redefinition|precursor]].
+
+:[[Eiffel programming language syntax#Precursor|Syntax.]]
+
+
+===redefine===
+
+Used in an [[Eiffel programming language syntax#Inheritance parts|inheritance part]] of a [[Eiffel programming language syntax#Class declarations|class declaration]] to list those inherited features which, in the heir class, will receive new implementations, specifications, or both, i.e, those features being [[ET: Inheritance#Redefinition|redefined]].
+
+:[[Eiffel programming language syntax#Redefinition|Redefine syntax.]]
+
+
+===rename===
+
+Used in an [[Eiffel programming language syntax#Inheritance parts|inheritance part]] of a [[Eiffel programming language syntax#Class declarations|class declaration]] to [[ET: Inheritance#Multiple inheritance and renaming|provide alternative names]] for inherited features in an heir class.
+
+Used to rename features in a [[Eiffel programming language syntax#Generic constraints|generic constraint]]. (8.12.8).
+
+:[[Eiffel programming language syntax#Rename clauses|Syntax.]]
+
+
+===require===
+
+Introduces a [[ET: Design by Contract (tm), Assertions and Exceptions#Expressing assertions|precondition]].
+
+When followed by the reserved word [[#else|else]] denotes a precondition extension, allowing the weakening of an inherited precondition (8.10.3).
+
+:[[Eiffel programming language syntax#Assertions|Syntax.]]
+
+
+
+===rescue===
+
+Introduces a [[ET: Design by Contract (tm), Assertions and Exceptions#Exception handling|rescue clause]] in a [[Eiffel programming language syntax#Feature bodies|feature body]].
+
+:[[Eiffel programming language syntax#Rescue clauses|Syntax.]]
+
+
+===Result===
+
+A predefined [[ET: The Dynamic Structure: Execution Model#Entities|entity]] used to represent the final result of a function.
+
+:[[Eiffel programming language syntax#Entities and variables|Syntax.]]
+
+
+===retry===
+
+An [[Eiffel programming language syntax#Instructions|instruction]] valid only in [[Eiffel programming language syntax#Rescue clauses|rescue clauses]] and used to [[ET: Design by Contract (tm), Assertions and Exceptions#Exception handling|re-execute the routine]] in which it appears.
+
+:[[Eiffel programming language syntax#Rescue clauses|Syntax.]]
+
+
+===select===
+
+Used in an [[Eiffel programming language syntax#Inheritance parts|inheritance part]] of a [[Eiffel programming language syntax#Class declarations|class declaration]] to resolve possible ambiguities related to polymorphism and dynamic binding in the presence of [[ET: Inheritance#Repeated inheritance and selection|repeated inheritance]].
+
+:[[Eiffel programming language syntax#Select clauses|Syntax.]]
+
+
+===separate===
+
+Reserved for future use.
+
+{{Note|Used in EiffelStudio implementations version 6.8 and later to support [[Concurrent programming with SCOOP]].}}
+
+
+===then===
+
+Used in [[ET: Other Mechanisms#Conditional|conditional]] and [[ET: Other Mechanisms#Multi-branch|multi-branch]] instructions to introduce a sequence of instructions to be executed in the case that a condition is met.
+
+:[[Eiffel programming language syntax#Conditionals|Conditional syntax.]]
+
+:[[Eiffel programming language syntax#Multi-branch instructions|Multi-branch syntax.]]
+
+Used as part of the double reserved word and then, the semi-strict conjunction operator.
+
+:[[Eiffel programming language syntax#Operators|Syntax.]]
+
+Used after the reserved word [[#ensure|ensure]] as a postcondition extension, allowing the strengthening of an inherited postcondition (8.10.3).
+
+:[[Eiffel programming language syntax#Assertions|Syntax.]]
+
+
+===True===
+
+Boolean manifest constant.
+
+:[[Eiffel programming language syntax#Manifest constants|Syntax.]]
+
+
+===TUPLE===
+
+Denotes a [[ET: Other Mechanisms#Tuple types|TUPLE type]].
+
+:[[Eiffel programming language syntax#Tuple types|Syntax.]]
+
+
+===undefine===
+
+Used in an [[Eiffel programming language syntax#Inheritance parts|inheritance part]] of a [[Eiffel programming language syntax#Class declarations|class declaration]] to [[ET: Inheritance#Joining and uneffecting|uneffect]] an inherited feature.
+
+:[[Eiffel programming language syntax#Undefine clauses|Syntax.]]
+
+
+===until===
+
+Used in [[ET: Other Mechanisms#Loop|loop]] initialization.
+
+:[[Eiffel programming language syntax#Loops|Syntax.]]
+
+
+===variant===
+
+Introduces a [[ET: Instructions#Loop|loop variant]].
+
+:[[Eiffel programming language syntax#Variants|Syntax.]]
+
+
+===Void===
+
+A predefined entity name representing a [[ET: The Dynamic Structure: Execution Model#Basic operations|void (a.k.a., null) reference]].
+
+
+===when===
+
+Used in a [[ET: Other Mechanisms#Multi-branch|multi-branch instruction]] to introduce cases.
+
+:[[Eiffel programming language syntax#Multi-branch instructions|Syntax.]]
+
+
+===xor===
+
+The exclusive disjunction [[Eiffel programming language syntax#Operators|operator]].
+
+
+
+
diff --git a/documentation/18.11/eiffel/Language_reference/quick-reference-eiffel-programming-language/eiffel-programming-language-syntax.wiki b/documentation/18.11/eiffel/Language_reference/quick-reference-eiffel-programming-language/eiffel-programming-language-syntax.wiki
new file mode 100644
index 00000000..c338bf68
--- /dev/null
+++ b/documentation/18.11/eiffel/Language_reference/quick-reference-eiffel-programming-language/eiffel-programming-language-syntax.wiki
@@ -0,0 +1,778 @@
+[[Property:title|Eiffel programming language syntax]]
+[[Property:link_title|Syntax]]
+[[Property:weight|0]]
+[[Property:uuid|4CB56AD5-1586-41F6-9E81-085F47E992DC]]
+The syntax specification shown here is a less complete and less formal version of that which is in the Eiffel ISO/ECMA standard document. The format is BNF-E. The Language Specification section of the standard document includes an overview of BNF-E.
+
+There are a few parts of the syntax that are either non-production or non-representable in BNF-E. Some of these have been omitted from the following specification. These omitted parts of the syntax definition add to the precision of the specification, but knowledge of them is not always vital for developers.
+
+In the BNF-E representation, generally non-terminals which are defined in the same group of productions in which they are used are not linked. However when a non-terminal is defined outside a group in which it is used, it is linked to the group in which it is defined.
+
+__TOC__
+
+The following section contains those non-production elements of the specification that are used later in the BNF-E specification.
+
+==Eiffel non-production elements==
+
+===Identifiers===
+
+An '''identifier''' is a sequence of one or more alphanumeric [[#Characters|characters]] of which the first is a letter.
+
+The definition is augmented by the rule that Identifiers are not valid if they are the same as one of the language's reserved words.
+
+===Characters===
+
+Characters are either:
+
+* All 32-bit, corresponding to Unicode and to the Eiffel type CHARACTER_32.
+* All 8-bit, corresponding to 8-bit extended ASCII and to the Eiffel type CHARACTER_8
+
+===Reals===
+
+A real -- specimen of Real -- is made of the following elements, in the order given:
+
+* An optional decimal [[#Integers|Integer]], giving the integral part.
+* A required "." (dot).
+* An optional decimal [[#Integers|Integer]], giving the fractional part.
+* An optional exponent, which is the letter ''e'' or ''E'' followed by an optional [[#Manifest constants|Sign]] and a decimal [[#Integers|Integer]].
+
+No intervening character (blank or otherwise) is permitted between these elements. The integral and fractional parts may not both be absent.
+
+===Strings===
+
+A string -- specimen of construct String -- is a sequence of zero or more manifest characters.
+
+===Simple strings===
+
+A simple string -- specimen of Simple_string -- is a [[#Strings|String]] consisting of at most one line (that is to say, containing no embedded new-line manifest character), possibly containing [[#Special characters|codes for special characters]].
+
+===Special characters===
+
+{| border="2"
+|+ Special Characters and Their Codes
+|-
+! Character
+! Code
+! Mnemonic name
+|-
+| @ || %A || At-sign
+|-
+| BS || %B || Backspace
+|-
+| ^ || %C || Circumflex
+|-
+| $ || %D || Dollar
+|-
+| FF || %F || Form feed
+|-
+| \ || %H || Backslash
+|-
+| ~ || %L || Tilde
+|-
+| NL (LF) || %N || Newline
+|-
+| `` ` `` || %Q || Backquote
+|-
+| CR || %R || Carriage return
+|-
+| # || %S || Sharp
+|-
+| HT || %T || Horizontal tab
+|-
+| NUL || %U || Null
+|-
+| | || %V || Vertical bar
+|-
+| % || %% || Percent
+|-
+| ' || %' || Single quote
+|-
+| " || %" || Double quote
+|-
+| [ || %( || Opening bracket
+|-
+| ] || %) || Closing bracket
+|-
+| { || %< || Opening brace
+|-
+| } || %> || Closing brace
+|}
+
+* %/123/ represents the character with decimal code 123 .
+
+===Line wrapping parts===
+
+A sequence of characters consisting of the following, in order:
+* % (percent character)
+* Zero or more blanks or tabs
+* New line (Line feed)
+* Zero or more blanks or tabs
+* % (percent character)
+
+Line wrapping parts are used as separators between one [[#Simple strings|Simple_string]] and the next in a [[#Manifest strings|Basic_manifest_string]] so that the string can be split across lines.
+
+
+
+==Eiffel BNF-E Syntax==
+
+
+===Class names ===
+Class_name ::= [[#Identfiers|Identifier]]
+
+===Class declarations ===
+Class_declaration ::= end
+
+===Notes ===
+Notes ::= note Note_list
+
+Note_list ::= {Note_entry ";" ...}*
+
+Note_entry ::= Note_name Note_values
+
+Note_name ::= [[#Identifiers|Identifier]] ":"
+
+Note_values ::= {Note_item ","...}+
+
+Note_item ::= [[#Identifiers|Identifier]] | [[#Manifest constants|Manifest_constant]]
+
+===Class headers ===
+Class_header ::= class [[#Class names|Class_name]]
+
+Header_mark ::= deferred | expanded | frozen
+
+===Obsolete marks ===
+Obsolete ::= obsolete Message
+
+Message ::= [[#Manifest strings|Manifest_string]]
+
+===Feature parts ===
+Features ::= Feature_clause+
+
+Feature_clause ::= feature frozenend
+
+Feature_body ::= [[#Routine bodies|Deferred]] | [[#Routine bodies|Effective_routine]] | [[#Attribute bodies|Attribute]]
+
+
+===Feature names ===
+Extended_feature_name ::= Feature_name alias '"' Alias_name '"' convertnot | "+" | "-" | Free_unary
+
+Binary ::= and | or | xor | and then | or else | implies | Free_binary
+
+{{note| Free_unary and Free_binary are free operators that are distinct from (respectively) the ''standard'' unary and binary operators (one- or two-character symbols) explicitly listed in the Unary and Binary productions. See ''Definition: Free operator'' in the standard for more precision.}}
+
+
+===Assigner marks ===
+Assigner_mark ::= assign [[#Feature names|Feature_name]]
+
+
+===Inheritance parts ===
+Inheritance ::= Inherit_clause+
+
+Inherit_clause ::= inherit end
+
+
+
+===Rename clauses ===
+Rename ::= rename Rename_list
+
+Rename_list ::= {Rename_pair "," ...}+
+
+Rename_pair ::= [[#Feature names|Feature_name]] as [[#Feature names|Extended_feature_name]]
+
+
+===Clients ===
+Clients ::= "{" Class_list "}"
+
+Class_list ::= {[[#Class names|Class_name]] "," ...}+
+
+
+
+===Export adaptation ===
+New_exports ::= export New_export_list
+
+New_export_list ::= {New_export_item ";" ...}+
+
+New_export_item ::= [[#Clients|Clients]] all
+
+Feature_list ::= {[[#Feature names|Feature_name]] "," ...}+
+
+
+
+===Formal argument and entity declarations ===
+Formal_arguments ::= "(" [[#Formal argument and entity declarations|Entity_declaration_list]] ")"
+
+Entity_declaration_list ::= {Entity_declaration_group ";" ...}+
+
+Entity_declaration_group ::= Identifier_list [[#Feature declarations|Type_mark]]
+
+Identifier_list ::= {[[#Identfiers|Identifier]] "," ...}+
+
+
+===Routine bodies ===
+Deferred ::= deferred
+
+Effective_routine ::= Internal | [[#External routines|External]]
+
+Internal ::= Routine_mark [[#Instructions|Compound]]
+
+Routine_mark ::= do | Once
+
+Once ::= once local require elseensure theninvariant Assertion
+
+Assertion ::= {Assertion_clause ";" ...}*
+
+Assertion_clause ::= old [[#Expressions|Expression]]
+
+
+==="Only" postcondition clauses ===
+Only ::= only check [[#Assertions|Assertion]] end
+
+
+===Variants ===
+Variant ::= variant Precursor [Parent_qualification] redefine [[#Export adaptation|Feature_list]]
+
+
+===Undefine clauses ===
+Undefine ::= undefine [[#Export adaptation|Feature_list]]
+
+
+===Types ===
+Type ::= Class_or_tuple_type | [[#Formal generic parameters|Formal_generic_name]] | Anchored
+
+Class_or_tuple_type ::= Class_type | [[#Tuple types|Tuple_type]]
+
+Class_type ::= [Attachment_mark] [[#Class names|Class_name]] like Anchor
+
+Anchor ::= [[#Feature names|Feature_name]] | Current
+
+
+===Actual generic parameters ===
+Actual_generics ::= frozenend
+
+Multiple_constraint ::= "{" Constraint_list "}"
+
+Constraint_list ::= {Single_constraint "," ...}+
+
+Constraint_creators ::= create [[#Export adaptation|Feature_list]] end
+
+
+===Manifest arrays ===
+Manifest_array ::= << Expression_list >>
+
+Manifest_array_type ::= { [[#Types|Type]] }
+
+Expression_list ::= {[[#Expressions|Expression]] , ...}*
+
+
+===Tuple types ===
+Tuple_type ::= TUPLE convert Converter_list
+
+Converter_list ::= {Converter ","...}+
+
+Converter ::= Conversion_procedure | Conversion_query
+
+Conversion_procedure ::= [[#Feature names|Feature_name]] "(" "{" [[#Actual generic parameters|Type_list]] "}" ")"
+
+Conversion_query ::= [[#Feature names|Feature_name]] ":" "{" [[#Actual generic parameters|Type_list]] "}"
+
+
+===Select clauses ===
+Select ::= select [[#Export adaptation|Feature_list]]
+
+
+===Conditionals ===
+Conditional ::= if Then_part_list end
+
+Then_part_list ::= {Then_part elseif ...}+
+
+Then_part ::= [[#Expressions|Boolean_expression]] then [[#Instructions|Compound]]
+
+Else_part ::= else [[#Instructions|Compound]]
+
+
+Conditional_expression ::= if Then_part_expression_list else [[#Expressions|Expression]] end
+
+Then_part_expression_list ::= {Then_part_expression elseif ...}+
+
+Then_part_expression ::= [[#Expressions|Boolean_expression]] then [[#Expressions|Expression]]
+
+
+===Multi-branch instructions ===
+Multi_branch ::= inspect [[#Expressions|Expression]] end
+
+When_part_list ::= When_part+
+
+When_part ::= when Choices then [[#Instructions|Compound]]
+
+Choices ::= {Choice "," ...}+
+
+Choice ::= [[#Constants|Constant]] | [[#Manifest constants|Manifest_type]] | Constant_interval | Type_interval
+
+Constant_interval ::= [[#Constants|Constant]] ".." [[#Constants|Constant]]
+
+Type_interval ::= [[#Manifest constants|Manifest_type]] ".." [[#Manifest constants|Manifest_type]]
+
+
+===Loops ===
+Loop ::=end
+
+Iteration ::= across [[#Expressions|Expression]] as [[#Identfiers|Identifier]]
+
+Initialization ::= from [[#Instructions|Compound]]
+
+Exit_condition ::= until [[#Expressions|Boolean_expression]]
+
+Loop_body ::=loop [[#Instructions|Compound]] |all [[#Expressions|Boolean_expression]] |some [[#Expressions|Boolean_expression]]
+
+
+===Debug instructions ===
+Debug ::= debug end
+
+
+===Attribute bodies ===
+Attribute ::= attribute [[#Instructions|Compound]]
+
+
+===Entities and variables ===
+Entity ::= Variable | Read_only
+
+Variable ::= Variable_attribute | Local
+
+Variable_attribute ::= [[#Feature names|Feature_name]]
+
+Local ::= [[#Identfiers|Identifier]] | Result
+
+Read_only ::= Formal | Constant_attribute | Current
+
+Formal ::= [[#Identfiers|Identifier]]
+
+Constant_attribute ::= [[#Feature names|Feature_name]]
+
+
+===Creators parts ===
+Creators ::= Creation_clause+
+
+Creation_clause ::= create create create [[#Creation instructions|Explicit_creation_type]] ( [[#Expressions|Expression]] )
+
+Non_object_call ::= "{" [[#Types|Type]] "}" "." Unqualified_call
+
+
+===Actual arguments ===
+Actuals ::= "(" Actual_list ")"
+
+Actual_list ::= {[[#Expressions|Expression]] "," ...}+
+
+
+===Object test ===
+Object_test ::= "{" [[#Identfiers|Identifier]] ":" [[#Types|Type]] "}" [[#Expressions|Expression]]
+
+
+===Rescue clauses ===
+Rescue ::= rescue [[#Instructions|Compound]]
+
+Retry ::= retry
+
+
+===Agents ===
+Agent ::= Call_agent | Inline_agent
+
+Call_agent ::= agent [[#Call agent bodies|Call_agent_body]]
+
+Inline_agent ::= agent once [[#Manifest strings|Manifest_string]]
+
+Boolean_expression ::= Basic_expression | [[#Manifest constants|Boolean_constant]] | [[#Object test|Object_test]]
+
+
+===Operator expressions ===
+Operator_expression ::= Unary_expression | Binary_expression
+
+Unary_expression ::= Unary Expression
+
+Binary_expression ::= [[#Expressions|Expression]] [[#Operators|Binary]] [[#Expressions|Expression]]
+
+
+===Bracket expressions ===
+Bracket_expression ::= Bracket_target "[" [[#Actual arguments|Actuals]] "]"
+
+Bracket_target ::= [[#Feature calls|Target]] | [[#Expressions|Once_string]] | [[#Manifest constants|Manifest_constant]] | [[#Manifest tuples|Manifest_tuple]]
+
+
+===Constants ===
+Constant ::= [[#Manifest constants|Manifest_constant]] | Constant_attribute
+
+Constant_attribute ::= [[#Feature names|Feature_name]]
+
+
+===Manifest constants ===
+Manifest_constant ::= [Manifest_type] Manifest_value
+
+Manifest_type ::= "{" [[#Types|Type]] "}"
+
+Manifest_value ::= Boolean_constant |
+Character_constant |
+Integer_constant |
+Real_constant |
+[[#Manifest strings|Manifest_string]] |
+Manifest_type
+
+Sign ::= "+" | "-"
+
+Integer_constant ::= True | False
+
+Real_constant ::= external External_language alias [[#Manifest strings|Manifest_string]]
+{{note|If the `inline` keyword is used in the Registered_language part, then External_name part is the inline code on the specified language.}}
+
+
+===Registered languages ===
+Registered_language ::= [[#C externals|C_external]] | [[#C++ externals|C++_external]] | [[#DLL externals|DLL_external]]
+
+
+===External signatures ===
+External_signature ::= signature use External_file_list
+
+External_file_list ::= {External_file "," C inline] C++ inline dll windows-compat command line option or through the EiffelStudio choices provided through the Microsoft Windows ''Start'' button. }}
+
+
+==Important changes to library classes==
+
+
+===Class ARRAY===
+
+====New preconditions====
+
+Some additional preconditions are in force in ARRAY in void-safe mode.
+
+In void-unsafe mode, the behavior is equivalent to that of previous versions.
+
+====Feature make_from_special====
+
+The signature of this routine has changed.
+
+Current signature: make_from_special (a: SPECIAL [G])
+
+Previous signature: make_from_special (a: SPECIAL [G]; min_index, max_index: INTEGER)
+
+Using the current version will create an array with a range from 1 to the number of elements in the argument `a`.
+
+====Feature auto_resize====
+
+This implementation (private) feature has been removed.
+
+
+===Class ARRAYED_LIST===
+
+====Relationship to ARRAY====
+
+Previously ARRAYED_LIST conformed to ARRAY. This is no longer the case. The feature {ARRAYED_LIST}.to_array can be used to produce an instance of ARRAY from an instance of ARRAYED_LIST.
+
+====Features count and area====
+
+Previously these two queries, count and area, were attributes. They are now functions.
+
+
+===Class HASH_TABLE===
+
+The internal implementation has changed in ways that cause the order of traversal to differ from previous versions.
+
+
+===Classes SPECIAL and TO_SPECIAL===
+
+====Feature {SPECIAL}.make====
+
+This void-unsafe feature has been removed.
+
+In its place, the creation procedures {SPECIAL}.make_filled and {SPECIAL}.make_empty can be used.
+
+{SPECIAL}.make_filled is available in both ''default'' and ''compatible'' modes. Use this creation procedure if you want code that is compatible with both modes.
+
+{SPECIAL}.make_empty is available in ''default'' mode only.
+
+====Feature {TO_SPECIAL}.make_area====
+
+In order to reflect the above change to class SPECIAL, the make_area feature of TO_SPECIAL has been removed in favor of {TO_SPECIAL}.make_filled_area and {TO_SPECIAL}.make_empty_area.
+
+The availability of {TO_SPECIAL}.make_filled_area and {TO_SPECIAL}.make_empty_area corresponds to that noted above for the creation features of SPECIAL:
+
+{TO_SPECIAL}.make_filled_area is available in both ''default'' and ''compatible'' modes. Use make_filled_area for code that needs to compile in both modes.
+
+{TO_SPECIAL}.make_empty_area is available only in ''default'' mode.
+
+====Relationship of feature {SPECIAL}.count to {SPECIAL}.capacity====
+
+In previous versions, for a particular instance of SPECIAL the queries count and capacity yielded the same value.
+
+This is no longer always true. If an instance of SPECIAL is created with, for example, make_empty (10), although the capacity will be 10, the count will be zero.
+
+However creating a SPECIAL using make_filled will produce an instance in which count and capacity are equal upon creation. So the behavior is similar to that of previous versions. Also, make_filled is available in both ''default'' and ''compatible'' modes.
+
+If your code depends upon count and capacity having the same value, then you can use make_filled for creation. And then if you need resizing, use the "_with_default" versions of the "resized" features, specifically resized_area_with_default and aliased_resized_area_with_default.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/converting-existing-software-void-safety/index.wiki b/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/converting-existing-software-void-safety/index.wiki
new file mode 100644
index 00000000..f754eaf0
--- /dev/null
+++ b/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/converting-existing-software-void-safety/index.wiki
@@ -0,0 +1,335 @@
+[[Property:title|Converting existing software to void-safety]]
+[[Property:weight|6]]
+[[Property:uuid|eb901272-d405-2277-005d-e37275b9baa4]]
+If you have been using Eiffel for a while, you may be maintaining systems which were developed before Eiffel became void-safe. If that's the case, then you will probably want to make those systems void-safe.
+
+In this section we will use the experience of converting a set of simple (but not too simple) legacy Eiffel classes to show the types of issues that you may encounter, and how to deal with them.
+
+So in the discussion below, you will see references to these classes:
+
+
+{| border="1"
+|-
+! Class name
+! Description
+|-
+| APPLICATION
+| Simple root class containing declarations of types NVP and NVP_LIST
+|-
+| NVP
+| Class modeling name/value pairs of type STRING
+|-
+| NVP_LIST
+| Class modeling a list of NVP's with specialized behavior; heir of TWO_WAY_LIST [NVP]
+|}
+
+
+It's not important that you know much about the details of these classes. We will, however, look at certain parts of the classes in enough detail to resolve the conversion issues.
+
+
+=Conversion considerations=
+
+==To redesign or not to redesign==
+
+During the process of conversion of classes to void-safety, the compiler will point out problems which you will have to fix. Some of these will be straightforward, while others may be tricky. It is natural, or sometimes mandatory, at times to consider changing elements of the design of your software.
+
+Also, as you sift through your existing software during the void-safe conversion, you may not get very far before you see things that you wish had been done differently. This occurs often during reviews of existing systems, not just because of the introduction of void-safety.
+
+In the discussions that follow you will see these redesign opportunities arise, and the decisions that were made for these cases.
+
+==Be aware of changes to Eiffel libraries==
+
+The libraries distributed with EiffelStudio have been converted to support void-safety. Mostly the changes made will cause no problems for existing software. However a few changes have been identified as "breaking" changes. You may or may not encounter the effects of these changes, but you should be aware of how they could effect your software and what options you have for adapting to them. Breaking changes are described in the [[EiffelStudio release notes]] and in the page dedicated to [[Void-safe changes to Eiffel libraries]].
+
+=Conversion process=
+
+==Enable full class checking==
+
+First make sure your project will compile correctly under the configuration of EiffelStudio that you intend to use to convert to void-safe.
+
+Then set the project setting '''Full Class Checking''' to '''True'''. Do a ''[[Clean compile|clean compile]]'' of your system.
+
+Full class checking will analyze your classes to make sure that in cases of inheritance, features of the parent classes are rechecked for validity in the heirs.
+
+Here's an example of the kind of error you might expect when compiling with full class checking:
+
+
+[[Image:VGCC error]]
+
+
+The situation here is that the feature split has been inherited (from class TWO_WAY_LIST [G]) by our class NVP_LIST. Feature split includes code to create and attach feature sublist which is typed attached like Current which in this case means attached NVP_LIST. To do this creation, split uses a creation procedure make_sublist.
+
+Now here's the rub: NVP_LIST has not named make_sublist as a creation procedure:
+
+create
+ make, make_from_string, make_from_file_named
+
+If we go to the create part of NVP_LIST and add make_sublist to its list of creation procedures, this will fix the problem:
+
+create
+ make, make_from_string, make_from_file_named, make_sublist
+
+
+So, fix any problems that arise out of turning on full class checking.
+
+==Enable other project settings==
+
+The second step in conversion of existing software is to change the values of the other void-safe related project settings and use the void-safe configurations for any delivered libraries and precompilations.
+
+In the project settings for the target in which you are working, set '''Void safety''' to '''Complete''', '''Transitional''' , '''Initialization''' or '''Conformance'''.
+
+{{note|Remember that during a transitional period starting with v6.4, there will be multiple versions of the configuration files for Eiffel libraries and precompiles. For example, base.ecf (void-unsafe) and base-safe.ecf (void-safe). Starting with v16.11 there is only one configuration file for libraries (e.g., base.ecf) that works with both void-safe and void-unsafe client software, but if you are using a precompile, there could be different versions for void-safe and void-unsafe precompiles.}}
+
+If necessary, remove Eiffel libraries and any precompiled library that your project uses and re-add them with their void-safe configuration files. Because you've set your target to void-safety, when you click '''Add Library''', you should see only void-safe configurations by default.
+You will see a check box on the dialog that you can uncheck if you want to see all available library configurations:
+
+
+[[Image:VoidSafeAddLibraryDialog]]
+
+
+Now do a [[Clean compile|clean compile]].
+
+If you've replaced a precompiled library that you have not already built, EiffelStudio will offer to build it for you on the fly:
+
+
+[[Image:VoidSafePrecompileOffer]]
+
+
+Now you should see error messages representing any situation in your project in which the compiler determines that it cannot guarantee void-safety.
+
+This is what our legacy system produced:
+
+
+[[Image:VoidSafeErrorList]]
+
+
+==Fix the issues==
+
+Next you fix the problems that the compiler discovered. The compiler errors concerning void-safety typically will be of three varieties.
+
+# VEVI: violations of the '''Variable initialization rule'''. An attached variable is not '''properly set'''.
+# VUTA: violations of the '''Target rule'''. The target of a feature call is not attached.
+# VJAR (and other related codes): violations of attached status considered in conformance. The attachment status of the source of an assignment (or an argument to a feature call) is not compatible with that of the target of the assignment (or the formal argument).
+
+Let's look at some specific cases and how fixing them unfolds.
+
+===Variables not properly set===
+
+[[Image:VoidSafeVEVI1]]
+
+
+There are two VEVI errors like this in class APPLICATION of our legacy system. They are probably the most obvious and easiest cases to handle.
+
+
+feature {NONE} -- Initialization
+
+ make
+ -- Run application.
+ do
+ ...
+ end
+
+feature -- Access
+
+ my_nvp: NVP
+ -- NVP for testing
+
+ my_nvp_list: NVP_LIST
+ -- NVP_LIST for testing
+
+
+Here attribute declarations for my_nvp and my_nvp_list are made. These are assumed to be attached because of the project setting. But the create routine make fails to create objects and attach them. So by adding those creations, as shown below, the compiler is satisfied.
+
+
+ make
+ -- Run application.
+ do
+ create my_nvp.make ("SomeName", "SomeValue")
+ create my_nvp_list.make
+ ...
+ end
+
+
+
+In a second case, there is also an Initialization rule violation (VEVI), this time on Result, in this routine:
+
+
+ at_first (nm: STRING): NVP
+ -- The first found NVP with name matching nm.
+ -- Or Void if not found
+ require
+ nm_valid: nm /= Void and then not nm.is_empty
+ local
+ tc: CURSOR
+ do
+ tc := cursor
+ start
+ name_search (nm)
+ if not exhausted then
+ Result := item
+ end
+ go_to (tc)
+ ensure
+ index_unchanged: index = old index
+ end
+
+
+Here we cannot just ensure that Result is always attached, because, as indicated by the header comment, Result is allowed to be void by design.
+
+So the least impact to this routine will be to declare its type as detachable:
+
+
+ at_first (nm: STRING): detachable NVP
+ -- The first found NVP with name matching nm.
+ -- Or Void if not found
+
+
+
+The same change is made in other routines that can return void by design, particularly including a routine called value_at_first, which gets our attention next.
+
+The case of at_first offered us an opportunity to redesign (or not). We might have been able to leave at_first attached. After all, in void-safe software, the fewer detachables, the better. Maybe we could devise a way, possibly through preconditions and other queries, that would guarantee that at_first attempts to execute only when it can return a value.
+
+But at_first is an exported query, so a consequence of such a change in the class design is that it would affect the class interface in such a way that existing clients would have to be modified to comply. In other words, it would be a "breaking" change.
+
+
+===Source of assignment does not conform to target===
+
+The change to at_first satisfies the VEVI issue in at_first, but it introduces a previously unseen conformance issue (VJAR) in the routine value_at_first:
+
+
+[[Image:VoidSafeVJAR1]]
+
+
+value_at_first looks like this:
+
+
+ value_at_first (nm: STRING): detachable STRING
+ -- Value from first found NVP with name matching nm
+ -- Or Void of not found
+ require
+ nm_valid: nm /= Void and then not nm.is_empty
+ local
+ tn: NVP
+ do
+ tn := at_first (nm)
+ if tn /= Void then
+ Result := tn.value
+ end
+ end
+
+
+The problem is that the local variable tn is declared as attached, but we know that now the result of at_first is detachable, making this assignment invalid:
+
+ tn := at_first (nm)
+
+
+Here the '''attached syntax''' can fix the problem and streamline the routine:
+
+
+ value_at_first (nm: STRING): detachable STRING
+ -- Value from first found NVP with name matching nm
+ -- Or Void of not found
+ require
+ nm_valid: nm /= Void and then not nm.is_empty
+ do
+ if attached at_first (nm) as tn then
+ Result := tn.value
+ end
+ end
+
+
+In this version tn need not be declared as a local variable. Remember that the attached syntax provides a fresh local variable, if the expression is not void.
+
+===Both VEVI and VJAR errors===
+
+A design issue in class NVP_LIST causes both conformance and initialization compiler errors. In the original design, an instance of the class NVP_LIST could traverse its contents NVP-by-NVP with inherited functionality. Additionally, NVP_LIST has immediate functionality allowing an instance to traverse its contents in two different ways returning "sublists" based on recurring patterns of the name attributes of a sequence of name/value pairs.
+
+These two traversal methods are referred to as "sequencing" and "segmenting". It's not important that you understand the details of what these traversals do. But it is important to know that a valid instance of NVP_LIST can either be in the process of sequencing or in the process of segmenting, or neither. It is invalid to be both sequencing ''and'' segmenting.
+
+Two class attributes are maintained to store the recurring patterns of values of {NVP}.name that guide traversal:
+
+
+feature {NONE} -- Implementation
+
+ sequence_array: ARRAY [STRING]
+ -- The current array of names being used for
+ -- sequence traversal
+
+ segment_array: ARRAY [STRING]
+ -- The current array of names being used to determine
+ -- the termination of list segments
+
+
+In the original class design, each of these attributes would be void unless their corresponding traversal was active. So the class contains the following clauses in its invariant:
+
+
+ not_sequencing_and_segmenting: not (segment_readable and sequence_readable)
+ sequence_traversal_convention: (sequence_array = Void) = (not sequence_readable)
+ segment_traversal_convention: (segment_array = Void) = (not segment_readable)
+
+
+Of course by default these attributes are considered to be attached. So, because they are not initialized during creation, we see initialization errors. Because elements of the class intentionally set them to Void, we see conformance errors.
+
+Here we have another opportunity to redesign (or not). We could mark the two arrays as detachable, recompile and fix any problems this causes (in fact, it causes eight errors: six Target rule violations, and two conformance issues).
+
+However, because these attributes are not exported, we may be able to leave them attached and make changes to the implementation design without making breaking changes to the interface.
+
+Those exported features which take arguments of the type ARRAY [STRING] which will serve as sequencing or segmenting control also require that the array contain at least one element. For example, the contract for feature segment_start contains these preconditions:
+
+
+ segment_start (nms: ARRAY [STRING_8])
+ -- Place segment cursor on the first occurrence of a seqment of list which
+ -- begins at the current cursor position and
+ -- terminates in a sequence with names equivalent to and ordered the same as `nms'.
+ -- If no such sequence exists, then ensure exhausted
+ require
+ nms_valid: nms /= Void and then (nms.count > 0)
+ not_sequencing: not sequence_readable
+
+
+Because the restriction always exists that a valid sequence_array or segment_array must contain at least one element, it is possible to redesign the implementation of the class such that an empty sequence_array and segment_array could serve the same purpose as a Void one does in the original design.
+
+So the invariant clauses that we saw above would now become:
+
+
+ not_sequencing_and_segmenting: not (segment_readable and sequence_readable)
+ sequence_traversal_convention: (sequence_array.is_empty) = (not sequence_readable)
+ segment_traversal_convention: (segment_array.is_empty) = (not segment_readable)
+
+
+We already have compiler errors (VJAR's) that point us to those places in which we have code that sets either sequence_array or segment_array to Void. Like this:
+
+
+ segment_array := Void
+
+
+These instances need to be changed to attach an empty array, maybe like this:
+
+
+ create segment_array.make (1, 0)
+
+
+Additionally, some postconditions which reference the implementation features sequence_array and/or segment_array would have to be changed. Looking at the postcondition clauses for segment_start we see that segment_array is expected (or not) to be Void:
+
+
+ ensure
+ started: (not exhausted) implies (segment_readable and (segment_array /= Void) and (last_segment_element_index > 0))
+ not_started: exhausted implies ((not segment_readable) and (segment_array = Void) and (last_segment_element_index = 0))
+
+
+To support the "empty array" design, segment_start's postcondition clauses would be:
+
+
+ ensure
+ started: (not exhausted) implies (segment_readable and (not segment_array.is_empty) and (last_segment_element_index > 0))
+ not_started: exhausted implies ((not segment_readable) and (segment_array.is_empty) and (last_segment_element_index = 0))
+
+
+
+
+{{SeeAlso|LIST [G]. The formal generic parameter G represents an arbitrary type. In a generic derivation of LIST [G], say LIST [STRING], the formal generic type is replaced by an actual generic type, in this case STRING.
+
+Remember that unconstrained genericity, LIST [G], for example, is really a case of [[ET: Inheritance#Constrained genericity|constrained genericity]] in which the generic parameter is constrained to ANY, that is, it could be written LIST [G -> ANY].
+
+With the advent of void-safe Eiffel, the unconstrained generic class name LIST [G] now equates to LIST [G -> detachable ANY]. Because any type, say T, (synonymous with attached T in void-safe Eiffel) conforms to detachable T, this change facilitates the production of generic classes, but has little effect on writers of clients to those classes.
+
+This change works for all the generic classes in EiffelBase ... except for one: ARRAY. Arrays are a special case because we often create arrays with a pre-allocated number of elements. In the case of expanded types, there's not a problem. For example, in this code
+
+ my_array: ARRAY [INTEGER]
+ ...
+ create my_array.make (1, 100)
+
+we create my_array with one hundred INTEGER elements. INTEGER is an expanded type, and each element is initialized by applying the default initialization rule for INTEGER, i.e, the integer representation of zero.
+
+However, if my_array had been declared of a type with reference semantics, say STRING (meaning, of course, attached STRING, the default rule would not work well, because the default initialization for references types is Void which would not be allowed in an array of elements of any attached type.
+
+The solution to this challenge is fairly simple. For arrays of elements of detachable or expanded types, there is no different behavior. When dealing with arrays of elements of attached types, we must be careful.
+
+Creating an array using ARRAY's creation procedure make may still be safe in some cases. Specifically, make can be used with arrays of elements of attached types if the arguments have values such that an empty array will be created, that is, when
+
+ min_index = max_index + 1
+
+
+In all other situations involving arrays of elements of attached types, make may not be used to do the creation. Rather, you should use the creation procedure make_filled which takes three arguments. The first is an object of the type of the array, and the second and third are the minimum and maximum indexes, respectively. When the array is created, each of the elements will be initialized with a reference to the object of the first argument.
+
+So, a call using make_filled would look like this:
+
+ my_array: ARRAY [STRING]
+ ...
+ create my_array.make_filled (" ", 1, 100)
+
+Upon creation, each element of the array will reference the same object; an object of type STRING composed of one space character.
+
+
+==Using the ''attribute'' keyword carefully==
+
+The keyword attribute should be used with some care. You might be tempted to think that it would be convenient or add an extra element of safety to use [[Void-safety: Background, definition, and tools#Self-initializing attributes|self-initializing attributes]] widely. And in a way, you would be correct. But you should also understand that there is a price to pay for using self-initializing attributes and stable attributes. It is that upon every access, an evaluation of the state of the attribute must be made. So, as a general rule, you should avoid using self-initializing attributes only for the purpose of lazy initialization.
+
+
+==More about the ''attached syntax''==
+
+The complete attached syntax is:
+
+ attached {SOME_TYPE} exp as l_exp
+
+In this section, we will see more ways in which to use this versatile language facility.
+
+===As a CAP-like construct which yields a local variable===
+
+In the introduction to the attached syntax, we used an example which showed how the attached syntax is directly relevant to void-safety. That is, the code:
+
+ if x /= Void then
+-- ... Any other instructions here that do not assign to x
+ x.f (a)
+ end
+
+
+is a CAP for x ... but that's only true if x is a local variable or a formal argument to the routine that contains the code.
+
+So to access a detachable attribute safely, we could declare a local variable, make an assignment, and test for Void as above. Something like this:
+
+ my_detachable_attribute: detachable MY_TYPE
+
+ ...
+ some_routine
+ local
+ x: like my_detachable_attribute
+ do
+ x := my_detachable_attribute
+ if x /= Void then
+-- ... Any other instructions here that do not assign to x
+ x.f (a)
+ end
+ ...
+
+The attached syntax can both check the attached status of a detachable attribute and also provide a new local variable. So the routine becomes:
+
+ some_routine
+ do
+ if attached my_detachable_attribute as x then
+-- ... Any other instructions here that do not assign to x
+ x.f (a)
+ end
+ ...
+
+
+===As a test for attachment===
+
+In its simplest form, the attached syntax can be used to test attached status only:
+
+ if attached x then
+ do_something
+ else
+ do_something_different
+ end
+
+
+So in this simple form, attached x can be used instead of x /= Void. The two are semantically equivalent, and which one you choose is a matter of personal preference.
+
+
+===As a tool for "once per object"===
+
+There is a code pattern for functions that exists in some Eiffel software to effect "once-per-object / lazy evaluation".
+
+{{note|As of EiffelStudio version 6.6, the use of this code pattern effecting "once per object" is no longer necessary. V6.6 includes explicit support for once routines which can be adjusted by a [[ET: Once routines and shared objects#Adjusting once semantics with "once keys"|once key]] to specify once per object.}}
+
+This "once-per-object" code pattern employs a cached value for some object which is not exported. When it is applied, the "once-per-object" function checks the attachment status of the cached value. If the cached value is void, then it is created and assigned to Result. If the cached value was found already to exist, then it is just assigned to Result.
+
+Here's an example of this pattern used to produce some descriptive text of an instance of its class:
+
+
+feature -- Access
+
+ descriptive_text: STRING
+ local
+ l_result: like descriptive_text_cache
+ do
+ l_result := descriptive_text_cache
+ if l_result = Void then
+ create Result.make_empty
+ -- ... Build Result with appropriate
+ -- descriptive text for Current.
+ descriptive_text_cache := Result
+ else
+ Result := l_result
+ end
+ ensure
+ result_attached: Result /= Void
+ result_not_empty: not Result.is_empty
+ result_consistent: Result = descriptive_text
+ end
+
+feature {NONE} -- Implementation
+
+ descriptive_text_cache: like descriptive_text
+
+
+This example will not compile in a void-safe project (class types are attached by default). The problem is that the attribute descriptive_text_cache is of an attached type, therefore will be flagged by the compiler as not properly set (VEVI). Of course, it will be ... that's the whole idea here: not to initialize descriptive_text_cache until it's actually used. So it sounds like descriptive_text_cache should be declared detachable. That is:
+
+ descriptive_text_cache: detachable like descriptive_text
+
+This change will make this routine compile in a void-safe project. But you should notice that there is a ripple-down effect due to the change. Within the routine, l_result is typed like descriptive_text_cache, so it also will be detachable. Therefore we might expect trouble, because later in the routine we have:
+
+ Result := l_result
+
+Because we know Result is attached and l_result is detachable, we might expect a compiler error in which the source of an assignment does not conform to its target (VJAR).
+
+But we don't get such an error. The reason is two-fold. First, l_result is a local variable whose use can be protected by a CAP. Second, the CAP in this case is the check to ensure that l_result is not void. We only make the assignment to Result if l_result is not void. So the compiler can prove that l_result cannot be void at the point at which the assignment occurs ... therefore, no error.
+
+Because the '''attached syntax''' can test attached status and provide a local variable, it can be used to remove some unnecessary code from this routine. The version of the routine that follows shows the attached syntax being used to test the attached status of descriptive_text_cache and yield the local variable l_result in the case that descriptive_text_cache is indeed attached.
+
+ descriptive_text: STRING
+ do
+ if attached descriptive_text_cache as l_result then
+ Result := l_result
+ else
+ create Result.make_empty
+ -- ... Build Result with appropriate
+ -- descriptive text for Current.
+ descriptive_text_cache := Result
+ end
+ ensure
+ result_attached: Result /= Void
+ result_not_empty: not Result.is_empty
+ result_consistent: Result = descriptive_text
+ end
+
+feature {NONE} -- Implementation
+
+ descriptive_text_cache: like descriptive_text
+
+
+
+
+===As a replacement for assignment attempt===
+
+The assignment attempt ( ?= ) has traditionally been used to deal with external objects (e.g., persistent objects from files and databases) and to narrow the type of an object in order to use more specific features. The latter is a process known by names such as "down casting" in some technological circles. A classic example is doing specific processing on some elements of a polymorphic data structure. Let's look at an example. Suppose we have a LIST of items of type POLYGON:
+
+ my_polygons: LIST [POLYGON]
+
+POLYGONs could be of many specific types, and one of those could be RECTANGLE. Suppose too that we want to print the measurements of the diagonals of all the RECTANGLEs in the list. Class RECTANGLE might have a query diagonal returning such a measurement, but POLYGON would not, for the reason that the concept of diagonal is not meaningful for all POLYGONs, e.g., TRIANGLEs.
+
+As we traverse the list we would use assignment attempt to try to attach each POLYGON to a variable typed as RECTANGLE. If successful, we can print the result of the application of diagonal.
+
+ l_my_rectangle: RECTANGLE
+
+ ...
+ from
+ my_polygons.start
+ until
+ my_polygons.exhausted
+ loop
+ l_my_rectangle ?= my_polygons.item
+ if l_my_rectangle /= Void then
+ print (l_my_rectangle.diagonal)
+ print ("%N")
+ end
+ my_polygons.forth
+ end
+
+The '''attached syntax''' allows us to check both attached status and type, and provides us with a fresh local variable when appropriate:
+
+ from
+ my_polygons.start
+ until
+ my_polygons.exhausted
+ loop
+ if attached {RECTANGLE} my_polygons.item as l_my_rectangle then
+ print (l_my_rectangle.diagonal)
+ print ("%N")
+ end
+ my_polygons.forth
+ end
+
+As with the other examples of the '''attached syntax''', it is no longer necessary to make a declaration for the local variable, in this case l_my_rectangle.
+
+
+==More about CAPs==
+
+===Use of check instructions===
+
+In void-safe mode, the compiler will accept code that it can prove will only apply features to attached references at runtime ... and you help this process along by using the tools of void-safety, like attached types and CAPs. On the other hand, the compiler will reject code that it cannot guarantee is void-safe. Sometimes this may cause you a problem. There may be subtle situations in which you feel quite certain that a section of code will be free of void calls at runtime, but the compiler doesn't see it the same way, and rejects your code. In cases like this, you can usually satisfy the compiler by using check instructions.
+
+Technically speaking, check instructions are not CAPs. But they are useful in cases in which an entity is always expected to be attached at a certain point in the code. In the following example, the attribute my_detachable_any is detachable. But at the particular point at which it is the source of the assignment to l_result, it is expected always to be attached. If it is not attached at the time of the assignment, and therefore l_result becomes void, then an exception should occur. The check instruction provides this behavior.
+
+The following sample shows the check instruction at work. There are reasons why this is not the best use use of check in this case, and we will discuss that next.
+
+
+ -- A not-so-good example of using check.
+
+ my_detachable_any: detachable ANY
+ ...
+ my_attached_any: ANY
+ local
+ l_result: like my_detachable_any
+ do
+ l_result := my_detachable_any
+ check
+ attached l_result
+ end
+ Result := l_result
+ end
+
+
+Here the assertion in the check guarantees that l_result is attached at the time of its assignment to Result. If my_detachable_any is ever not attached to an object, then an exception will be raised.
+
+So what's wrong with the sample above? It would be fine in ''workbench'' code, but what happens if the code is in ''finalized'' mode, in which assertions are typically discarded?
+
+The answer is that the check in the sample above would no longer be effective, and the resulting executable would no longer be void-safe.
+
+The solution to this problem is found in a different form of the check instruction. Consider the same example, but this time using check ... then ... end:
+
+
+ -- A better way of using check.
+
+ my_detachable_any: detachable ANY
+ ...
+ my_attached_any: ANY
+ do
+ check attached my_detachable_any as l_result then
+ Result := l_result
+ end
+ end
+
+
+Here, in the improved version of the example, the check ... then ... end is used along with the attached syntax. This streamlines the code a bit by eliminating the need to declare a separate local entity, while achieving the same effect as the previous example. If my_detachable_any is attached at runtime, then the temporary variable l_result is created and attached to the same object. Then the body of the check ... then ... end is executed. If my_detachable_any is not attached, an exception occurs.
+
+Another important benefit, one that solves the problem with the original example, comes from the way in which check ... then ... end is handled by the compiler. The check ... then ... end form '''is always monitored, even if assertion checking is turned off at all levels''', as is usually done in finalized code.
+
+===Choosing CAPs versus the Attached Syntax===
+
+The attached syntax is convenient because it can check attached status and deliver a new local variable at the same time. But there are cases in which you might choose instead to define a local variable and use a CAP. Suppose you had code acting on several similar and detachable expressions, and you use the attached syntax in each case:
+
+ foobar
+ do
+ if attached dictionary_entry ("abc") as l_abc then
+ l_abc.do_something
+ end
+ if attached dictionary_entry ("def") as l_def then
+ l_def.do_something
+ end
+ if attached dictionary_entry ("ghi") as l_ghi then
+ l_ghi.do_something
+ end
+ end
+
+This routine causes three local variables to be allocated for the duration of routine foobar, one each for l_abc, l_def, and l_ghi. And it is no better to do this:
+
+ foobar
+ do
+ if attached dictionary_entry ("abc") as l_entry then
+ l_entry.do_something
+ end
+ if attached dictionary_entry ("def") as l_entry then
+ l_entry.do_something
+ end
+ if attached dictionary_entry ("ghi") as l_entry then
+ l_entry.do_something
+ end
+ end
+
+Even though the names are the same, still three separate local variables are allocated for foobar.
+
+In cases like this, you could effect a minor performance improvement by declaring one local variable and reusing it. In the following code, only one local variable is used and access to it is protected by the CAP if l_entry /= Void then.
+
+ foobar
+ local
+ l_entry: like dictionary_entry
+ do
+ l_entry := dictionary_entry ("abc")
+ if l_entry /= Void then
+ l_entry.do_something
+ end
+ l_entry := dictionary_entry ("def")
+ if l_entry /= Void then
+ l_entry.do_something
+ end
+ l_entry := dictionary_entry ("ghi")
+ if l_entry /= Void then
+ l_entry.do_something
+ end
+ end
+
+
+==Stable attributes==
+
+Remember that stable attributes are actually detachable attributes, with the difference that they can never be the target of an assignment in which the source is Void or anything that could have a value of Void.
+
+Stable attributes are useful in situations in which there are valid object life scenarios in which some particular attribute will never need an object attached, or will only need an object attached late in the scenario. So in this case, the attribute is used only under certain runtime conditions. Declaring these attributes as stable eliminates the need to make attachments during object creation. Yet once needed, that is, once the attribute is attached, it will always be attached.
+
+Also, you should remember that unlike other attributes, you can access stable attributes directly in a CAP:
+
+ my_stable_attribute: detachable SOME_TYPE
+ note
+ option: stable
+ attribute
+ end
+
+ ...
+
+ if my_stable_attribute /= Void then
+ my_stable_attribute.do_something
+ end
+
+ ...
+
+
+{{SeeAlso| [[Void-safety: Background, definition, and tools#Types as "attached" or "detachable"|Types as "attached" or "detachable"]].}}
\ No newline at end of file
diff --git a/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/index.wiki b/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/index.wiki
new file mode 100644
index 00000000..d819899f
--- /dev/null
+++ b/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/index.wiki
@@ -0,0 +1,23 @@
+[[Property:link_title|Void-safe programming]]
+[[Property:title|Void-safe programming in Eiffel]]
+[[Property:weight|10]]
+[[Property:uuid|a03568e8-eb79-70d7-04a3-6fd3ed7ac2b3]]
+=Void-safe software development using Eiffel: introduction=
+
+When you develop software in Eiffel, you can be assured (at compile time) that your system will not attempt (at run time) to apply a feature to a void reference -- or, in the terminology of other languages such as C, "dereference a null pointer".
+
+Throughout the history of Eiffel, new capabilities -- agents, the SCOOP concurrency mechanism and many others -- have added considerable expressive power to the languag,e while causing minimum impact on existing software. Void-safe Eiffel is such an innovation, which instead of adding new mechanisms ''removes'' a major source of instability in programs, present in all other major languages: null-pointer dereferencing. To say that Eiffel is void-safe means that such catastrophic yet common errors simply will not occur.
+
+There is in fact no need to speak of "void-safe Eiffel". The language is just Eiffel... and it is void-safe, just as it is statically typed. We still occasionally refer to "Void-safe Eiffel" simply because until 2005 or so Eiffel was not void-safe (it had to start somewhere), and you may still encounter older documentation that talks about "calls on void targets" (null-pointer dereferences). But in today's Eiffel such an event is impossible.
+
+The rest of this chapter explains void safety:
+
+# How is void-safety defined?
+# What are the specific elements of the mechanism?
+# How do these relate to Eiffel before void-safety?
+# What do I need to know to produce standard Eiffel software?
+# What do I need to know to convert my existing systems to be standard?
+
+
+
+
diff --git a/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/void-safety-background-definition-and-tools.wiki b/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/void-safety-background-definition-and-tools.wiki
new file mode 100644
index 00000000..4245f60c
--- /dev/null
+++ b/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/void-safety-background-definition-and-tools.wiki
@@ -0,0 +1,287 @@
+[[Property:link_title|Background and tools]]
+[[Property:title|Void-safety: Background, definition, and tools]]
+[[Property:weight|0]]
+[[Property:uuid|689f62b2-5675-5ab6-cd47-d891cf3d484d]]
+=Background=
+
+The primary focus of Eiffel is on software quality. Void-safety, like static typing, is another facility for improving software quality. Void-safe software is protected from run time errors caused by calls to void references, and therefore will be more reliable than software in which calls to void targets can occur. The analogy to static typing is a useful one. In fact, void-safe capability could be seen as an extension to the type system, or a step beyond static typing, because the mechanism for ensuring void-safety is integrated into the type system.
+
+==Static typing==
+
+You know that static typing eliminates a whole class of software failures. This is done by making an assurance at compile time about a feature call of the form:
+
+ x.f (a)
+
+Such a feature call is judged acceptable at compile time only if the type of x has a feature f and that any arguments, represented here by a, number the same as the formal arguments of f, and are compatible with the types of those formal arguments.
+
+
+In statically typed languages like Eiffel, the compiler guarantees that you cannot, at run time, have a situation in which feature f is not applicable to the object attached to x. If you've ever been a Smalltalk programmer, you are certainly familiar with this most common of errors that manifests itself as "Message not understood." It happens because Smalltalk is not statically typed.
+
+==Void-unsafe software==
+
+Static typing will ensure that there is some feature f that can be applied at run time to x in the example above. But it does not assure us that, in the case in which x is a reference, that there will always be an object attached to x at any time x.f (a) is executed.
+
+This problem is not unique to Eiffel. Other environments that allow or mandate reference semantics also allow the possibility of void-unsafe run time errors. If you've worked in Java or .NET you may have seen the NullReferenceException. Sometimes you might have experienced this rather poetic sounding message: "Object reference not set to an instance of an object". In Eiffel you would see "Feature call on void target". All these are the hallmarks of run time errors resulting from void-unsafe software.
+
+{{note|If you need a review of difference between reference types and expanded types in Eiffel, see [[ET: The Dynamic Structure: Execution Model|the chapter of the Eiffel Tutorial dedicated to the Eiffel execution model]]. }}
+
+Of course this is not an issue with instances of expanded types, because these instances are indeed "expanded" within their parent objects. But we could not imagine a world with expanded types only. References are important for performance reasons and for modeling purposes. For example, consider that a car has an engine and a manufacturer. When we model cars in software, it might be appropriate for engines to be expanded types, as each car has one engine. But certainly the same is not true for manufacturer. Many cars can share, through a reference, a single manufacturer.
+
+So, references are necessary, but we want them to be trouble free.
+
+==Void-safe software==
+
+Void-safe software, then, is software in which the compiler can give assurance, through a static analysis of the code, that at run time whenever a feature is applied to a reference, that the reference in question will have an object attached. This means that the feature call
+
+ x.f (a)
+
+is valid only if we are assured that x will be attached to an object when the call executes.
+
+
+{{info|This validity rule is called the '''Target rule''', validity code VUTA, and is the primary rule for void-safety. In the following discussion, you will see that other validity rules are involved, too. You can see the formal definition of all validity rules in the [http://www.ecma-international.org/publications/standards/Ecma-367.htm ISO/ECMA standard document] available online. }}
+
+
+Once we have committed ourselves to this validity rule, we must have a strategy for complying with the rule.
+
+=Elements of the void-safe strategy=
+
+Here are the tools of void-safe trade. They will each be addressed in more detail throughout the documentation that follows. As you look at these elements it helps to try to think about things from the compiler's viewpoint ... after all, it is the compiler that we expect to give us the guarantee that our code is indeed void-safe.
+
+First let's look at a couple of approaches that won't work.
+
+It might occur to us that we could enforce compliance with the target rule by simply eliminating the concept of void references. But this would not be practical. Void is a valuable abstraction that is useful in many situations, such as providing void links in structures. So, we must keep void ... but we want to keep it under control.
+
+Another thought might be that we could just have the compiler do all the work for us. But would be impossibly time consuming for the compiler to investigate every conceivable execution path available to a system to make certain that every possible feature call was made on an attached reference.
+
+So, all of this boils down to the fact that we have to take some actions that help the compiler along. That's what the following are about.
+
+==Certified Attachment Patterns (CAPs)==
+
+We know that in the context of certain code patterns, it is clear that it would be impossible for a reference to be void. These patterns are identified and we call them CAPs, short for Certified Attachment Patterns. Here is a very straightforward example expressed in a syntax that should be familiar to all Eiffel developers:
+
+ if x /= Void then
+-- ... Any other instructions here that do not assign to x
+ x.f (a)
+ end
+
+Here a check is made to ensure x is not void. Then as long as no assignments to x are made in the interim, a feature f can be applied to x with the certainty that x will be attached at the time ... and importantly, this can be determined at compile time. So, we say that this code pattern is a CAP for x.
+
+
+It is important to understand that in this example (and with other CAPs), x is allowed to be a local variable or formal argument only. That is, x may not be an attribute or general expression (with one exception which we will see [[#Stable attributes|below]]). Direct access to class attribute references cannot be allowed via a CAP due to the fact that they could be set to void by a routine call in some execution path invoked by the intervening instructions or possibly even different process thread. In a later [[Void-safety: Background, definition, and tools#Types as "attached" or "detachable"|section]], we well see that this is not quite such a limitations as it may appear at this point.
+
+
+{{note|You will find more useful information about CAPs in [[Creating a new void-safe project#More about CAPs|More about CAPs]]. Learn how certain code patterns are determined to be CAPs in [[What makes a Certified Attachment Pattern]]. }}
+
+
+==The ''attached syntax'' (object test)==
+
+For the purposes of void-safety, the '''attached syntax''' does double duty for us. It allows us to make certain that a reference is attached, and it provides us a safe way to access objects that are attached to class attributes.
+
+We noted earlier that this code
+
+ if x /= Void then
+-- ... Any other instructions here that do not assign to x
+ x.f (a)
+ end
+
+creates a CAP for feature calls on x, but only if x is a local variable or a formal argument.
+
+By using the '''attached syntax''', we can perform an '''object test''' on a variable. That is, the attached syntax is a BOOLEAN expression which provides an answer to the question "Is x attached to an object?" At the same time, if indeed x is attached to an object, the attached syntax will deliver to us a fresh local variable, also attached to x's object, on which we can make feature calls.
+
+ if attached x as l_x then
+ l_x.f (a)
+ end
+
+In the example above, x is tested to make certain that it is attached. If so, the new local l_x becomes attached to the same object as x. And so the object can be used safely even if x is a class attribute. So, the attached syntax, is really another CAP, because it provides a clearly verifiable place for the application of features to targets that are guaranteed not to be void.
+
+
+{{note|The attached syntax has other syntax variations as well as other uses. These will be discussed [[Creating a new void-safe project#More about the attached syntax|later]]. }}
+
+
+One way to make sure we comply with the target rule would be always use a CAP or the attached syntax every time we want to apply a feature to a referenced object. That might work, but it falls among the impractical approaches to the problem ... it would break a very high percentage of existing Eiffel code, not to mention cluttering things up quite a bit.
+
+==Types as "attached" or "detachable"==
+
+Rather than trying to protect every feature call, Eiffel allows us to declare any variable as being of an '''attached type'''. This is an important extension to the Eiffel type system.
+
+In Eiffel prior to the introduction of void-safe facilities, any reference variable could be set to Void. So, all variables were considered '"detachable"'.
+
+The current standard Eiffel supports a mixture of '''attached''' and '''detachable''' types. When a variable is declared of an attached type, as in the following example, then the compiler will prevent it from being set to Void or set to anything that can be set to Void.
+
+
+ my_attached_string: attached STRING
+
+
+It is easy to imagine that the more declarations are of attached types, the easier it will be to guarantee that a call to a void target cannot take place at run time. In fact, if every declaration was guaranteed to be of an attached type, then that would be all that was needed to satisfy the Target rule.
+
+However, it wouldn't be workable to have only attached types, because sometimes it's important to allow references to have a value of Void.
+
+When it is necessary to allow Void as a value, a declaration can use the ''detachable mark'' as in the following.
+
+ my_detachable_string: detachable STRING
+
+
+
+This doesn't mean that on every declaration you must put either an ''attached mark'' or a ''detachable mark''. Declarations that are unmarked are allowed. If a declaration contains neither '''attached''' nor '''detachable''', then it is assumed to be '''attached'''.
+
+In Eiffel then, all declarations will have types that are either '''attached''' or '''detachable'''. As a result, we need only use CAPs and the attached syntax with detachable types. So the important thing to remember is that ''direct access to class attributes of detachable types is never void-safe.''
+
+===Attachment and conformance===
+
+The distinction between attached and detachable types results in a small but important addition to the rules of conformance. Because variables declared as attached types can never be void, then it is important not to allow any assignment of a detachable source to an attached target. However, assigning an attached source to a detachable target is permissible. The following code shows both cases (as described earlier, class types are attached by default).
+
+ my_attached_string: STRING
+ my_detachable_string: detachable STRING
+
+ ...
+
+ my_attached_string := my_detachable_string -- Invalid
+ my_detachable_string := my_attached_string -- Valid
+
+
+
+==Initialization rule==
+
+If we have attached types, then we can assume variables declared of these types, once attached, will always be attached. But how do they get attached in the first place? That's what the initialization rule is all about.
+
+The rule says that at any place in which a variable is accessed, it must be '''properly set'''. A variable's being properly set has a precise, but not particularly simple definition in the Eiffel standard.
+
+
+{{info|You can find the formal definition of the '''Variable initialization rule''', validity code VEVI, and its related concepts such as '''properly set''' variables in the [http://www.ecma-international.org/publications/standards/Ecma-367.htm ISO/ECMA standard document]. }}
+
+
+Still, it's not too hard to understand the basics of initializing variables of attached types:
+
+* For the initialization of attributes of a class, we can apply a rule similar to that of the initial evaluation of class invariants ... that is, everything must be in order upon completion of a creation procedure. If a class attribute is of an attached type, then each of the class's creation procedures is responsible for making sure that the attribute is attached to an object upon its completion.
+
+* A local variable is considered properly set if it is initialized at some point '''preceding''' its use in any execution path in which it is used. So immediately after its create instruction, the local variable would be considered properly set. But if the create occurred in the then part of an if instruction, the local variable would not be properly set in the else part of that same if instruction:
+
+
+ my_routine
+ -- Illustrate properly set local variable
+ local
+ l_my_string: STRING
+ do
+ if my_condition then
+ create l_my_string.make_empty
+-- ... l_my_string is properly set here
+ else
+-- ... l_my_string is not properly set here
+ end
+ end
+
+
+* A variable is considered properly set if it is '''self-initializing'''. What it means to be self-initializing is explained below.
+
+==Self-initializing attributes==
+
+A self-initializing attribute is guaranteed to have a value when accessed at run time. Declarations of self-initializing attributes are characterized by the use of the code that follows the attribute keyword. The code is executed to initialize the attribute in the case that the attribute is accessed prior to being initialized in any other way.
+
+So, self-initializing attributes are ordinary attributes, with the restriction that they are of both ''attached'' types and ''reference'' types (i.e., not expanded types or constants). Self-initializing attributes still can be, and typically will be initialized in the traditional ways. The difference is that the code in the attribute part serves as a kind of safety net guaranteeing that a self-initializing attribute will never be void, even if it is accessed prior to being initialized by one of the traditional means.
+
+
+ value: STRING
+ attribute
+ create Result.make_empty
+ end
+
+
+In the example above, the attribute value will be attached to an object of type STRING, in fact, the empty string, if no other initialization occurs before the first access of value.
+
+==Rule for conformance==
+
+You will remember that the Eiffel type system dictates that an assignment instruction:
+
+ x := y
+
+is valid only if the type of y is '''compatible''' with the type of x. Compatibility, in turn, means either '''conversion''' or '''conformance'''.
+
+The fact that all types are either '''attached''' or '''detachable''' adds another dimension to rule for conformance:
+*If x is of an attached type, then y must be of an attached type.
+This prevents us from circumventing attached status at run time. If x is of a detachable type, then y could be either a detachable or attached type.
+
+The same goes for routine calls. In a call:
+
+ z.r (y)
+
+where x is the formal argument for r, then if x is of an attached type, then y must be of an attached type.
+
+==Stable attributes==
+
+Stable attributes are really stable ''detachable'' attributes, as adding the concept of stability is meaningful only for detachable attributes. Declaring a detachable attribute as stable, means that it behaves like a detachable attribute except that its assignment rules mimic those of attached attributes. In other words, a stable attribute does not need to be attached during object creation the way that attributes declared as attached must. But like attached type attributes, stable attributes can never be the target of an assignment in which the source is Void or a detachable type.
+
+ my_test: detachable TEST
+ note
+ option: stable
+ attribute
+ end
+
+
+This means that even though stable attributes do not need to be initialized like attributes of attached types, once they are attached to an object, they can never be void again.
+
+Stable attributes are also interesting in that they are the only exception to the rule given above in the [[Void-safety: Background, definition, and tools#Certified Attachment Patterns (CAPs)|CAPs section]] that stated that direct access to attributes cannot be protected by a CAP. A stable attribute can be used under the protection of a CAP. This is because once a stable attribute has an object attached, it can never again be set to Void. So there's no worry about having the attribute's state going unexpectedly from attached to non-attached because of the actions of other routines or threads.
+
+==Rule for generic parameters==
+
+Generic classes provide another question. A generic class like
+
+class
+ C [G]
+ ...
+
+allows us to create a type by providing a specific actual generic parameter for the formal parameter G.
+
+So, two valid derivations are:
+
+ my_integer_derivation: C [INTEGER]
+
+and
+
+ my_employee_derivation: C [EMPLOYEE]
+
+
+If class C contains a declaration:
+
+ x: G
+
+What do we know about the void-safety of x ?
+
+In the case of the INTEGER derivation above, we know x is safe because INTEGER is an expanded type. But often types like EMPLOYEE will be reference types which could be void at run time.
+
+'''For a class like C [G], G is considered detachable'''. As a result, because of the [[Void-safety: Background, definition, and tools#Rule for conformance|rule for conformance]], any class will work for an actual generic parameter. That means that both of the following are valid generic derivations:
+
+
+ my_detachable_string_derivation: C [detachable STRING]
+
+ my_attached_string_derivation: C [attached STRING]
+
+
+If C contains a declaration x: G, the application of features to x must include verification of attachment (CAPs, attached syntax, etc).
+
+Constrained genericity can be used to create generic classes in which the generic parameter represents an attached type. If class C had been defined as:
+
+class C [G -> attached ANY]
+ ...
+
+then x in this class G represents an attached type. Consequently, the actual generic type in any derivation must be attached ... and feature calls on x are safe.
+
+==Rule for ARRAYs==
+
+The rule for generic parameters applies to all generic types ... except ARRAYs. In the typical creation of an ARRAY, we would provide a minimum and maximum index.
+
+ my_array: ARRAY [STRING]
+
+ ...
+
+ create my_array.make (1, 100)
+
+During creation, an area to store the appropriate number of entries is also created. And depending upon the actual generic parameter, these entries are either objects for expanded types or references for reference types.
+
+In the case of an actual generic parameter of an attached reference type, all the elements must be attached to instances of type during the creation of the ARRAY. The make procedure would not do this. Creation of an ARRAY in which the actual generic parameter is attached must be done using the make_filled creation procedure.
+
+ create my_array.make_filled ("", 1, 100)
+
+The first argument is an object of the actual generic type, in this case an empty STRING. Every entry in the newly created ARRAY will be initialized to reference this object.
+
+
+For more detail on void-safe use of arrays and other generic classes, see the section: [[Creating a new void-safe project#Using generic classes|Using generic classes]].
diff --git a/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/what-makes-certified-attachment-pattern.wiki b/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/what-makes-certified-attachment-pattern.wiki
new file mode 100644
index 00000000..74d20a44
--- /dev/null
+++ b/documentation/18.11/eiffel/Language_reference/void-safe-programming-eiffel/what-makes-certified-attachment-pattern.wiki
@@ -0,0 +1,182 @@
+[[Property:title|What makes a Certified Attachment Pattern]]
+[[Property:weight|8]]
+[[Property:uuid|1a20197d-5a88-59c3-9a04-512399125661]]
+
+==A little background on CAPs==
+
+Certified Attachment Patterns (CAPs) were described in the section on [[Void-safety: Background, definition, and tools#Certified attachment patterns (CAPs)|void-safety tools]]. To review, a CAP is a code pattern for a certain expression, say exp of a detachable type that ensures that exp will never have a void run-time value within the covered scope.
+
+A simple example is the familiar test for void reference:
+
+ if l_x /= Void then
+ l_x.do_something -- Valid for formal arguments, local variables, and stable attributes
+ end
+
+We know that after the explicit check to make sure l_x is not Void, that the feature application l_x.do_something is void-safe.
+Of course, you should remember from previous discussions that l_x must be a local variable, a formal argument, or a [[Void-safety: Background, definition, and tools#Stable attributes|stable attribute]].
+
+When void-safety was first envisioned for Eiffel, it was intended that individual CAPs would be proven or certified and documented. This would produce a "catalog" of CAPs.
+
+What happened instead is that the members of the Eiffel standard committee have been able to produce and publish as part of the [http://www.ecma-international.org/publications/standards/Ecma-367.htm standard] a definition of the nature of a CAP from which a determination can be made as to whether a particular code pattern is or is not a CAP.
+
+The definition in the standard document is not easily readable by most developers. So, in this documentation, you will see various examples of CAPs and the rationale behind them.
+
+
+==The standard CAP definition==
+
+The Eiffel standard (2nd edition, June 2006) defines a CAP as follows:
+----
+'''''A Certified Attachment Pattern (or CAP) for an expression exp whose type is detachable is an occurrence of exp in one of the following contexts: '''''
+
+
+'''''1. exp is an Object-Test Local and the occurrence is in its scope. '''''
+
+'''''2. exp is a read-only entity and the occurrence is in the scope of a void test involving exp.'''''
+----
+
+The terminology used in the definition is precise. For example, terms like "read-only entity" and "scope of a void test" have specific meanings that are supported by their own definitions in the standard.
+
+Still, the standard does contain informative text that gives us a guideline that a CAP is a scheme to ensure that a particular expression of a detachable type will never have void run-time value in the scope covered by the CAP.
+
+The discussion here will follow that guideline, and, as such, will be less formal (and consequently less precise) than that in the standard, and is intended to be a practical guide. Of course, the [http://www.ecma-international.org/publications/standards/Ecma-367.htm standard document] is available for download if you wish to investigate the specifics.
+
+
+==CAP-able expressions==
+
+In the first context in the definition above, the expression exp can be an '''Object-Test Local'''. An Object-Test Local is the identifier specified for a fresh local entity in an '''object test'''. Remember, object tests are coded using the [[Void-safety: Background, definition, and tools#The attached syntax (object test)|attached syntax]].
+
+ attached x as l_x
+
+In the object test expression above, the identifier '''l_x''' is an Object-Test Local.
+
+In the second context, the expression can be a '''read-only entity'''. Read-only entities are:
+# Constant attributes
+# Formal arguments
+# Object-Test Locals
+# Current
+
+Additionally, the Eiffel Software compiler allows for [[Void-safety: Background, definition, and tools#Stable attributes|stable attributes]] and local variables to be protected by a CAP.
+
+===Stable attributes===
+
+Stable attributes are the only class attributes which are CAP-able. This is because stable attributes, once attached at run-time, can never have a void value again. So, you use stable attributes safely by using them under the protection of a CAP. Consider this stable attribute:
+
+ my_stable_string: detachable STRING
+ note
+ option: stable
+ attribute
+ end
+
+The detachable attribute my_stable_string, because it is stable, is not required to be initialized during the creation of instances of the class in which it is a feature. That means that for each instance, my_stable_string can be initialized later during the instance's life-cycle or not at all. But because it is detachable, my_stable_string cannot be accessed in any context in which it cannot be determined that it is currently attached. For ordinary attributes, this means either using an object test and accessing the object through an object test local, or using using a local variable under the protection of a CAP.
+
+Stable attributes however, can be used directly in a CAP, as shown below:
+
+
+ if my_stable_string /= Void then
+ my_stable_string.append ("abc") -- Valid
+ ...
+
+
+So using stable attributes can reduce the need to initialize rarely used attributes, and the need to code object tests.
+
+===Local variables===
+
+Local variables can be used in a CAP as long as they are not the target of an assignment whose source is Void or some expression which could possibly be void.
+
+So, for a local variable l_string, the following is valid:
+
+ local
+ l_string: detachable STRING
+ do
+ if l_string /= Void then
+ l_string.append ("abc") -- Valid
+ ...
+
+
+But, if l_string had been a target of an assignment in which the source could possibly have been void, then it could no longer be guaranteed that l_string is not void. So, assuming that my_detachable_string is an attribute declared as type detachable STRING, the second application of append in this example would be invalid:
+
+
+ local
+ l_string: detachable STRING
+ do
+ if l_string /= Void then
+ l_string.append ("abc") -- Valid
+ l_string := my_detachable_string
+ l_string.append ("xyz") -- Invalid: my_detachable_string might have been void
+ ...
+
+
+==Common CAPs==
+
+We've already seen the simple test for void as a CAP:
+
+ local
+ l_str: detachable STRING
+
+ ...
+
+ if l_str /= Void then
+ l_str.append ("xyz") -- Valid
+ end
+
+
+Additionally, a creation instruction can serve as a CAP. After the execution of a creation instruction, the target of the creation instruction will be attached:
+
+ local
+ l_str: detachable STRING
+ do
+ create l_str.make_empty
+ l_str.append ("xyz") -- Valid
+ ...
+
+
+
+==Less obvious cases==
+
+There are some situations that constitute CAPs that we might not think of immediately.
+
+For example, the case of the non-strict boolean operator and then:
+
+ if x /= Void and not x.is_empty then -- Invalid
+ ...
+
+ if x /= Void and then not x.is_empty then -- Valid
+ ...
+
+Assuming that x is CAP-able, the first line of code is invalid because the expression x.is_empty could always be evaluated even in the case in which x is void.
+
+In the second line of code, the non-strict boolean is used, guaranteeing that x.is_empty will not be evaluated in cases in which x is void. Therefore, x.is_empty falls within the scope of the void test on x.
+
+In contracts, multiple assertion clauses are treated as if they were separated by and then. This allows preconditions like the one in the following example:
+
+my_routine (l_str: detachable STRING)
+ require
+ l_str /= Void
+ not l_str.is_empty -- Valid
+ ...
+
+
+Another not-so-obvious CAP is related to the use of the logical implication:
+
+ local
+ l_str: detachable STRING
+ do
+ if l_str /= Void implies some_expression then
+ ...
+ else
+ l_str.append ("xyz") -- Valid
+ end
+
+
+
+==The bottom line on CAPs==
+
+In summary, CAPs provide void-safe protection for certain types of detachable expressions.
+
+Possibly the characteristic of CAPs which is most important to developers is whether or not a particular CAP is supported by the compiler. In other words, from the developers viewpoint, the only opinion that matters in the argument of whether a particular pattern constitutes a CAP is that of the compiler.
+
+If the compiler can provide assurance that a certain code pattern guarantees void-safe protection, then the developer will have that pattern available as a CAP. Likewise, even if a pattern can be shown logically to be a CAP, but for some reason it is not supported by the compiler, then that pattern will not available as a CAP and the compiler will not allow its use.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Overview/common-myths-and-misconceptions-about-eiffel.wiki b/documentation/18.11/eiffel/Overview/common-myths-and-misconceptions-about-eiffel.wiki
new file mode 100644
index 00000000..cc114aed
--- /dev/null
+++ b/documentation/18.11/eiffel/Overview/common-myths-and-misconceptions-about-eiffel.wiki
@@ -0,0 +1,80 @@
+[[Property:title|Common myths and misconceptions about Eiffel]]
+[[Property:link_title|]]
+[[Property:weight|4]]
+[[Property:uuid|056c0ab0-8e44-571f-f126-0b1850980754]]
+Often, when we speak about Eiffel to prospective users, we hear them repeat misinformation about the method, the language, or the tools. Most of the time, the stories are familiar to us … and untrue. Here are a few of the myths that we hear most often, as recounted and debunked by the series entitled [http://eiffel.com/developers/presentations/ "Where Eiffel Fits"].
+
+
+==Eiffel is an "academic" language only: ''Whoa, wrong! Twice!''==
+
+Recently, I was offered the opportunity to speak to a local technology group about Eiffel for Microsoft .Net. The leader of this group is part of a small commercially-oriented software development company. Concerning Eiffel, he said, “All I know about Eiffel is that it’s an academic language.”
+
+We hear that one a lot … and it’s wrong … in two unrelated ways.
+
+First, as you should know by now, Eiffel is a framework for software development. It has a full-lifecycle development method. The Eiffel method is supported by a notation we call the Eiffel programming language. The notation just happens to be designed such that when it contains sufficient detail, it can be compiled into a running software system. Additionally, the method and language are supported by a set of tools including an interactive development and compiler. So to refer to Eiffel only as a "language" is to do injustice to the complete framework of which the language is only one part.
+
+Secondly, I’m not sure what “academic language” means exactly, but if it means only used in an academic setting, or not fit for practical work, then this could not be farther from the truth. It is true that Bertrand Meyer who developed the original Eiffel concepts has academic background and is well-respected in the academic community. It’s also true that many of those Eiffel ideas evolved from work that was done by other academic computer scientists and mathematicians. And it’s true that many colleges and universities use Eiffel to teach the best practices of software development.
+
+But Eiffel is also used successfully in many commercial and government endeavors. If you have any doubts, pay a visit to [https://www.eiffel.com/company/customers/testimonials/ eiffel.com] and check out the success stories and customers testimonials.
+
+
+==Eiffel is not for doing "real" work: ''That's a joke, right?''==
+
+Occasionally we’ve heard people say that Eiffel is only suitable for building “toy” systems.
+
+This is similar to the "academic language" argument and is just as false.
+
+In actuality, we see Eiffel being used often in situations in which other technologies fail. If anything it is the other commonly used technologies that tend to break down under stress.
+
+We see Eiffel being used instead of other technologies for systems in which scalability and reliability are essential.
+
+One of our customers is an organization that has developed a payroll system using Eiffel that every week pays over two hundred thousand employees in twenty thousand different institutions … the people in this organization would assure you that Eiffel is indeed industrial grade.
+
+
+==Not many people are using Eiffel: ''You wouldn't want to share an elevator with them all!''==
+
+The answer to this one depends a bit upon your frame of reference. Some time ago Microsoft estimated that there were twenty million Visual Basic programmers world wide.
+
+If this is true, then relatively speaking, we have to admit that Eiffel’s market share ''is'' considerably smaller than that of Visual Basic.
+
+Despite that, it’s not correct to say that not many people use Eiffel. Eiffel licenses world wide number in the tens of thousands. If you use Eiffel, you are not alone. These license-holders have formed a lasting worldwide quorum. Many world-class organizations are committed now, and will continue to be committed to the Eiffel framework. There is support through your maintenance contract with Eiffel Software. Help and information are available online in the form of the [https://www.eiffel.com/company/customers/ Eiffel Software users’ list] and websites like [http://community.eiffel.com/room/ EiffelRoom].
+
+Eiffel Software's dual licensing model gives developers the opportunity to learn Eiffel without a great initial financial commitment.
+
+So, don’t worry about it, plenty of people use Eiffel … and those numbers are increasing constantly.
+
+
+==If we use Eiffel, we may not be able to find qualified programmers: ''Gimme a break.''==
+
+Through the years some potential Eiffel users have expressed to us a concern that if they embrace Eiffel, that they may not be able to find a sufficient number of qualified developers.
+
+This is of course incorrect.
+
+First, almost all Eiffel people were proficient in some other technology before they became Eiffel people. It turns out that this really works to your advantage. You see, Eiffel people want to stay Eiffel people. So an Eiffel programmer on the job market will be searching for an Eiffel position first, and would probably rather have a root canal than to go back to working in his or her previous technology.
+
+Additionally, it is important also to understand that Eiffel developers are easy to create. Because Eiffel is simple, clean, and elegant, it doesn’t take long to get people going with it. I teach a five-day course that contains fifteen programming exercises. Each time I’ve taught the course, almost every student has finished every exercise. Students leave with a good foundation for how to begin saving time and money for their organization by constructing quality software with Eiffel. These people can be fluent in Eiffel in as little as a couple of months. This can be contrasted with the other extreme ... a well-known Microsoft Windows expert told me a couple of years ago that he estimates it to take 5 to 7 years to become truly fluent in C++/COM programming on Windows. Programmers who are proficient in other technologies often experience Eiffel as a breath of fresh air.
+
+
+==Eiffel might not be around in five/eight/ten (choose one) years: ''Better recalibrate your crystal ball, Nostradamus!''==
+
+I think the first time I heard this one, it was about 1989.
+
+And of course, I’ve heard it many times in the years since.
+
+And of course, it’s not true.
+
+Eiffel is more complete and functionally superior in most ways to every other commercially viable software development technology … and there are enough people around who recognize this (that quorum of users I mentioned earlier) to ensure that Eiffel will be around for a long time to come.
+
+It’s possible that twenty-five years from now, there will be a significantly better software engineering idea … but certainly there hasn’t been anything that’s come close since Eiffel’s original design in 1985. In most areas, other technologies are playing “catch-up” to Eiffel.
+
+Besides, Eiffel constantly implements refinements and new capabilities with minimal impact on existing software. [[Void-safe programming in Eiffel|Void-safe programming]] is an excellent example of this.
+
+You can get a feel for this issue by watching [http://channel9.msdn.com/posts/Charles/Emmanuel-Stapf-Eiffel-and-Contract-Oriented-Programming/ this video on Microsoft Developers Network Channel9]. Here you'll see Emmanuel Stapf, an engineer at Eiffel Software, speak with Mads Torgersen, one of Microsoft's C# language designers. You'll hear how Eiffel stays fresh and continues to set a technological standard worthy of the aspirations of other technologies.
+
+So, don’t worry about it. Eiffel will be here.
+
+
+
+
+
+
diff --git a/documentation/18.11/eiffel/Overview/eiffel-two-minute-fact-sheet.wiki b/documentation/18.11/eiffel/Overview/eiffel-two-minute-fact-sheet.wiki
new file mode 100644
index 00000000..ecd37799
--- /dev/null
+++ b/documentation/18.11/eiffel/Overview/eiffel-two-minute-fact-sheet.wiki
@@ -0,0 +1,97 @@
+[[Property:title|Two-Minute fact sheet]]
+[[Property:weight|0]]
+[[Property:uuid|f672bfb8-ddea-beb1-eaa6-e374a6a6bc92]]
+If you are both curious about Eiffel and in a hurry, take a couple of minutes to read these facts about Eiffel. If anything here seems too good to be true, please suspend your disbelief. Press on to the more detailed documentation for the rationale, and our success stories for the evidence behind these facts.
+
+===Eiffel is the most comprehensive approach to the construction of successful object-oriented software.===
+
+Software produced with Eiffel is typically:
+
+*Cheaper -- You spend less on development, debugging, maintenance
+*Better -- You get the bugs before they get you
+*Shorter time-to-market -- You release quality products ahead of your competitors
+*Easier -- In every way: understanding, maintenance, reuse, and extension
+
+===Systems developed using Eiffel can be made portable across major industry platforms.===
+
+*Windows NT/2000/XP/Vista including CLS compliance on Microsoft .NET
+*Major Unix versions
+*Macintosh OS X
+*Linux
+*OpenVMS
+
+===Eiffel is the only approach that covers analysis, design, implementation and maintenance in a single framework.===
+
+Eiffel consists of:
+
+====The Eiffel Method====
+
+*Is Based on a small number of powerful ideas from computer science and software engineering
+**An example of these is Design by Contract
+***Defines a software system as a set of components interacting through precisely specified contracts
+***Contracts are active and enforceable throughout the life-cycle
+***Design by Contract promotes:
+****Precise software specification
+****Software reliability
+****Safe, effective software reuse
+*Uses a "single-product" model
+**All life-cycle phases are supported by a single notation
+***No need to switch, say, from "analysis language" to "design language"
+**Products of all phases are recorded in a single document with multiple views
+
+====The Eiffel Programming Language====
+
+*Exists to express the products of the Eiffel Method
+*Supports features not always available in competing technologies
+**Contracts and contract monitoring
+**Exception handling based on software specification (versus ad hoc try/catch)
+**Void-safety: calls on void (null) references are eliminated at compile time
+**Inheritance
+***Includes multiple and repeated inheritance
+***Safe and fully controllable
+**Genericity (generic classes), including constrained genericity
+**Platform independent concurrency ([[Concurrent programming with SCOOP|SCOOP]])
+*Widely recognized as simultaneously the simplest and most complete implementation of object-oriented concepts
+*Is clean, elegant, readable, easy to learn
+
+
+====EiffelStudio and the Eiffel Libraries====
+
+*'''EiffelStudio'''
+**Runs on all major platforms (of course, it's built with Eiffel)
+**Features lightning-fast compilation (Melting Ice Technology)
+**Generates lightning-fast executables
+***Final compilation generates standard C (MSIL in the case of .NET)
+***Speed of executables rivals native C
+**Provides multiple views of your product
+***Views for different life-cycle phases and developer roles
+***Graphical views
+**Features automated generation of HTML and XML documentation
+
+*'''The Eiffel Libraries'''
+**Contain rich, time-tested, multi-platform components
+**Include facilities for
+***GUI building and graphics
+***Web
+***Networking
+***Fundamental algorithms and data structures
+***Object persistence and database access
+***Multi-threading
+***Lexical analysis and parsing
+***Interfacing with other technologies
+
+===Eiffel has a proven track record of successful projects===
+
+*Some of the largest successful object-oriented projects ever built, including systems target to:
+**Finance and securities
+**Education
+**Trading
+**Manufacturing
+**Telecommunications
+**Government and national defense
+**Science
+
+For a more detailed overview see [[Invitation to Eiffel (I2E)|An Invitation to Eiffel]] .
+
+
+
diff --git a/documentation/18.11/eiffel/Overview/index.wiki b/documentation/18.11/eiffel/Overview/index.wiki
new file mode 100644
index 00000000..98bdaaab
--- /dev/null
+++ b/documentation/18.11/eiffel/Overview/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|Eiffel Overview]]
+[[Property:link_title|Overview]]
+[[Property:weight|1]]
+[[Property:uuid|f65e67ed-0990-4638-b8f8-0fc85c28f0d8]]
+
diff --git a/documentation/18.11/eiffel/Overview/learning-eiffel.wiki b/documentation/18.11/eiffel/Overview/learning-eiffel.wiki
new file mode 100644
index 00000000..53305820
--- /dev/null
+++ b/documentation/18.11/eiffel/Overview/learning-eiffel.wiki
@@ -0,0 +1,54 @@
+[[Property:title|Learning Eiffel]]
+[[Property:weight|3]]
+[[Property:uuid|a30e29fe-841d-4634-ded2-88ae1754e5fd]]
+If you are new to Eiffel and are interested in learning the technology, you might consider some of the following resources. Remember that Eiffel, unlike other programming languages, is not just a programming language. Instead, it is a full life-cycle framework for software development. As a consequence, learning Eiffel implies learning the Eiffel Method and the Eiffel programming Language. Additionally, the Eiffel development environment EiffelStudio is specifically designed to support the method and language. So having an understanding of the method and language helps you to appreciate the capabilities and behavior of EiffelStudio.
+
+
+=Online presentations=
+
+Your first stop in getting acquainted with Eiffel might be the collection of [http://eiffel.com/developers/presentations/ online presentations] on the [http://eiffel.com eiffel.com] website. These presentations each usually take less than an hour to view, and give an introduction to Eiffel concepts including Design by Contract, the EiffelStudio development environment, and includes several presentations that describe selected Eiffel features in relation to those of other other development tools.
+
+=Online documentation set=
+
+The [http://docs.eiffel.com docs.eiffel.com] site contains the online documentation for the Eiffel method, tools, and language. Within the documentation set are tutorials to help you learn about the Eiffel programming language and tools.
+
+==The Eiffel Tutorial==
+
+A [[An Eiffel Tutorial (ET)|tutorial]] that covers the Eiffel Method and much of the Eiffel programming language.
+
+==The EiffelStudio Guided Tour==
+
+This [[Introducing EiffelStudio]] page is good way to get a feel for what EiffelStudio can do.
+
+=Academic materials available online=
+
+Many colleges and universities use Eiffel to teach "best practices" in software engineering. Often the materials used in courses are available on the worldwide web. For example, the teaching materials for courses at the Swiss Federal Institute of Technology in Zurich are available at [http://se.ethz.ch/teaching/index.html this web address].
+
+If you search the web, you can find similar materials at other academic institutions.
+
+=Learning maps=
+
+For certain specific areas of learning, the eiffel.com website includes conceptual [http://eiffel.com/developers/learning_maps/ learning maps]. These are graphical maps that link concepts with their relationships. Each concept can have multiple learning resources attached to it. One of the most prevalent types of resources is the "Learnlet", a short online presentation (less than 30 minutes) covering a specific concept.
+
+=Books=
+
+To find information about the most up-to-date books about Eiffel, look [[Books about the Eiffel Method and Language|here]].
+
+=Examples and sample code=
+
+Throughout the documentation site, there are many code snippets designed to illustrate certain language features or design principles. For example, the code snippet [[ET: Inheritance#Redefinition|here]] shows the mechanics of redefining an inherited feature.
+
+In the EiffelStudio distribution you will find a subdirectory "examples" which contains many examples of using Eiffel, primarily with the Eiffel class libraries.
+
+A third source of examples is the [[Examples]] book in the documentation pages.
+
+=Eiffel Programming Language Syntax=
+
+The documentation site includes a summary of the [[Quick reference to the Eiffel programming language|syntax of Eiffel]] the language. This summary is intended to reflect the state of the current official [[ECMA Standard 367|ISO/ECMA Eiffel standard document]].
+
+However, usually you will find that there are differences in the syntax supported by EiffelStudio's compiler and that defined in the current standard. The differences between the standard and the EiffelStudio implementation are summarized in the [[EiffelStudio release notes]] and in a [[Differences between standard ECMA-367 and Eiffel Software implementation|documentation page]] that is specific to that purpose.
+
+
+
+
+
diff --git a/documentation/18.11/eiffel/Overview/why-your-next-project-should-use-eiffel.wiki b/documentation/18.11/eiffel/Overview/why-your-next-project-should-use-eiffel.wiki
new file mode 100644
index 00000000..753efc42
--- /dev/null
+++ b/documentation/18.11/eiffel/Overview/why-your-next-project-should-use-eiffel.wiki
@@ -0,0 +1,185 @@
+[[Property:title|Your next project in Eiffel]]
+[[Property:weight|1]]
+[[Property:uuid|038CDA4A-9ACA-46F6-AC10-06942FAE4529]]
+(After an article in the special Eiffel issue of the ''Journal of Object-Oriented Programming'', May 1996.)
+
+
+Over its ten-year life Eiffel has evolved into one of the most usable software development environments available today. Other articles discuss its theoretical contributions. This one addresses a more mundane subject: how practical software projects can benefit, today, from the power of Eiffel. In so doing it will largely rely on published assessments from both Eiffel users and book authors. In fact a quotation from one of the best-known books in the object-oriented field -- ''Object-Oriented Modeling and Design'' by James Rumbaugh and his colleagues, the text that introduced the OMT O-O analysis method -- provides a good start:
+
++''Eiffel is arguably the best commercial object-oriented language available today. [Jim Rumbaugh et al. in Object-Oriented Modeling and Design, Prentice Hall 1988]. '' ++ + +==What is Eiffel?== + +First we should define what the word "Eiffel" means. If you are thinking "a programming language" you are not wrong (and the preceding quotation shows that you are in good company). The programming language is indeed the most visible part, but it is only a reflection of something broader: a comprehensive approach to the production of quality software. As Richard Wiener wrote: + +
+''Eiffel is more than a language; it is a framework for thinking about, designing and implementing object-oriented software. [Richard Wiener in Software Development using Eiffel: There is life other than C++, Prentice Hall, 1995.] '' ++ +The Eiffel approach includes a method (a "methodology", as it is sometimes called) based on a number of pervasive ideas such as Design by Contract, seamlessness, reversibility, rigorous architectural rules, systematic use of single and multiple inheritance, static type checking and several others. Besides a method and a language Eiffel also means powerful graphical development environments, such as EiffelStudio, available across a wide number of industry-standard platforms and supporting analysis and design as well as implementation, maintenance and evolution. + +The language itself, indeed (which Wiener calls an elegant and powerful language for object-oriented problem solving") is not just a programming language but extends to the phases of system construction that both precede and follow implementation. This is sometimes hard to accept if you have been raised in the view that software development must involve a sequence of separate steps; that one should initially use an analysis method and then at some point switch to a programming language, with perhaps a design method in-between. This view is detrimental to the software process and to the quality of the resulting product, as it does not support the inevitable back-and-forth hesitations that characterize real software development. + +Wisdom sometimes blooms late in the season. However careful you may have been at the analysis stage, some great ideas will hit you - or your implementers - past the point at which you thought you had all the specifications right. Why renounce the benefit of such belated but valuable ideas? Eiffel and the associated Business Object Notation approach to analysis and design accommodate them naturally, by providing a single conceptual framework from the beginning to the end of the process. + +Here Eiffel does not have much competition. The most bright-eyed Smalltalk or C++ enthusiast would not seriously claim that one can do design, let alone analysis, in his language of choice. And users of any of the popular O-O analysis notations know that at some stage they must stop working on their model and move on to the implementation in some programming language. Eiffel is unique in helping you for all of these tasks, without ever introducing the impedance mismatches that characterize other approaches. + +As a reviewer wrote: + +
+''As a design language, Eiffel continues to be a better model for object- oriented programming than Ada. It is even better than the new Ada 9X standard. [Richard Riehle in HP Professional, October 1994, A Tour of Eiffel.] '' ++ +==The commercial and political context== + +The next few sections give a glimpse of the technical contributions of Eiffel, or more precisely of what other people have written about them. But of course the best technology in the world requires infrastructure and support to succeed. + +Eiffel has plenty of these. It has been around for more than a decade. Eiffel is available from several commercial and open-source providers. The number of licenses sold is in the tens of thousands. Reusable library classes are in the thousands. + +The platforms covered range from Unix (all of Unix, the famous and the arcane) and Linux to OpenVMS, OS/2, Windows 3. 1, Windows NT, Windows 95/98. + +Particularly impressive is the growth of Eiffel usage in education. Eiffel is quickly becoming the language of choice for teaching modern software technology, including, increasingly, introductory programming. A dozen of excellent textbooks are now available from Prentice Hall, Addison-Wesley, Macmillan and others, with about as many announced just for the coming months. + +It is not just the professors who like the approach. Here is just one typical comment on student reaction, from an institution (Rochester Institute of Technology) having adopted Eiffel as its first-year introductory language on a massive scale: + +
+''We were pleased to discover many of our more skeptical students turning around and admitting that Eiffel was a "fun" language in which to work. [Jim Heliotis in the Proceedings of OOPSLA 95, Experiences teaching objects: A new curriculum for computer science students.] '' ++ +A Computer World article confirmed the need for Eiffel in training the high-powered software professionals of tomorrow. Quoting Amy Cody-Quinn from Management Recruiters International, the journalist writes + +
+''There is a big problem with people who say they know C++ - but they don't really know how to do objects. If they have Eiffel on their resume, then we know they really have the proper understanding of what they are doing. [Leslie Goff in ComputerWorld, Object Edge, December 18, 1995.] '' ++ +But it would be a mistake to think of Eiffel as an academic tool. A little-known fact is that some of the biggest object-oriented projects ever undertaken (at least the successful ones - other O-O languages have had their share of large-scale failures) are being done in Eiffel. The hot areas at the moment are banking and the financial industry (in particular some very large derivative trading and investment management systems), telecommunications, health care. These are all areas in which all that counts in the end is quality and time to market, so that projects need to select the best technology available. Quoting from an article by Philippe Stephan, the system architect of such a project (Rainbow, a major derivative trading system built with ISE Eiffel): + +
+''We evaluated three major object-oriented languages for the project - Smalltalk, C++ and Eiffel - and chose Eiffel. [...] Rainbow currently comprises over 400,000 lines of code, for about 3000 classes. [Current figures are way over these mid-1995 counts. ] The developers feel very productive. This was confirmed when Rainbow's financial backers brought in object professionals to audit the project. The auditors evaluated the project during July 1994 and were impressed with the productivity of the Rainbow development group. [Philippe Stephan in Object Magazine, July-August 1995, Building financial software with object technology.] '' ++ +The development group in question is remarkable for being made only for a third of software professionals. The others are professionals from other disciplines (such as trading and financial analysis), who, Stephan writes, + +
+''can express business concepts in Eiffel because they can focus on design and implementation, rather than struggling with memory management problems and debugging. '' ++ +The result has received lavish praise from such publications as ComputerWorld and analysts: + +
+''Industry experts briefed on Rainbow said they were impressed with the results. CALFP is "progressive" in [...] committing the organization's mission-critical systems development efforts to this architecture, said Richard Crone, senior manager of financial services at KPMG Peat Marwick in Los Angeles. "What's unique here is that [CALFP is] delivering this system end-to-end using object-oriented technologies", said Henry Morris, a research analyst at International Data Corporation (IDC) in Framingham, Mass. [Thomas Hoffmann in ComputerWorld, May 8, 1995, Object- Oriented financial package tames transactions.]'' ++ +Along with these Eiffel mega-projects, you will also find myriad smaller endeavors. Many consultants, in particular, have found for themselves the key competitive advantage that they can gain from Eiffel's excellence. In ensuring this spread of Eiffel throughout the industry, the benefit of cheap yet complete environments such as EiffelStudio for Linux has been immeasurable. + +Also crucial to the development of Eiffel has been the neutral status of its definition, now controlled by a consortium of vendors and users, NICE (the Nonprofit International Consortium for Eiffel). NICE has already produced a library standard and expects to produce soon the language standard that should shortly thereafter enjoy a smooth ride through ANSI and other international standards bodies. + +The pace of Eiffel history has been accelerating in the past few months. This has been picked up by many journalists. As Dan Wilder wrote: + +
+''With an open specification for both the language and the kernel libraries, and support from multiple vendors, Eiffel now stands poised to take off. [Dan Wilder in Linux Journal, June 1995, Introduction to Eiffel.] '' ++ + +==The criteria== + +Eiffel - the method, the language, the environment - is based on a small set of goals, addressing the crucial needs of software quality and productivity. Quoting from an article in ''Byte'' magazine: + +
+''Developers who want an object-oriented language that adheres to the keystone principles of software engineering need look no further than Eiffel. [Peter Varhol in Byte Magazine, February 1996.] '' ++ +or, as Steve Bilow wrote in a review of Eiffel Software's Melting Ice compiling technology (which he calls "an outstanding marriage between portability and development speed"): + +
+''Eiffel was designed precisely for the purpose of enabling software developers to deliver high quality, reliable, efficient, reusable code. [Steve Bilow in The X Journal, The Eiffel alternative, July-August 1995.]'' ++ +==Reliability== + +The first goal is reliability. No other approach available today has made the effort to give developers all the tools that they need to produce bug-free software - software that will run without bugs the first time around. Crucial in this effort is the presence of static typing ( ''real'' static typing, not "a little bit typed" as in those languages that still keep C-like type conversions); assertions and the whole mechanism of Design by Contract, on which more than one Eiffel developer has said "this has changed my life" by enabling him or her to specify precisely what the software should do, and to track at run time that it does it; disciplined exception handling; automatic garbage collection, which eliminates a source of horrendous bugs in C++-based environments (and a large part of the code, tedious and error-prone); a clean approach to inheritance; the use of dynamic binding as the default policy, meaning the guarantee that all calls will use the right version of each operation; and the simplicity of the language design, which enables Eiffel developers to know '''all''' of Eiffel and feel in control. + +The role of assertions and Design by Contract is particularly important here. According to the ''Journal of Object-Oriented Programming'': + +
+''The contribution of Eiffel is significant: it shows how invariants, preconditions, and postconditions can be incorporated into a practical developer's view of a class. Wider use of Eiffel [...] will encourage a greater use of simple but powerful mathematics during development. [Richard Mitchell et al. in Journal of Object-Oriented Programming, July-August 1995, As-a: a relationship to support code reuse.] '' ++ +==Reusability== + +The second goal is reusability. This has become a catchword, but Eiffel is the only approach that has taken this requirement and its consequences all the way to the end. Quoting Roland Racko: + +
+''Everything about [Eiffel] is single-mindedly, unambiguously, gloriously focused on reusability - right down to the choice of reserved words and punctuation and right up to the compile time environment. [Roland Racko in Software Development, December 1994, In praise of Eiffel.] '' ++ +Eiffel benefits here from being a simple ("but not simplistic", writes Racko) and consistent design, not a transposition from older, unrelated technology. Beyond the language and the environment facilities (such as precompilation), the crucial help to reusability is of course the presence of thousands of high-quality library ''classes'', such as, in EiffelBase (a "Linnaean approach to the reconstruction of software fundamentals"), EiffelNet for client-server communication, EiffelStore for relational and O-O database manipulations, EiffelLex and EiffelParse for lexical analysis and parsing, EiffelMath for object-oriented numerical computation, EiffelVision for portable graphics, WEL (the Windows Eiffel Library) for Windows-specific graphics, EiffelWeb to process forms from the Web, and many others. Not even mentioning quality, the result is probably the biggest repository of object-oriented components available elsewhere. The care that has been applied to the production of these libraries also has considerable pedagogical benefits: the way people learn Eiffel is by learning the libraries - first to use them, then to adapt them if necessary, then to write their own software. + +Part of the single-mindedness mentioned by acko is the emphasis on abstraction. In contrast with, say, Smalltalk, you do not read the source code of a class when you want to use it. This may be fine for a couple dozen classes, but not for a large, powerful library. Eiffel introduces the notion of '''short form''': an abstract version of the class, keeping only the interface information including assertions. This is an ideal tool for documenting classes but also for discussing designs and presenting them to outsiders - managers or customers - who need to know what is going on without getting bogged down in the details. + +Let me mention just one of the unique reusability-supporting features of Eiffel, without which it is, in my experience, impossible to have a long-term reuse effort. Racko again: + +
+''The language's designer [...] recognized that no reusable library is ever perfect and, thus, that libraries are always in flux. So he built a kind of version-control system into the language. Specifically, there are language elements to demarcate obsolete code that is, however, still being supported. When these elements are referenced by someone unaware of such code's obsolescence, the compiler will issue a warning at compile time about the impending doom that awaits persons who continue the referencing. '' ++ +It is this kind of detail that can make or break the success of reuse in a company. + +==Extendibility== + +Next comes extendibility. With Eiffel, modifying software is part of the normal process. As Philippe Stephan writes of the external audit of his project: + +
+''The auditors rated the responsiveness of the development team as very high. '' ++ +Chief among the method's support for extendibility is the careful design of the inheritance mechanism. Unlike Smalltalk, which is fatally limited by the absence of multiple inheritance, the Eiffel approach fundamentally relies on multiple inheritance to combine various abstractions into one. As Dan Wilder notes: + +
+''Most object-oriented languages do not attempt multiple-inheritance. The literature is full of elaborate explanations why. This is sad. Eiffel demonstrates that multiple inheritance need not be difficult or complex, and it can also yield some quite practical results. '' ++ +The approach also enforces a strict form of information hiding, which means that a module (a '''client''' in Eiffel Design by Contract terminology) that uses another's facilities (its '''supplier''') is protected against many of the changes that can be made later on to these facilities. This is essential in preserving the coherent evolution of a large system - and the sanity of its developers. + +==Efficiency== + +Performance is almost as much an obsession in Eiffel as reusability. The software field is still, and will remain for a long time, largely driven by performance considerations. (Do not believe anyone who says that speed does not matter. If we get faster computers, it is to do things faster and especially to do more things - not to use more CPU cycles to run the same old applications at the same old visible speed. ) + +There is no reason whatsoever to leave the mantle of efficiency to the proponents of machine-oriented languages such as C/C++, or to follow the path of Smalltalk which sacrifices performance to object orientation. With Eiffel you can have the best of both worlds. Thanks to a performance-obsessed language design and ten years of research and competition on compiling algorithms, the speed of Eiffel-generated code (in such modes as what is known as "finalization" in Eiffel Software's implementation) is as good as that of hand-produced C code, or better. + +Software producers should stand up to their ideas. That is what we do at Eiffel Software: apart from the run-time engine (a few thousand lines of C), all of our software - thousands of classes, hundreds of thousands of lines - is written in Eiffel, and it runs fast. Typical of the situation is a recent incident with the EiffelLex library: it still had a few C elements, remnants of an earlier design. We rewrote them in Eiffel - for a 30% performance gain. + +Why these gains? The answer is simple. The /C++ approach of doing everything by hand, under tight programmer control, works well for small programs. Similarly, a good secretary has no equivalent for keeping one person's records. But in the same way that no humans can match the performance of a computer for managing, say, the records of a bank or a city, no programmer can beat a sophisticated Eiffel compiler for optimizing a large program. Against the automatic application of inlining, static binding, memory management and other optimizations, the human does not stand a chance. + +To have one's cake and eat it also means not to have to choose between run-time and compilation-time performance. For programmers used to the contrast between a Smalltalk-like style of rapid turnaround and the interminable edit-compile-link cycle of most compiled environment, the following comments by Dan Wilder (in a separate article) will be a shock: + +
+''EiffelStudio uses "melting ice technology", which allows incremental changes to run in an interpreted mode. Only modified classes are recompiled. Changing one class and clicking the Melt button caused only a few seconds of compilation. [...] My test application took 20 seconds to compile from scratch in "melt" mode. [Dan Wilder in Linux Journal, September 1995, Two Eiffel implementations.] '' ++ +Steve Bilow provides further explanations: + +
+''Based on the observation that software development is an iterative process which is usually focused on constructing systems from code modifications, the folks at Eiffel Software have developed something that they call "Melting Ice Technology". Essentially, this means that when you make a [change] and you want to try it out, you simply "melt" it into the system. You don't need to regenerate a bunch of C code, so your changes are integrated into the system proportionally to the amount of code changed. Even in C and C++, `make` still has to relink. '' ++ +What this also indicates in passing is the technology choice made by Eiffel Software's implementation and all current implementations: using C as the portable implementation vehicle. By going through C, the compilers gain efficiency and portability. This also makes Eiffel one of the most open environments around; in contrast to the self-centered view that predominates in Smalltalk, Eiffel software is born with a sociable attitude, ready to interface with all kinds of other software written in C or other languages. This, needless to say, is a key to the success of realistic applications. + +==With us, everything is the face== + +A good way to think about Eiffel - the seamlessness of it, the insistence on getting everything right, the conviction that software should be beautiful in and out, specification and implementation - is this little anecdote stolen from Roman Jakobson's Essays on ''General Linguistics'': + +
+''In a far-away country, a missionary was scolding the natives. "You should not go around naked, showing your body like this!". One day a young girl spoke back, pointing at him: "But you, Father, you are also showing a part of your body!". "But of course", the missionary said in a dignified tone; "That is my face". The girl replied: "So you see, Father, it is really the same thing. Only, with us, everything is the face". '' ++ +So it is with Eiffel too. Everything is the face. + +Hundreds of thousands of people have now been exposed to Eiffel through books, through courses, through hearing about other people's successes, and most importantly (for the most fortunate among them) through using it to complete a project on time, within budget, and to the satisfaction of their customers. Shouldn't your next project use Eiffel too? + + + + diff --git a/documentation/18.11/eiffel/Technical_papers/books-about-eiffel-method-and-language/ecma-standard-367.wiki b/documentation/18.11/eiffel/Technical_papers/books-about-eiffel-method-and-language/ecma-standard-367.wiki new file mode 100644 index 00000000..3c34bf99 --- /dev/null +++ b/documentation/18.11/eiffel/Technical_papers/books-about-eiffel-method-and-language/ecma-standard-367.wiki @@ -0,0 +1,16 @@ +[[Property:title|ECMA Standard 367]] +[[Property:weight|1]] +[[Property:uuid|b49b0949-85fa-31da-555e-003b09f6213e]] +[[Image:ECMA-367 cover small|ECMA-367]] + + +==ECMA Standard 367 -- Eiffel: Analysis, Design, and Programming Language== + +ECMA International + +Standard Eiffel syntax, validity, and semantics are described in this document, which is available [http://www.ecma-international.org/publications/standards/Ecma-367.htm online]. + +ECMA-367 is a specification for the Eiffel programming language. Therefore, it can be useful as a reference, but it is definitely not a tutorial. That said, the document does contain occasional informative text and a general description chapter which can help readers understand the specification. + + + diff --git a/documentation/18.11/eiffel/Technical_papers/books-about-eiffel-method-and-language/eiffel-language.wiki b/documentation/18.11/eiffel/Technical_papers/books-about-eiffel-method-and-language/eiffel-language.wiki new file mode 100644 index 00000000..cb8c1edb --- /dev/null +++ b/documentation/18.11/eiffel/Technical_papers/books-about-eiffel-method-and-language/eiffel-language.wiki @@ -0,0 +1,26 @@ +[[Property:title|Eiffel: The Language]] +[[Property:weight|2]] +[[Property:uuid|dae5a248-29f5-02b2-d01f-371394aa75e9]] +[[Image:ETL]] + + +=='''''Eiffel: The Language''''' by Bertrand Meyer.== + +Prentice Hall Object-Oriented Series. + +594 pp. + +Soft cover. + +
+ print_integer (a_integer: INTEGER)
+ -- Print the value of `a_integer`.
+ do
+ print (a_integer.out + "%N")
+ end
+
+
+Note that for more advanced conversion, you can also use a conversion class like `FORMAT_DOUBLE`.
\ No newline at end of file
diff --git a/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Iterate-on-a-LIST-and-removing-object.wiki b/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Iterate-on-a-LIST-and-removing-object.wiki
new file mode 100644
index 00000000..52e4097a
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Iterate-on-a-LIST-and-removing-object.wiki
@@ -0,0 +1,28 @@
+[[Property:modification_date|Mon, 10 Sep 2018 09:06:41 GMT]]
+[[Property:publication_date|Fri, 07 Sep 2018 12:13:00 GMT]]
+[[Property:uuid|78393BBA-9B1E-4523-9881-3D83CEB6A952]]
+[[Property:weight|3000]]
+[[Property:title|Removing object while iterating on a LIST]]
+If you already have the object that you want to remove from the `LIST` you can easily use `prune` and `prune_all`. But if you want to remove objects while iterating on that `LIST`, depending on criteria on the objects contained in the `LIST`, here is what you can do.
+
+First of all, if you think about removing an object while iterating, I do not recommend using an `across` loop. If you iterate on the list using a `from until loop end`, just remember to use the `LIST.forth` only when you do not use `LIST.remove`.
+
+For example, let's say we have class `MY_CLASS` with an attribute `has_stopped` and that I want to remove every object of a `LIST` that has this attribute set to `True`. Here is what the code will look like.
+
+
+ removing_stopped (a_list: LIST [MY_CLASS])
+ -- Removing every closed element of `a_list`
+ do
+ from
+ a_list.start
+ until
+ a_list.exhausted
+ loop
+ if a_list.item.has_stopped then
+ a_list.remove
+ else
+ a_list.forth
+ end
+ end
+ end
+
\ No newline at end of file
diff --git a/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Iterating-on-a-LIST.wiki b/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Iterating-on-a-LIST.wiki
new file mode 100644
index 00000000..d4306b77
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Iterating-on-a-LIST.wiki
@@ -0,0 +1,64 @@
+[[Property:modification_date|Thu, 06 Sep 2018 15:21:39 GMT]]
+[[Property:publication_date|Thu, 06 Sep 2018 15:17:57 GMT]]
+[[Property:uuid|96077603-DD2D-4D8C-A486-AF4BD066613A]]
+[[Property:weight|2000]]
+[[Property:title|Iterating on a LIST]]
+There are three Eiffel mechanisms to iterate on every element of a `LIST`.
+
+=== the `across` loop ===
+The `across` can be used on every `ITERABLE` object (including `LIST` objects).
+
+
+ print_elements (a_list: LIST[INTEGER])
+ -- Print every elements on `a_list`
+ do
+ across a_list as ic loop
+ print (ic.item.out + "%N")
+ end
+ end
+
+
+Note that the temporary variable (`ic` in the example) represent an iterator of the `ITERABLE` object, and not directly an element like in many other languages (like the `for` structure in Python for example).
+
+=== the `from until` loop syntax===
+This syntax offer more possibilities than the `across` loop, but is riskier.
+
+
+ print_elements (a_list:LIST[INTEGER])
+ -- Print every elements on `a_list`
+ do
+ from
+ a_list.start
+ until
+ a_list.exhausted
+ loop
+ print (a_list.item.out + "%N")
+ a_list.forth
+ end
+ end
+
+
+=== Using Eiffel agents and `{LIST}.do_all, ....` ===
+It is possible to use agents in conjunction with the `LIST` features `do_all`, `do_if`, `there_exists`, and `for_all` which are inherited from the class `LINEAR`.
+
+ list_traversal_agents
+ -- Example of traversing a list with do_all
+ local
+ a_list: LINKED_LIST [STRING]
+ do
+ -- Insert some elements in a_list
+ create a_list.make
+ a_list.extend ("The Moon Is Full")
+ a_list.extend ("Master charge")
+ a_list.extend ("Black cat bone")
+ a_list.do_all (agent {STRING}.append (" - Albert Collins"))
+ a_list.do_all (agent print_element)
+ end
+
+ print_element (a_element: STRING)
+ -- Print `a_element` to standard output
+ do
+ io.put_string (a_element)
+ io.put_new_line
+ end
+
diff --git a/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Managing-CTRL-C-on-console.wiki b/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Managing-CTRL-C-on-console.wiki
new file mode 100644
index 00000000..bd2f1204
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/Mini-HowTo/Managing-CTRL-C-on-console.wiki
@@ -0,0 +1,50 @@
+[[Property:uuid|5CA34C5D-30F1-4D6F-9FE4-B555E541EA8C]]
+[[Property:weight|4000]]
+[[Property:title|Managing CTRL+C in console application]]
+Normally, if the user use the CTRL+C keys, the Eiffel application detect it as an error and throw an exception of type OPERATING_SYSTEM_SIGNAL_FAILURE.
+
+To manage the CTRL+C keys, you can use a rescue clause to detect the exception and a retry mecanism to cancel the exception handeling done by the Eiffel runtime.
+
+To detect the exception, you can inherit from the EXCEPTIONS class and use an attachment test on Exception_manager.last_exception.
+
+
+note
+ description: "Show how to quit an application using CTRL+C (without trace)."
+ author: "Louis Marchand"
+ date: "Wed, 25 Apr 2018 23:12:33 +0000"
+ revision: "0.1"
+
+class
+ APPLICATION
+
+inherit
+ EXCEPTIONS
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make
+ -- Launch `Current'.
+ local
+ l_ctrl_c:BOOLEAN
+ do
+ if not l_ctrl_c then
+ from until False loop
+ io.standard_default.put_string ("Press CTRL+C%N")
+ io.input.read_line
+ end
+ else
+ io.standard_default.put_string ("%NClosing...%N")
+ end
+ rescue
+ if attached {OPERATING_SYSTEM_SIGNAL_FAILURE}
+ Exception_manager.last_exception then
+ l_ctrl_c := True
+ retry
+ end
+ end
+
+end
+
\ No newline at end of file
diff --git a/documentation/18.11/eiffel/Tutorials/Mini-HowTo/index.wiki b/documentation/18.11/eiffel/Tutorials/Mini-HowTo/index.wiki
new file mode 100644
index 00000000..4473fb5c
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/Mini-HowTo/index.wiki
@@ -0,0 +1,10 @@
+[[Property:modification_date|Mon, 10 Sep 2018 09:04:15 GMT]]
+[[Property:publication_date|Mon, 10 Sep 2018 09:04:15 GMT]]
+[[Property:link_title|Mini How-tos]]
+[[Property:uuid|B2E4622A-2495-47DD-9C02-B9940A026EC1]]
+[[Property:weight|0]]
+[[Property:title|Mini How-tos]]
+In this section, you will find little how-tos that you can use to learn some very specific mechanics in Eiffel. Those how-tos are small by design and can be used to show very fundamental, or more advanced, mechanisms for beginners.
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-agents.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-agents.wiki
new file mode 100644
index 00000000..03dc9616
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-agents.wiki
@@ -0,0 +1,250 @@
+[[Property:title|ET: Agents]]
+[[Property:weight|-3]]
+[[Property:uuid|ba49a80d-5ddf-8b30-4943-528974fd0ddd]]
+Our last mechanism, agents, adds one final level of expressive power to the framework describe so far. Agents apply object-oriented concepts to the modeling of operations.
+
+==Objects for operations==
+
+Operations are not objects; in fact, object technology starts from the decision to separate these two aspects, and to choose object types, rather than the operations, as the basis for modular organization of a system, attaching each operation to the resulting modules -- the classes.
+
+In a number of applications, however, we may need objects that represent operations, so that we can include them in object structures that some other piece of the software will later traverse to uncover the operations and, usually, execute them. Such "operation wrapper" objects, called agents, are useful in a number of application areas such as: call, available on all agents to call the associated routine, is only one of the features of agents. Other features may denote properties such as the class to which the routine belongs, its precondition and postcondition, the result of the last call for a function, the number of arguments.
+
+==Building an agent==
+
+In the simplest form, also one of the most common, you obtain an agent just by writing
+
+ agent r
+
+
+where r is the name of a routine of the enclosing class. This is an expression, which you may assign to a writable entity, or pass as argument to a routine. Here for example is how you will specify event handling in the style of the EiffelVision 2 GUI library:
+
+ your_icon.click_actions.extend (agent your_routine)
+
+
+This adds to the end of your_icon.click_actions -- the list of agents associated with the "click" event for your_icon, denoting an icon in the application's user interface -- an agent representing your_routine. Then when a user clicks on the associated icon at execution, the EiffelVision 2 mechanisms will call the procedure call on every agent of the list, which for this agent will execute your_routine. This is a simple way to associate elements of your application, more precisely its "business model" (the processing that you have defined, directly connected to the application's business domain), with elements of its GUI.
+
+Similarly although in a completely different area, you may request the integration of a function your_function over the interval 0..1 through a call such as
+
+ your_integrator.integral (agent your_function, 0, 1)
+
+
+In the third example area cited above, you may call an iterator of EiffelBase through
+
+ your_list.do_all (agent your_proc)
+
+
+with your_list of a type such as LIST [YOUR_TYPE]. This will apply your_proc to every element of the list in turn.
+
+The agent mechanism is type-checked like the rest of Eiffel; so the last example is valid if and only if your_proc is a procedure with one argument of type YOUR_TYPE.
+
+==Operations on agents==
+
+An agent agent r built from a procedure r is of type PROCEDURE [T, ARGS] where T represents the class to which r belongs and ARGS the type of its arguments. If r is a function of result type RES, the type is FUNCTION [T, ARGS, RES]. Classes PROCEDURE and FUNCTION are from the Kernel Library of EiffelBase, both inheriting from ROUTINE [T, ARGS].
+
+Among the features of ROUTINE and its descendants the most important are call, already noted, which calls the associated routine, and item, appearing only in FUNCTION and yielding the result of the associated function, which it obtains by calling call.
+
+As an example of using these mechanisms, here is how the function integral could look like in our INTEGRATOR example class. The details of the integration algorithm (straight forward, and making no claims to numerical sophistication) do not matter, but you see the place were we evaluate the mathematical function associated with f, by calling item on f:
+
+ integral (f: FUNCTION [TUPLE [REAL], REAL]; low, high: REAL): REAL
+ -- Integral of `f' over the interval [`low', `high']
+ require
+ meaningful_interval: low <= high
+ local
+ x: REAL
+ do
+ from
+ x := low
+ invariant
+ x >= low
+ x <= high + step
+ -- Result approximates the integral over
+ -- the interval [low, low.max (x - step)]
+ until
+ x > high
+ loop
+ Result := Result + step * f.item ([x]) -- Here item is applied to f
+ x := x + step
+ end
+ end
+
+
+Function integral takes three arguments: the agent f representing the function to be integrated, and the two interval bounds. When we need to evaluate that function for the value x, in the line
+
+ Result := Result + step * f.item ([x])
+
+
+we don't directly pass x to item; instead, we pass a one-element tuple [x], using the syntax for manifest tuples introduced in [[ET: Other Mechanisms#Tuple_types|"Tuple types"]] . You will always use tuples for the argument to call and item, because these features must be applicable to any routine, and so cannot rely on a fixed number of arguments. Instead they take a single tuple intended to contain all the arguments. This property is reflected in the type of the second actual generic parameter to f, corresponding to ARGS (the formal generic parameter of FUNCTION): here it's TUPLE [REAL] to require an argument such as [x], where x is of type REAL.
+
+Similarly, consider the agent that the call seen above:
+
+ your_icon.click_actions.extend (agent your_routine)
+
+
+added to an EiffelVision list. When the EiffelVision mechanism detects a mouse click event, it will apply to each element item of the list of agents, your_icon.click_actions, an instruction such as
+
+ item.call ([x, y])
+
+
+where x and y are the coordinates of the mouse clicking position. If item denotes the list element agent your_routine, inserted by the above call to extend, the effect will be the same as that of calling
+
+ your_routine (x, y)
+
+
+assuming that your_routine indeed takes arguments of the appropriate type, here INTEGER representing a coordinate in pixels. (Otherwise type checking would have rejected the call to extend.)
+
+==Open and closed arguments==
+
+In the examples so far, execution of the agent's associated routine, through item or call, passed exactly the arguments that a direct call to the routine would expect. You can have more flexibility. In particular, you may build an agent from a routine with more arguments than expected in the final call, and you may set the values of some arguments at the time you define the agent.
+
+Assume for example that a cartographical application lets a user record the location of a city by clicking on the corresponding position on the map. The application may do this through a procedure
+
+ record_city (cn: STRING; pop: INTEGER; x, y: INTEGER)
+ -- Record that the city of name `cn' is at coordinates
+ -- `x' and `y' with population `pop'.
+
+
+Then you can associate it with the GUI through a call such as
+
+ map.click_actions.extend (agent record_city (name, population, ?, ?))
+
+
+assuming that the information on the name and the population has already been determined. What the agent denotes is the same as agent your_routine as given before, where your_routine would be a fictitious two-argument routine obtained from record_city -- a four-argument routine -- by setting the first two arguments once and for all to the values given, name and population.
+
+In the agent agent record_city (name, population, ?, ?), we say that these first two arguments, with their set values, are '''closed'''; the last two are '''open'''. The question mark syntax introduced by this example may only appear in agent expressions; it denotes open arguments. This means, by the way, that you may view the basic form used in the preceding examples, agent your_routine, as an abbreviation -- assuming your_routine has two arguments -- for agent your_routine (?, ?). It is indeed permitted, to define an agent with all arguments open, to omit the argument list altogether; no ambiguity may result.
+
+For type checking, agent record_city (name, population, ?, ?) and agent your_routine (?, ?) are acceptable in exactly the same situations, since both represent routines with two arguments. The type of both is
+
+ PROCEDURE [TUPLE [INTEGER, INTEGER]]
+
+
+where the tuple type specifies the open operands.
+
+A completely closed agent, such as agent your_routine (25, 32) or agent record_city (name, population, 25, 32), has the type TUPLE, with no parameters; you will call it with call ([ ]), using an empty tuple as argument.
+
+The freedom to start from a routine with an arbitrary number of arguments, and choose which ones you want to close and which ones to leave open, provides a good part of the attraction of the agent mechanism. It means in particular that in GUI applications you can limit to the strict minimum the "glue" code (sometimes called the controller in the so-called MVC, Model-View Controller, scheme of GUI design) between the user interface and "business model" parts of a system. A routine such as record_city is a typical example of an element of the business model, uninfluenced -- as it should be -- by considerations of user interface design. Yet by passing it in the form of an agent with partially open and partially closed arguments, you may be able to use it directly in the GUI, as shown above, without any "controller" code.
+
+As another example of the mechanism's versatility, we saw above an integral function that could integrate a function of one variable over an interval, as in
+
+ your_integrator.integral (agent your_function (0, 1))
+
+
+Now assume that function3 takes three arguments. To integrate function3 with two arguments fixed, you don't need a new integral function; just use the same integral as before, judiciously selecting what to close and what to leave open:
+
+ your_integrator.integral (agent function3 (3.5, ?, 6.0), 0, 1)
+
+
+==Open targets==
+
+All the agent examples seen so far were based on routines of the enclosing class. This is not required. Feature calls, as you remember, were either unqualified, as in f (x, y), or qualified, as in a.g (x, y). Agents, too, have a qualified variant as in
+
+ agent a.g
+
+
+which is closed on its target a and open on the arguments. Variants such as agent a.g (x, y), all closed, and agent a.g (?, y), open on one argument, are all valid.
+
+You may also want to make the target open. The question mark syntax could not work here, since it wouldn't tell us the class to which feature g belongs, known in the preceding examples from the type of a. As in creation expressions, we must list the type explicitly; the convention is the same: write the types in braces, as in
+
+ agent {SOME_TYPE}.g
+ agent {SOME_TYPE}.g (?, ?)
+ agent {SOME_TYPE}.g (?, y)
+
+
+The first two of these examples are open on the target and both operands; they mean the same. The third is closed on one argument, open on the other and on the target.
+
+These possibilities give even more flexibility to the mechanism because they mean that an operation that needs agents with certain arguments open doesn't care whether they come from an argument or an operand of the original routine. This is particularly useful for iterators and means that if you have two lists
+
+ your_account_list: LIST [ACCOUNT]
+ your_integer_list: LIST [INTEGER]
+
+
+you may write both
+
+ your_account_list.do_all (agent {ACCOUNT}.deposit_one_grand)
+ your_integer_list.do_all (agent add_to_total)
+
+
+even though the two procedures used in the agents have quite different forms. We are assuming here that the first one, a feature of class ACCOUNT, is something like
+
+ deposit_one_grand
+ -- Deposit one thousand into `Current'.
+ do
+ deposit (1000)
+ end
+
+
+The procedure deposit_one_grand takes no arguments. In the do_all example above, its target is open. The target will be, in turn, each instance of ACCOUNT in your_account_list.
+
+In contrast, the other routine, assumed to be a feature of the calling class, does take an argument x:
+
+ add_to_total (x: INTEGER)
+ -- Add `x' to the value of `total'.
+ do
+ total := total + x
+ end
+
+
+Here, total is assumed to be an integer attribute of the enclosing class. In the do_all example, each instance of your_integer_list will fill the argument x left open in add_to_total.
+
+Without the versatility of playing with open and closed arguments for both the original arguments and target, you would have to write separate iteration mechanisms for these two cases. Here you can use a single iteration routine of LIST and similar classes of EiffelBase, do_all, for both purposes: do_all examples in the previous section, the agents would be coded as follows:
+
+
+ your_account_list.do_all
+ (agent (a: ACCOUNT)
+ do
+ a.deposit (1000)
+ end)
+
+
+and
+
+
+ your_integer_list.do_all
+ (agent (i: INTEGER)
+ do
+ total := total + i
+ end)
+
+
+The syntax of the inline agent corresponds to the syntax of a routine. Immediately following the agent keyword are the formal arguments and in the case of functions the type for Result. Inline agents can have local entities, preconditions, and postconditions, just like any routine.
+
+Inline agents do not have access to the local entities of the routine in which they are coded. So, if it is necessary to use the routine's local variables, they must be passed as arguments to the inline agent.
+
+Here's an example of an inline agent which is a function. It is used in the context of a check to see if every element of your_integer_list is positive:
+
+
+ your_integer_list.for_all
+ (agent (i: INTEGER): BOOLEAN
+ do
+ Result := (i > 0)
+ ensure
+ definition: Result = (i > 0)
+ end)
+
+
+Inline agents are interesting also as an implementation of the notion of [http://en.wikipedia.org/wiki/Closure_(computer_science) closures] in computer science.
+
+
+Agents provide a welcome complement to the other mechanisms of Eiffel. They do not conflict with them but, when appropriate -- as in the examples sketched in this section -- provide clear and expressive programming schemes, superior to the alternatives.
+
+Compatibility note: earlier versions of the agent classes (ROUTINE, PROCEDURE, FUNCTION, PREDICATE) had an extra initial generic parameter, for which ANY was generally used. The compiler has been engineered to accept the old style in most cases.
+
+
+{{SeeAlso|[[Event Programming with Agents]] }}
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-design-contract-tm-assertions-and-exceptions.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-design-contract-tm-assertions-and-exceptions.wiki
new file mode 100644
index 00000000..d9edb63f
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-design-contract-tm-assertions-and-exceptions.wiki
@@ -0,0 +1,337 @@
+[[Property:title|ET: Design by Contract (tm), Assertions and Exceptions]]
+[[Property:weight|-8]]
+[[Property:uuid|2ef367c9-34d9-d45e-a722-163b39581405]]
+Eiffel directly implements the ideas of Design by Contract , which enhance software reliability and provide a sound basis for software specification, documentation and testing, as well as exception handling and the proper use of inheritance.
+
+==Design by Contract basics==
+
+A system -- a software system in particular, but the ideas are more general -- is made of a number of cooperating components. Design by Contract states that their cooperation should be based on precise specifications -- contracts -- describing each party's expectations and guarantees.
+
+An Eiffel contract is similar to a real-life contract between two people or two companies, which it is convenient to express in the form of tables listing the expectations and guarantees. Here for example is how we could sketch the contract between a homeowner and the telephone company:
+
+
+{| border="1"
+|-
+| style="width=10%" |provide telephone service
+| style="width=35%" |'''OBLIGATIONS'''
+| style="width=35%" |'''BENEFITS'''
+|-
+| '''Client'''
+| (Satisfy precondition:) require), postconditions (ensure) and class invariants (invariant), as well as other assertion constructs studied later (see "[[ET: Instructions|Instructions]]" ): loop invariants and variants, check instructions.
+
+Here is a partial update of class ACCOUNT with more assertions:
+
+note
+ description: "Simple bank accounts"
+
+class
+ ACCOUNT
+
+feature -- Access
+
+ balance: INTEGER
+ -- Current balance
+
+ deposit_count: INTEGER
+ -- Number of deposits made since opening
+ do
+ ... As before ...
+ end
+
+feature -- Element change
+
+ deposit (sum: INTEGER)
+ -- Add `sum' to account.
+ require
+ non_negative: sum >= 0
+ do
+ ... As before ...
+ ensure
+ one_more_deposit: deposit_count = old deposit_count + 1
+ updated: balance = old balance + sum
+ end
+
+feature {NONE} -- Implementation
+
+ all_deposits: DEPOSIT_LIST
+ -- List of deposits since account's opening.
+
+invariant
+ consistent_balance: (all_deposits /= Void) implies
+ (balance = all_deposits . total)
+ zero_if_no_deposits: (all_deposits = Void) implies
+ (balance = 0)
+
+end -- class ACCOUNT
+
+
+Each assertion is made of one or more subclauses, each of them a boolean expression (with the additional possibility of the old construct). The effect of including more than one sub clause, as in the postcondition of deposit and in the invariant, is the same as connecting them through an and. Each clause may be preceded by a label, such as consistent_balance in the invariant, and a colon; the label is optional and does not affect the assertion's semantics, except for error reporting as explained in the next section, but including it systematically is part of the recommended style. The value of the boolean expression a implies b is true except if a is true and b false.
+
+Because assertions benefit from the full power of boolean expressions, they may include function calls. This makes it possible to express sophisticated consistency conditions, such as " the graph contains no cycle", which would not be otherwise expressible through simple expressions, or even through first-order predicate calculus, but which are easy to implement as Eiffel functions returning boolean results.
+
+===Preconditions===
+
+The precondition of a routine expresses conditions that the routine is imposing on its clients. Here a call to deposit is correct if and only if the value of the argument is non-negative. The routine does not guarantee anything for a call that does not satisfy the precondition. It is in fact part of the Eiffel method that a routine body should '''never''' test for the precondition, since it is the client's responsibility to ensure it. (An apparent paradox of Design by Contract, which is reflected in the bottom-right entries of the preceding and following contract tables, and should not be a paradox any more at the end of this discussion, is that one can get more reliable software by having fewer explicit checks in the software text.)
+
+===Postconditions===
+
+The postcondition of a routine expresses what the routine guaranteed to its clients for calls satisfying the precondition. The notation old expression, valid in postconditions ( ensure clauses) only, denotes the value that expression had on entry to the routine.
+
+The precondition and postcondition state the terms of the contract between the routine and its clients, similar to the earlier example of a human contract:
+
+
+{| border="1"
+|-
+| style="width=10%" |deposit
+| style="width=35%"| '''OBLIGATIONS'''
+| style="width=35%" | '''BENEFITS'''
+|-
+| '''Client'''
+| (Satisfy precondition:) all_deposits is compatible with the balance; bad news because, in addition to its official contract as expressed by its specific postcondition, every routine must take care of restoring the invariant on exit.
+
+A requirement on meaningful contracts is that they should be in good faith: satisfiable by an honest partner. This implies a consistency rule: if a routine is exported to a client (either generally or selectively), any feature appearing in its precondition must also be available to that client. Otherwise -- for example if the precondition included require n > 0, where n is a secret attribute -- the supplier would be making demands that a good-faith client cannot possibly check for.
+
+Note in this respect that guaranteeing a precondition does not necessarily mean, for the client, testing for it. Assuming n is exported, a call may test for the precondition
+
+ if x.n > 0 then
+ x.r
+ end
+
+
+possibly with an else part. But if the context of the call, in the client's code, implies that n is positive -- perhaps because some preceding call set it to the sum of two squares -- then there is no need for an if or similar construct.
+
+{{note|In such a case, a check instruction as introduced later ( "[[ET: Instructions|Instructions]]" ) is recommended if the reason for omitting the test is non-trivial. }}
+
+==Using contracts for built-in reliability==
+
+What are contracts good for? Their first use is purely methodological. By applying a discipline of expressing, as precisely as possible, the logical assumptions behind software elements, you can write software whose reliability is built-in: software that is developed hand-in-hand with the rationale for its correctness.
+
+This simple observation -- usually not clear to people until they have practiced Design by Contract thoroughly on a large-scale project -- brings as much change to software practices and quality as the rest of object technology.
+
+==Run-time assertion monitoring==
+
+Contracts in Eiffel are not just wishful thinking. They can be monitored at run time under the control of compilation options.
+
+It should be clear from the preceding discussion that contracts are not a mechanism to test for special conditions, for example erroneous user input. For that purpose, the usual control structures ( if deposit_sum > 0 then ...) are available, complemented in applicable cases by the exception handling mechanism reviewed next. An assertion is instead a '''correctness condition''' governing the relationship between two software modules (not a software module and a human, or a software module and an external device). If sum is negative on entry to deposit, violating the precondition, the culprit is some other software element, whose author was not careful enough to observe the terms of the deal. Bluntly:
+
+{{rule|name=Assertion Violation|text=A run-time assertion violation is the manifestation of a bug. }}
+
+To be more precise: no : assertions have no run-time effect.
+* require : monitor preconditions only, on routine entry.
+* ensure : preconditions on entry, postconditions on exit.
+* invariant : same as ensure, plus class invariant on both entry and exit for qualified calls.
+* all : same as invariant, plus check instructions, loop invariants and loop variants.
+
+
+An assertion violation, if detected at run time under one of these options other than the first, will cause an exception ( [[ET: Design by Contract (tm), Assertions and Exceptions#exception_handling|"Exception handling"]] ). Unless the software has an explicit "retry" plan as explained in the discussion of exceptions, the violation will produce an exception trace and cause termination (or, in EiffelStudio, a return to the environment's browsing and debugging facilities at the point of failure). If present, the label of the violated sub clause will be displayed, to help identify the problem.
+
+The default is require. This is particularly interesting in connection with the Eiffel method's insistence on reuse: with libraries such as EiffelBase, richly equipped with preconditions expressing terms of use, an error in the '''client software''' will often lead, for example through an incorrect argument, to violating one of these preconditions. A somewhat paradoxical consequence is that even an application developer who does not apply the method too well (out of carelessness, haste, indifference or ignorance) will still benefit from the presence of contracts in someone else's library code.
+
+During development and testing, assertion monitoring should be turned on at the highest possible level. Combined with static typing and the immediate feedback of compilation techniques such as the Melting Ice Technology, this permits the development process mentioned in the section [[ET: The Software Process in Eiffel#Quality_and_functionality|"Quality and functionality"]], where errors are exterminated at birth. No one who has not practiced the method in a real project can imagine how many mistakes are found in this way; surprisingly often, a violation will turn out to affect an assertion that was just included for goodness' sake, the developer being convinced that it could never "possibly" fail to be satisfied.
+
+By providing a precise reference (the description of what the software is supposed to do) against which to assess the reality (what the software actually does), Design by Contract profoundly transforms the activities of debugging, testing and quality assurance.
+
+When releasing the final version of a system, it is usually appropriate to turn off assertion monitoring, or bring it down to the require level. The exact policy depends on the circumstances; it is a trade off between efficiency considerations, the potential cost of mistakes, and how much the developers and quality assurance team trust the product. When developing the software, however, you should always assume -- to avoid loosening your guard -- that in the end monitoring will be turned off.
+
+==The contract form of a class==
+
+Another application of assertions governs documentation. Environment mechanisms, such as clicking the Form Contract icon in Eiffelstudio, will produce, from a class text, an abstracted version which only includes the information relevant for client authors. Here is the contract form of class ACCOUNT in the latest version given:
+
+note
+ description: "Simple bank accounts"
+
+class interface
+ ACCOUNT
+
+feature -- Access
+
+ balance: INTEGER
+ -- Current balance
+
+ deposit_count: INTEGER
+ -- Number of deposits made since opening
+
+feature -- Element change
+
+ deposit (sum: INTEGER)
+ -- Add `sum' to account.
+ require
+ non_negative: sum >= 0
+ ensure
+ one_more_deposit: deposit_count = old deposit_count + 1
+ updated: balance = old balance + sum
+
+invariant
+ consistent_balance: balance = all_deposits.total
+
+end -- class interface ACCOUNT
+
+
+The words class interface are used instead of just class to avoid any confusion with actual Eiffel text, since this is documentation, not executable software. (It is in fact possible to generate a compilable variant of the Contract Form in the form of a deferred class, a notion defined later.)
+
+Compared to the full text, the Contract Form of a class (also called its "short form") retains all its interface properties, relevant to client authors: do clauses, or the external and once variants seen in [[ET: The Static Picture: System Organization#External_software|"External software"]] above and [[ET: Other Mechanisms#Once_routines_and_shared_objects|"Once routines and shared objects"]] below); assertion subclauses involving non-exported features; and some keywords not useful in the documentation.
+
+In accordance with the Uniform Access principle (described in [[ET: The Dynamic Structure: Execution Model|"Objects, fields, values, and references"]] ), the Contract Form does not distinguish between attributes and argument-less queries. In the above example, balance could be one or the other, as it makes no difference to clients, except possibly for performance.
+
+The Contract Form is the fundamental tool for using supplier classes in the Eiffel method. It enables client authors to reuse software elements without having to read their source code. This is a crucial requirement in large-scale industrial developments.
+
+The Contract Form satisfies two key requirements of good software documentation: fail, that is to say be unable to meet its contract; for example an arithmetic operation may produce an overflow (a non-representable result).
+* The failure of an operation is an '''exception''' for the routine that needed the operation.
+* As a result the routine may fail too -- causing an exception in its own caller.
+
+
+
+Note the precise definitions of the two key concepts, failure and exception. Although failure is the more basic one -- since it is defined for atomic, non-routine operations -- the definitions are mutually recursive, since an exception may cause a failure of the recipient routine, and a routine's failure causes an exception in its own caller.
+
+Why state that an exception "may" cause a failure? It is indeed possible to "rescue" a routine from failure in the case of an exception, by equipping it with a clause labeled rescue, as in:
+
+ read_next_character (f: FILE)
+ -- Make next character available in last_character.
+ -- If impossible, set failed to True.
+ require
+ readable: file.readable
+ local
+ impossible: BOOLEAN
+ do
+ if impossible then
+ failed := True
+ else
+ last_character := low_level_read_function (f)
+ end
+ rescue
+ impossible := True
+ retry
+ end
+
+
+This example includes the only two constructs needed for exception handling: rescue and retry. A retry instruction is only permitted in a rescue clause; its effect is to start again the execution of the routine, without repeating the initialization of local entities (such as impossible in the example, which was initialized to False on first entry). Features failed and last_character are assumed to be attributes of the enclosing class.
+
+This example is typical of the use of exceptions: as a last resort, for situations that should not occur. The routine has a precondition, file.readable, which ascertains that the file exists and is accessible for reading characters. So clients should check that everything is fine before calling the routine. Although this check is almost always a guarantee of success, a rare combination of circumstances could cause a change of file status (because a user or some other system is manipulating the file) between the check for readable and the call to low_level_read_function. If we assume this latter function will fail if the file is not readable, we must catch the exception.
+
+A variant would be
+
+ local
+ attempts: INTEGER
+ do
+ if attempts < Max_attempts then
+ last_character := low_level_read_function (f)
+ else
+ failed := True
+ end
+ rescue
+ attempts := attempts + 1
+ retry
+ end
+
+
+which would try again up to Max_attempts times before giving up.
+
+The above routine, in either variant, never fails: it always fulfills its contract, which states that it should either read a character or set failed to record its inability to do so. In contrast, consider the new variant
+
+ local
+ attempts: INTEGER
+ do
+ last_character := low_level_read_function (f)
+ rescue
+ attempts := attempts + 1
+ if attempts < Max_attempts then
+ retry
+ end
+ end
+
+
+with no more role for failed. In this case, after Max_attempts unsuccessful attempts, the routine will execute its rescue clause to the end, with no retry (the if having no else clause). This is how a routine '''fails'''. It will, as noted, pass on the exception to its caller.
+
+Such a rescue clause should, before terminating, restore the invariant of the class so that the caller and possible subsequent retryattempts from higher up find the objects in a consistent state. As a result, the rule for an absent rescue clause -- the case for the vast majority of routines in most systems -- is that it is equivalent to
+
+ rescue
+ default_rescue
+
+
+where procedure default_rescue comes from ANY, where it is defined to do nothing; in a system built for robustness, classes subject to non-explicitly-rescued exceptions should redefine default_rescue (perhaps using a creation procedure, which is bound by the same formal requirement) so that it will always restore the invariant.
+
+Behind Eiffel's exception handling scheme lies the principle -- at first an apparent platitude, but violated by many existing mechanisms -- that a routine should '''either succeed or fail'''. This is in turn a consequence of Design by Contract principles: succeeding means being able to fulfill the contract, possibly after one or more retry; failure is the other case, which must always trigger an exception in the caller. Otherwise it would be possible for a routine to miss its contract and yet return to its caller in a seemingly normal state. That is the worst possible way to handle an exception.
+
+Concretely, exceptions may result from the following events: rescue clause executed to the end with no retry), as just seen.
+* Assertion violation, if for a system that runs with assertion monitoring on.
+* Attempt to call a feature on a void reference: x.f (...), the fundamental computational mechanism, can only work if x is attached to an object, and will cause an exception otherwise.
+* Developer exception, as seen next.
+* Operating system signal:arithmetic overfolow; no memory available for a requested creation or twin -- even after garbage collection has rummaged everything to find some space. (But no C/C++-like "wrong pointer address", which cannot occur thanks to the statically typed nature of Eiffel.)
+
+
+It is sometimes useful, when handling exceptions in rescue clauses, to ascertain the exact nature of the exception that got the execution there. For this it is suffices to inherit from the Kernel Library class EXCEPTIONS, which provides queries such as exception, giving the code for the last exception, and symbolic names ( [[ET: Other Mechanisms#Constant_attributes|"Constant attributes"]] ) for all such codes, such as No_more_memory. You can then process different exceptions differently by testing exception against various possibilities. The method strongly suggests, however, that exception handling code should remain simple; a complicated algorithm in a rescue clause is usually a sign that the mechanism is being misused. Class EXCEPTIONS also provides various facilities for fine-tuning the exception facilities, such as a procedure raise that will explicitly trigger a "developer exception" with a code that can then be detected and processed. Exception handling helps produce Eiffel software that is not just correct but robust, by planning for cases that should not normally arise, but might out of Murphy's law, and ensuring they do not affect the software's basic safety and simplicity.
+
+==Other applications of Design by Contract==
+
+The Design by Contract ideas pervade the Eiffel method. In addition to the applications just mentioned, they have two particularly important consequences: ACCOUNT is a data structure representing a bank account; an instance of LINKED_LIST is a data structure representing a linked list.
+
+An '''object''', as may be created during the execution of a system, is an instance of some class of the system.
+
+Classes and objects belong to different worlds: a class is an element of the software text; an object is a data structure created during execution. Although is possible to define a class whose instances represent classes, this does not eliminate the distinction between a static, compile-time notion, class, and a dynamic, run-time notion, object.
+
+An object is either an atomic object (integer, real, boolean, double) or a composite object made of a number of '''fields''', represented by adjacent rectangles on the conventional run-time diagrams:
+
+
+[[Image:tutorial-5]]
+
+
+Each field is a '''value'''. A value can be either an object or an object reference: ACCOUNT may have an attribute balance; then all instances of the class will have a corresponding field containing each account's current balance.
+* A routine describes a computation applicable to all instances of the class. ACCOUNT may have a routine withdraw .
+* Routines are further classified into '''functions''', which will return a result, and '''procedures''', which will not. Routine withdraw will be a procedure; an example of function may be highest_deposit, which returns the highest deposit made so far to the account.
+
+If we instead take the viewpoint of the '''clients''' of a class (the classes relying on its feature), you can see the relevant classification by starting from the left on the figure:
+* '''Commands''' have no result, and may modify an object. They may only be procedures.
+* '''Queries''' have a result: they return information about an object. You may implement a query as either an attribute (by reserving space for the corresponding information in each instance of the class, a memory-based solution) or a function (a computation-based solution). An attribute is only possible for a query without argument, such as balance; a query with arguments, such as balance_on (d) , returning the balance at date d, can only be a function.
+
+From the outside, there is no difference between a query implemented as an attribute and one implemented as a function: to obtain the balance of an account a, you will always write a.balance. In the implementation suggested above, a is an attribute, so that the notation denotes an access to the corresponding object field. But it is also possible to implement a as a function, whose algorithm will explore the lists of deposits and withdrawals and compute their accumulated value. To the clients of the class, and in the official class documentation as produced by the environment tools, the difference is not visible.
+
+This principle of '''Uniform Access''' is central to Eiffel's goals of extendibility, reusability and maintainability: you can change the implementation without affecting clients; and you can reuse a class without having to know the details of its features' implementations. Most object-oriented languages force clients to use a different notation for a function call and an attribute access. This violates Uniform Access and is an impediment to software evolution, turning internal representation changes into interface changes that may disrupt large parts of a system.
+
+==A simple class==
+
+The following simple class text illustrates the preceding concepts
+
+note
+ description: "Simple bank accounts"
+
+class
+ ACCOUNT
+
+feature -- Access
+
+ balance: INTEGER
+ -- Current balance
+
+ deposit_count: INTEGER
+ -- Number of deposits made since opening
+ do
+ if all_deposits /= Void then
+ Result := all_deposits.count
+ end
+ end
+
+feature -- Element change
+
+ deposit (sum: INTEGER)
+ -- Add `sum' to account.
+ do
+ if all_deposits = Void then
+ create all_deposits
+ end
+
+ all_deposits.extend (sum)
+ balance := balance + sum
+ end
+
+feature {NONE} -- Implementation
+
+ all_deposits: DEPOSIT_LIST
+ -- List of deposits since account's opening.
+
+invariant
+ consistent_balance:
+ (all_deposits /= Void) implies (balance = all_deposits.total)
+ zero_if_no_deposits:
+ (all_deposits = Void) implies (balance = 0)
+
+end -- class ACCOUNT
+
+
+(The {NONE} qualifier and the invariant clause, used here to make the example closer to a real class, will be explained shortly. DEPOSIT_LIST refers to another class, which can be written separately using library classes.)
+
+It's easy to deduce, from a feature's syntactic appearance, the category to which it belongs. Here:
+* Only deposit and deposit_count, which include a do ... clause, are routines.
+* balance and all_deposits, which are simply declared with a type, are attributes. Note that even for attributes it is recommended to have a header comment.
+* Routine deposit_count is declared as returning a result (of type INTEGER); so it is a function.
+* Routine deposit has no such result and hence is a procedure.
+
+==Creating and initializing objects==
+
+Classes, as noted, are a static notion. Objects appear at run time; they are created explicitly. Here is the basic instruction to create an object of type ACCOUNT and attach it to x:
+
+ create x
+
+
+assuming that x has been declared of type ACCOUNT. Such an instruction must be in a routine of some class -- the only place where instructions can appear -- and its effect at run time will be threefold: create a new object of type ACCOUNT; initialize its fields to default values; and attach the value of x to it. Here the object will have two fields corresponding to the two attributes of the generating class: an integer for balance, which will be initialized to 0, and a reference for all_deposits, which will be initialized to a void reference:
+
+
+[[Image:tutorial-7]]
+
+
+The language specifies default initialization values for all possible types:
+{|
+|-
+|
+'''Type'''
+
+|
+|
+'''Default value'''
+
+|-
+|
+INTEGER, REAL, DOUBLE
+
+|
+|
+Zero
+
+|-
+|
+BOOLEAN
+
+|
+|
+False
+
+|-
+|
+CHARACTER
+
+|
+|
+Null
+
+|-
+|
+Reference types (such as ACCOUNT and DEPOSIT_LIST)
+
+|
+|
+Void reference
+
+|-
+|
+Composite expanded types (see next)
+
+|
+|
+Same rules, applied recursively to all fields
+
+|}
+
+It is possible to override the initialization values by providing -- as in the earlier example of class HELLO -- one or more creation procedures. For example we might change ACCOUNT to make sure that every account is created with an initial deposit:
+
+note
+ description : "Simple bank accounts, initialized with a first deposit"
+
+class
+ ACCOUNT1
+
+create
+ make
+
+feature -- Initialization
+
+ make (sum: INTEGER)
+ -- Initialize account with `sum' .
+ do
+ deposit (sum)
+ end
+
+ -- The rest of the class as for ACCOUNT
+
+end -- class ACCOUNT1
+
+
+A create clause may list zero or more (here just one) procedures of the class.
+
+{{info|Note the use of the same keyword, create , for both a creation clause, as here, and creation instructions such as create x . }}
+
+In this case the original form of creation instruction, create x , is not valid any more for creating an instance of ACCOUNT1; you must use the form
+
+ create x.make (2000)
+
+known as a creation call. Such a creation call will have the same effect as the original form -- creation, initialization, attachment to -- x followed by the effect of calling the selected creation procedure, which here will call deposit with the given argument.
+
+Note that in this example all that make does is to call deposit. So an alternative to introducing a new procedure make would have been simply to introduce a creation clause of the form create deposit , elevating deposit to the status of creation procedure. Then a creation call would be of the form create x.deposit (2000) .
+
+{{info|Some variants of the basic creation instruction will be reviewed later: instruction with an explicit type; creation expressions. See [[ET: Other Mechanisms#Creation_variants|"Creation variants"]] . }}
+
+==Entities==
+
+The example assumed x declared of type ACCOUNT (or ACCOUNT1). Such an x is an example of '''entity''', a notion generalizing the well-known concept of variable. An entity is a name that appears in a class text to represent possible run-time values (a value being, as defined earlier, an object or a reference). An entity is one of the following: balance and all_deposits.
+* A formal argument of a routine, such as sum for deposit and make.
+* A local entity declared for the internal needs of a routine.
+* The special entity Result in a function.
+
+
+The third case, local entities, arises when a routine needs some auxiliary values for its computation. Here is an example of the syntax:
+
+ deposit (sum: INTEGER)
+ -- Add sum to account.
+ local
+ new: AMOUNT
+ do
+ create new.make (sum)
+ all_deposits.extend (new)
+ balance := balance + sum
+ end
+
+
+This example is a variant of deposit for which we assume that the elements of a DEPOSIT_LIST such as all_deposits are no longer just integers, but objects, instances of a new class, AMOUNT. Such an object will contain an integer value, but possibly other information as well. So for the purpose of procedure deposit we create an instance of AMOUNT and insert it, using procedure extend, into the list all_deposits. The object is identified through the local entity new, which is only needed within each execution of the routine (as opposed to an attribute, which yields an object field that will remain in existence for as long as the object).
+
+The last case of entity, Result, serves to denote, within the body of a function, the final result to be returned by that function. This was illustrated by the function deposit_count, which read
+
+ deposit_count: INTEGER
+ -- Number of deposits made since opening (provisional version)
+ do
+ if all_deposits /= Void then
+ Result := all_deposits.count
+ end
+ end
+
+
+The value returned by any call will be the value of the expression all_deposits.count (to be explained in detail shortly) for that call, unless all_deposits is a Void reference ( /= means "not equal").
+
+The default initialization rules seen earlier for attributes (see the table above) also serve to initialize local entities and Result on routine entry. So in the last example, if all_deposits is void (as in the case on initialization with the class as given so far), Result keeps its default value of 0, which will be returned as the result of the function.
+
+==Calls==
+
+Apart from object creation, the basic computational mechanism, in the object-oriented style of computation represented by Eiffel, is feature call. In its basic form, it appears as
+
+ target.feature (argument1, ...)
+
+
+where target is an entity or more generally an expression, feature is a feature name, and there may be zero or more argument expressions. In the absence of any argument the part in parentheses should be removed.
+
+We have already seen such calls. If the feature denotes a procedure, the call is an instruction, as in
+
+ all_deposits.extend (new)
+
+
+If feature denotes a query (function or attribute), the call is an expression, as in the right-hand side of
+
+ Result := all_deposits.count
+
+
+Following the principle of Uniform Access (mentioned earlier in the section ''Objects, fields, values, and references''), this form is the same for calls to attributes and to functions without arguments. In this example, feature count from class DEPOSIT_LIST may indeed be implemented in either of these two ways: we can keep a count field in each list, updating it for each insertion and removal; or we can compute count, whenever requested, by traversing the list and counting the number of items.
+
+In the case of a routine with arguments -- procedure or function -- the routine will be declared, in its class, as
+
+ some_feature (formal_1: TYPE_1; ...)
+ do
+ ...
+ end
+
+
+meaning that, at the time of each call, the value of each formal will be set to the corresponding actual (formal_1 to argument_1 and so on).
+
+In the routine body, it is not permitted to change the value of a formal argument, although it is possible to change the value of an attached object through a procedure call such as formal_1.some_procedure ( ... ) .
+
+==Infix and prefix notations==
+
+Basic types such as INTEGER are, as noted, full-status citizens of Eiffel's type system, and so are declared as classes (part of the Kernel Library). INTEGER, for example, is characterized by the features describing integer operations: plus, minus, times, division, less than, and so on.
+
+With the dot notation seen so far, this would imply that simple arithmetic operations would have to be written with a syntax such as
+
+ i.plus (j)
+
+instead of the usual
+
+ i + j
+
+This would be awkward. Infix and prefix notations solve the problem, reconciling the object-oriented view of computation with common notational practices of mathematics. The addition function is declared in class INTEGER as
+
+ plus alias "+" (other: INTEGER): INTEGER
+ do
+ ...
+ end
+
+
+Such a feature has all the properties and prerogatives of both normal "identifier-dot" notation and infix notation. This allowing invoking plus using either notation: i.plus (j) or i + j . A feature such as plus allowing infix notation must be a function, and take exactly one argument.
+
+Prefix notation is allowed as well. A function can be declared as opposite alias "-" , with no argument, permitting calls of the form -3 rather than (3).opposite .
+
+Predefined library classes covering basic types such as INTEGER, CHARACTER, BOOLEAN, REAL, DOUBLE are known to the Eiffel compiler, so that a call of the form j + i, although conceptually equivalent to a routine call, can be processed just as efficiently as the corresponding arithmetic expression in an ordinary programming language. This brings the best of both worlds: conceptual simplicity, enabling Eiffel developers, when they want to, to think of integers and the like as objects; and efficiency as good as in lower-level approaches.
+
+Infix and prefix notations are available to any class, not just the basic types' predefined classes. For example a graphics class could use the name distance alias "|-|" for a function computing the distance between two points, to be used in expressions such as
+
+ point1 |-| point2
+
+
+==Type declaration==
+
+Every entity appearing in an Eiffel text is declared as being of a certain type, using the syntax already encountered in the above examples:
+
+ entity_name: TYPE_NAME
+
+
+This applies to attributes, formal arguments of routines and local entities. You will also declare the result type for a function, as in the earlier example
+
+ deposit_count: INTEGER ...
+
+
+Specifying such a function result type also declares, implicitly, the type for Result as used in the function's body.
+
+What is a type? With the elements seen so far, every type is a class . INTEGER, used in the declaration of deposits_count, is, as we have seen, a library class; and the declaration all_deposits: DEPOSIT_LIST assumes the existence of a class DEPOSIT_LIST .
+
+Three mechanisms introduced below -- expanded types, genericity, and anchored declarations -- will generalize the notion of type slightly. But they do not change the fundamental property that '''every type is based on a class''', called the type's '''base class'''. In the examples seen so far, each type is a class, serving as its own base class.
+
+An instance of a class C is also called "an object of type C".
+
+==Type categories==
+
+It was noted above that a value is either an object or a reference. This corresponds to two kinds of type: reference types and expanded types.
+
+If a class is declared as just
+
+class CLASS_NAME ...
+
+
+it defines a reference type. The entities declared of that type will denote references. So in the declaration
+
+ x: ACCOUNT
+
+
+the possible run-time values for x are references, which will be either void or attached to instances of class ACCOUNT .
+
+Instead of class, however, you may use the double keyword expanded class , as in the EiffelBase class definition
+
+note
+ description : "Integer values"
+
+expanded class
+ INTEGER
+
+feature -- Basic operations
+
+ plus alias "+" (other: INTEGER): INTEGER
+ do
+ ...
+ end
+
+ ... Other feature declarations ...
+
+end -- class INTEGER
+
+
+In this case the value of an entity declared as n: INTEGER is not a reference to an object, but the object itself -- in this case an atomic object, an integer value.
+
+Expanded classes make it possible to construct composite objects with subobjects. Suppose that two classes, ENGINE and PLANT, are suppliers to the class CAR. Further, ENGINE is defined as expanded, and PLANT is ''not'' defined as expanded. So, here's an abbreviated class declaration (note clause and routines omitted) for CAR:
+
+class CAR
+
+feature
+
+ engine: ENGINE
+
+ originating_plant: PLANT
+
+end -- class CAR
+
+
+We can illustrate the structure of a typical instance of CAR like this:
+
+
+[[Image:tutorial-8]]
+
+
+The field for the attribute originating_plant is a reference to an object of type PLANT external to the instance of CAR. But in the case of the attribute engine, the fields for the instance of ENGINE exist as a subobject within the instance of CAR, because of class ENGINE's expanded nature.
+
+This example also illustrates that the distinction between expanded and reference types is important not just for system implementation purposes but for high-level system modeling as well. Consider the example of a class covering the notion of car. Many cars share the same originating_plant, but an engine belongs to just one car. References represent the modeling relation "knows about"; subobjects, as permitted by expanded types, represent the relation "has part", also known as aggregation. The key difference is that sharing is possible in the former case but not in the latter.
+
+==Basic operations==
+
+To assign, copy and compare values, you can rely on a number of mechanisms. Two of them, assignment and equality testing, are language constructs; the others are library features, coming from the top-level class ANY seen earlier.
+
+Assignment uses the symbol := . The assignment instruction
+
+ x := y
+
+
+updates the value of x to be the same as that of y. This means that for entities of reference types, the value of x will be a void reference if the value of y is void, and otherwise x will be attached to the same object OBJ2 as y:
+
+
+[[Image:tutorial-9]]
+
+
+For entities of expanded types, the values are objects; the object attached to x will be overwritten with the contents of the object attached to y. In the case of atomic objects, as in n := 3 with the declaration n: INTEGER , this has the expected effect of assigning to n the integer value 3; in the case of composite objects, this overwrites the fields for x, one by one, with the corresponding y fields.
+
+To copy an object, use
+
+ x.copy (y)
+
+which assumes that both x and y are non-void, and copies the contents of y's attached object onto those of x's. For expanded entities the effect is the same as that of the assignment x := y.
+
+An operation performing similar duty to copy is twin . The assignment
+
+ x := y.twin
+
+produces a newly created object (provided that y is non-void), initialized with a copy of the object attached to y and attaches the result to x . This means we may view twin as a function that performs the following two steps:
+
+ create Result
+ Result.copy (Current)
+
+The new object is created, then its content is updated to match the content of y to which the twin call is targeted.
+
+So, assuming both entities of reference types and y not void, the assignment above will attach x to a '''new object''' identical to y's attached object, as opposed to the assignment x := y which attaches x to the '''same object''' as y.
+
+
+To determine whether two values are equal, use the expression:
+
+ x = y
+
+For references, this comparison will yield true if the values are either both void or both attached to the same object; this is the case in the last figure in the state after the assignment, but not before. The symbol for not equal is /= , as in:
+
+ x /= y
+
+
+As with assignment, there is also a form that works on objects rather than references:
+
+ x.is_equal (y)
+
+will return true when x and y are both non-void and attached to field-by-field identical objects. This can be true even when x = y is not, for example, in the figure, ''before'' the assignment, if the two objects shown are field-by-field equal.
+
+The expression x.is_equal (y) can be written alternatively, using the ''tilde'' ('~') character, in a notation similar in form to x = y . The expression:
+
+ x ~ y
+
+will be true only in cases in which x and y are the same type and x.is_equal (y) is true.
+
+A more general variant of is_equal is used under the form:
+
+ equal (x, y)
+
+This is always defined, even if x is void, returning true whenever is_equal would but also if x and y are both void. (In contrast, x.is_equal (y) is not defined for void x and would, if evaluated, yield an exception as explained in [[ET: Design by Contract (tm), Assertions and Exceptions#Exception_handling|"Exception handling"]] below.)
+
+{{note|The ~ operator performs an object equality comparison, using the (possibly redefined) version of feature is_equal that is appropriate for the operand types. The operand types must be the same, or the result will be False. As such, the use of ~ is preferred to over the use of direct use of either x.is_equal (y) or equal (x, y), which can be susceptible to [[ET: Inheritance#Catcalls|catcalls]].}}
+
+Void denotes a void reference. So you can make x void through the assignment
+
+ x := Void
+
+and test whether it is void through:
+
+ if x = Void then ...
+
+Note that the assignment, := , and the equality operators, =, ~, /~, and /= , are language constructions, whereas copy, twin, is_equal, and equal are '''library features''' coming from class ANY .
+
+Void is a language keyword with built-in characteristics, but it is not harmful to imagine Void as another feature declared in class ANY, with type of NONE, the "bottom" type. This convenience allows any assignment of the for x := Void to be valid without any making exceptions to the type rules, regardless of the type of x .
+
+Using the redefinition mechanisms to be seen in the discussion of inheritance, a class can redefine copy and is_equal to cover specific notions of copy and equality. The assertions will ensure that the two remain compatible: after x.copy (y) , the property x .is_equal (y) must always be true. The effect of twin will automatically follow a redefinition of copy, and equal will follow is_equal.
+
+To guarantee the original, non-redefined semantics you may use the variants standard_copy, standard_twin, standard_equal, all defined in ANY as "frozen", that is to say non-redefinable.
+
+==Deep operations and persistence==
+
+Feature twin only duplicates one object. If some of the object's fields are references to other objects, the references themselves will be copied, not those other objects.
+
+It is useful, in some cases, to duplicate not just one object but an entire object structure. The expression y.deep_twin achieves this goal: assuming non-void y, it will produce a duplicate not just of the object attached to y but of the entire object structure starting at that object. The mechanism respects all the possible details of that structure, such as cyclic reference chains. Like the preceding features, deep_twin comes from class ANY.
+
+A related mechanism provides a powerful '''persistence''' facility. A call of the form
+
+ x.store (Some_file_or_network_connection)
+
+
+will store a copy of the entire object structure starting at x , under a suitable representation. Like deep_twin, procedure store will follow all references to the end and maintain the properties of the structure. The function retrieved can then be used -- in the same system, or another -- to recreate the structure from the stored version.
+
+As the name suggests, Some_file_or_network_connection can be an external medium of various possible kinds, not just a file but possibly a database or network. The EiffelNet client-server library indeed uses the store - retrieved mechanism to exchange object structures over a network, between compatible or different machine architectures, for example a Windows client and a Unix server.
+
+==Memory management==
+
+Reference reattachments, x := y , of the form illustrated by the figure just above can cause objects to become unreachable. This is the case for the object identified as OBJ1 on that figure (the object to which x was attached before the assignment) if no other reference was attached to it.
+
+In all but toy systems, it is essential to reclaim the memory that has been allocated for such objects; otherwise memory usage could grow forever, as a result of creation instructions create x ... and calls to twin and the like, leading to thrashing and eventually to catastrophic termination.
+
+The Eiffel method suggests that the task of detecting and reclaiming such unused object space should be handled by an automatic mechanism (part of the Eiffel run-time environment), not manually by developers (through calls to procedures such as Pascal's dispose and C/C++'s free). The arguments for this view are:
+
+'''Simplicity''' : handling memory reclamation manually can add enormous complication to the software, especially when -- as is often the case in object-oriented development -- the system manipulates complex run-time data structures with many links and cycles.
+
+'''Reliability''' : memory management errors, such as the incorrect reclamation of an object that is still referenced by a distant part of the structure, are a notorious source of dangerous and hard-to-correct bugs.
+
+The Eiffel Software's implementation of Eiffel provides a sophisticated '''garbage collector''' which efficiently handles the automatic reclamation process, while causing no visible degradation of a system's performance and response time.
+
+==Information hiding and the call rule==
+
+The basic form of computation, it has been noted, is a call of the form target.feature (...) . This is only meaningful if feature denotes a feature of the generating class of the object to which target (assumed to be non-void) is attached. The precise rule is the following:
+
+{{rule|name=Feature Call|text=A call of the form target.feature (...) appearing in a class C is only valid if feature is a feature of the base class of target's type, and is available to C.}}
+
+
+The first condition simply expresses that if target has been declared as target: A then feature must be the name of one of the features of A. The second condition reflects Eiffel's application of the principles of information hiding. A feature clause, introducing one or more feature declarations, may appear not only as
+
+feature -- Comment identifying the feature category
+
+ ... Feature declaration ...
+
+ ... Feature declaration ...
+
+
+ ...
+
+
+
+but may also include a list of classes in braces, feature {A, B, ... } , as was illustrated for ACCOUNT:
+
+feature {NONE} -- Implementation
+
+ all_deposits: DEPOSIT_LIST
+ -- List of deposits since account's opening.
+
+
+This form indicates that the features appearing in that clause are only '''available''' -- in the sense of available for calls, as used in the Feature Call rule -- to the classes listed. In the example feature all_deposits is only available to NONE . Because of the [[ET: The Static Picture: System Organization#The_global_inheritance_structure|global inheritance structure]], this means it is in fact available to no useful client at all, and is equivalent in practice to feature { } with an empty class list, although the form listing NONE explicitly is more visible and hence preferred.
+
+
+
+With this specification a class text including the declaration acc: ACCOUNT and a call of the form
+
+ acc.all_deposits
+
+
+violates the Feature Call rule and will be rejected by the EiffelStudio compiler.
+
+Besides fully exported features (introduced by feature ... ; without further qualification) and fully secret ones (feature { } or feature {NONE} ), it is possible to export features selectively to some specified classes, using the specification
+
+feature {A, B, ...}
+
+
+for arbitrary classes A, B, ... This enables a group of related classes to provide each other with privileged access, without requiring the introduction of a special module category above the class level (see [[ET: The Static Picture: System Organization#Clusters|"Clusters"]] ).
+
+Exporting features selectively to a set of classes A, B, ... also makes them available to the descendants of these classes. So a feature clause beginning with just feature is equivalent to one starting with feature {ANY} .
+
+These rules enable successive feature clauses to specify exports to different clients. In addition, the recommended style, illustrated in the examples of this chapter, suggests writing separate feature clauses -- regardless of their use for specifying export privileges -- to group features into separate categories. The standard style rules define a number of fundamental categories and the order in which they should appear; they include: Initialization for creation procedures, Access for general queries, Status report for boolean-valued queries, Status setting, Element change, Implementation (for selectively exported or secret features. Every feature in the EiffelBase library classes belongs to one of the predefined categories.
+
+The Feature Call rule is the first of the rules that make Eiffel a '''statically typed''' approach, where the applicability of operations to objects is verified at compile time rather than during execution. Static typing is one of the principal components of Eiffel's support for reliability in software development.
+
+==Execution scenario==
+
+The preceding elements make it possible to understand the overall scheme of an Eiffel system's execution.
+
+At any time during the execution of a system, one object is the '''current object''' of the execution, and one of the routines of the system, the '''current routine''', is being executed, with the current object as its target. (We will see below how the current object and current routine are determined.) The text of a class, in particular its routines, make constant implicit references to the current object. For example in the instruction
+
+ balance := balance + sum
+
+
+appearing in the body of procedure deposit of class ACCOUNT, the name of the attribute balance, in both occurrences, denotes the balance field of the current object, assumed to be an instance of ACCOUNT. In the same way, the procedure body that we used for the creation procedure make in the ACCOUNT1 variant
+
+ make (sum: INTEGER)
+ -- Initialize account with sum .
+ do
+ deposit (sum)
+ end
+
+
+contains a call to the procedure deposit. Contrary to earlier calls written in dot notation as target.feature (...), the call to deposit has no explicit target; this means its target is the current object, an instance of ACCOUNT1. Such a call is said to be '''unqualified'''; those using dot notations are '''qualified''' calls.
+
+Although most uses of the current object are implicit, a class may need to name it explicitly. The predefined expression Current is available for that purpose. A typical use, in a routine merge (other: ACCOUNT ) of class ACCOUNT, would be a test of the form
+
+ if other = Current then
+ report_error ("Error: trying to merge an account with itself!")
+ else
+ ... Normal processing (merging two different account) ...
+ end
+
+
+With these notions it is not hard to define precisely the overall scenario of a system execution by defining which object and routine will, at each instant, be the current object and the current routine:
+
+Starting a system execution, as we have seen, consists in creating an instance of the root class, the root object, and executing a designated creation procedure, the root procedure, with the root object as its target. The root object is the initial current object, and the root procedure is the initial current procedure.
+
+From then on only two events can change the current object and current procedure: a qualified routine call; and the termination of a routine.
+
+In a call of the form target.routine (...) , target denotes a certain object TC. (If not, that is to say, if the value of target is void, attempting to execute the call will trigger an exception, as studied below.) The generating class of TC must, as per the Feature Call rule, contain a routine of name routine. As the call starts, TC becomes the new current object and routine becomes the new current routine.
+
+When a routine execution terminates, the target object and routine of the most recent non-terminated call -- which, just before the terminated call, were the current object and the current routine -- assume again the role of current object and current routine.
+
+The only exception to the last rule is termination of the original root procedure call; in this case the entire execution terminates.
+
+==Abstraction==
+
+===Restriction of assignment targets===
+
+The description of assignments stated that in x := y the target x must be an entity. More precisely it must be a '''writable''' entity. This notion excludes formal routine arguments: as noted, a routine r (arg: SOME_TYPE) may not assign to arg (reattaching it to a different object), although it can change the attached objects through calls of the form arg.procedure (...) .
+
+Allowing only entities to be the targets of assignments precludes assignments of the form
+
+ obj.some_attribute := some_value
+ -- This syntax is disallowed (except in the presence of an `assigner command', see below)
+
+This is because the left-hand side obj.some_attribute is an expression (a feature call), not an entity: you may no more assign to obj.some_attribute than to, say, b + a -- another expression that is also, formally, a feature call.
+
+To obtain the intended effect of such an assignment you may use a procedure call, where the base class of obj's type has defined the procedure
+
+ set_some_attribute (v: VALUE_TYPE)
+ -- Set value of some_attribute to `v'.
+ do
+ some_attribute := v
+ end
+
+
+So instead of the disallowed assignment shown above, you would code:
+
+ obj.set_some_attribute (some_value)
+
+
+This rule is essential to enforcing the method. Permitting direct assignments to an object's fields -- as in C++ and Java -- would violate all the tenets of information hiding by letting clients circumvent the interface carefully crafted by the author of a supplier class.
+
+===Assigner commands===
+
+However, many developers have become accustomed to reading and writing code in other languages which do allow assignments of the form:
+
+ obj.some_attribute := some_value
+
+For this reason, it is possible in Eiffel to allow such a syntax without actually enabling an end-run around the constraints of the class. It is done by using a facility called an '''assigner command'''. In the example shown in the previous section, we might expect some_attribute to be declared something like this:
+
+ some_attribute: SOME_TYPE
+
+If this were the case the assignment above would cause a syntax error at compile time. But if the declaration included the specification of an assigner command, as shown below, then the assignment syntax would be valid.
+
+ some_attribute: SOME_TYPE assign set_some_attribute
+
+The assigner command then is the procedure set_some_attribute coded as shown in the previous section. In the presence of the assigner command, the previously invalid assignment syntax is now valid. But it is translated by the compiler as a call to set_some_attribute, using the source of the assignment as an argument.
+
+===Controlling modification of class fields===
+
+It is the responsibility of each class author to define the exact privileges that the class gives to each of its clients, in particular field modification rights. Building a class is like building a machine: you design the internals, to give yourself the appropriate mechanisms; and you design the control panel, letting users (clients) access the desired subset of these mechanisms, safely and conveniently.
+
+The levels of privilege available to the class author include, for any field:
+* Hide the field completely from clients, by exporting the corresponding attribute to NONE.
+* Export it, but in read-only mode, by not exporting any procedure that modifies it.
+* Export it for free read and write by any client, by also exporting a procedure of the set_attribute kind.
+* Export it in '''restricted-write''' mode, by exporting a procedure such as deposit of class ACCOUNT, which adds a specified amount to the balance field, rather than directly setting the balance.
+
+The last case is particularly interesting is that it allows the class designer to set the precise way in which clients will manipulate the class instances, respecting the properties of the class and its integrity. The exported routines may, through the Design by Contract mechanism reviewed later in ( [[ET: Design by Contract (tm), Assertions and Exceptions]] ), place some further restrictions on the permitted modifications, for example by requiring the withdrawn amount to be positive.
+
+These rules follow directly from the more general goals (reusability, extendibility, reliability) and principles (Uniform Access, information hiding) underlying Eiffel software design. They reflect a view that each class must denote a well-understood abstraction, defined by a set of exported features chosen by the class designer -- the "control panel".
+
+The class documentation (see [[ET: Design by Contract (tm), Assertions and Exceptions#The_contract_form_of_a_class|the contract form of a class]] ) makes this view clear to client authors; no violation of that interface is permitted. This approach also paves the way for future '''generalization''' -- the final step of the cluster lifecycle, seen earlier in the section [[ET: The Software Process in Eiffel#Generalization_and_reuse|Generalization and reuse]] -- of the most promising components, and their inclusion into reusable libraries.
+
+===Attribute specializations===
+
+In certain situations it is beneficial to be able to declare class attributes which behave in specialized ways.
+
+====Attribute specializations useful in void-safe programming====
+
+Part of the strategy to ensure void-safety makes it necessary to be able to declare attributes as either [[Void-safety: Background, definition, and tools#Types as "attached" or "detachable"|'''detachable''' or '''attached''']].
+
+'''[[Void-safety: Background, definition, and tools#Self-initializing attributes|Self-initializing attributes]]''' and '''[[Void-safety: Background, definition, and tools#Stable attributes|stable attributes]]''' are other tools for making void-safe programming more convenient.
+
+These attribute specializations are presented in the [[Void-safe programming in Eiffel|void-safe programming]] chapter.
+
+====Transient attributes====
+
+Another special type of attribute supported by Eiffel Software's compiler is the '''transient attribute'''. When an instance of a class to which a transient attribute belongs is saved to persistent storage, the field for the transient attribute is not included. So, transient attributes are transient in the sense that they are part of the object at runtime, but not when the object is stored on disk.
+
+This type of attribute has benefits when using the persistence mechanisms provided with EiffelStudio, like [http://eiffel.com/developers/learning_maps/Training/Maps/PersistenceCanPayOff/Serialization.html SED]. Because transient attributes are not stored, they need not be accounted for upon retrieval. So, objects stored before changes to a class that only affect transient attributes will still be retrievable using the new class definition (whereas, if non-transient attributes were changed, a mismatch would occur during retrieval).
+
+An attribute is marked as transient by including a note option in its declaration:
+
+
+ transient_attribute: detachable STRING
+ note
+ option: transient
+ attribute
+ end
+
+
+Only certain attributes can be marked as transient. Specifically, if attribute ''a'' is declared of type '''T''', it can be marked as transient only if it satisfies the following conditions:
+# If '''T''' is a reference type, '''T''' must be detachable
+# '''T''' is not a formal generic parameter
+# '''T''' is not a user defined expanded type
+# ''a'' is not an attribute of a user defined expanded class.
+
+The EiffelBase class INTERNAL includes features which are used to distinguish object fields as either persistent or transient and to reveal how many transient fields an object has.
+
+
+{{note|Prior to version 6.6, support for transient attributes was limited to the C storable mechanism. In version 6.6, support was added for the Eiffel storable mechanism (SED) on both classic and .NET system targets.}}
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-eiffel-tutorial-copyright.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-eiffel-tutorial-copyright.wiki
new file mode 100644
index 00000000..21ca7411
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-eiffel-tutorial-copyright.wiki
@@ -0,0 +1,34 @@
+[[Property:title|ET: Eiffel Tutorial Copyright]]
+[[Property:weight|0]]
+[[Property:uuid|105e9956-f168-b060-a6be-e78b221f269a]]
+====MANUAL IDENTIFICATION AND COPYRIGHT====
+
+Title: An Eiffel Tutorial, Eiffel Software Technical Report TR-EI-66/TU.
+
+Publication history
+
+First published July 2001. Corresponds to release 5.0 of the EiffelStudio environment.
+
+Author
+
+Software credits
+
+See acknowledgments in book [[Eiffel: The Language]].
+
+Cover design
+
+Rich Ayling.
+
+Copyright notice and proprietary information
+
+Copyright Interactive Software Engineering Inc. (Eiffel Software), 2001. May not be reproduced in any form (including electronic storage) without the written permission of Eiffel Software . "Eiffel Power" and the Eiffel Power logo are trademarks of Eiffel Software .
+
+All uses of the product documented here are subject to the terms and conditions of the Eiffel Software Eiffel user license. Any other use or duplication is a violation of the applicable laws on copyright, trade secrets and intellectual property.
+
+Special duplication permission for educational institutions
+
+Degree-granting educational institutions using Eiffel Software Eiffel for teaching purposes as part of the [http://www.eiffel.com/educators/resources.html Eiffel University Partnership Program] may be permitted under certain conditions to copy specific parts of this book. Contact Eiffel Software for details.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-general-properties.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-general-properties.wiki
new file mode 100644
index 00000000..731c5ffd
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-general-properties.wiki
@@ -0,0 +1,49 @@
+[[Property:title|ET: General Properties]]
+[[Property:weight|-14]]
+[[Property:uuid|1ad0b1d5-7ac6-9f55-92ec-ba6f42aee690]]
+Here is an overview of the facilities supported by Eiffel: DEPOSIT_LIST posited in earlier examples describes containers.
+
+It is not hard, with the mechanisms seen so far, to write the class DEPOSIT_LIST, which would include such features as count (query returning the number of deposit objects in the list) and put (command to insert a new deposit object).
+
+Most of the operations, however, would be the same for lists of objects other than deposits. To avoid undue replication of efforts and promote reuse, we need a way to describe '''generic''' container classes, which we can use to describe containers containing elements of many different types.
+
+==Making a class generic==
+
+The notation
+
+class C [G]
+ ... The rest as for any other class declaration ...
+
+introduces a generic class. A name such as G appearing in brackets after the class name is known as a '''formal generic parameter'''; it represents an arbitrary type.
+
+Within the class text, feature declarations can freely use G even though it is not known what type G stands for. Class LIST of EiffelBase, for example, includes features
+
+ first: G
+ -- Value of first list item
+
+ extend (val: G)
+ -- Add a new item of value val at end of list
+ ...
+
+
+The operations available on an entity such as first and val, whose type is a formal generic parameter, are the operations available on all types: use as source y of an assignment x := y, use as target x of such an assignment (although not for val, which as a formal routine argument is not writable), use in equality comparisons x = y or x /= y, and application of universal features from ANY such as twin, is_equal and copy.
+
+To use a generic class such as list, a client will provide a type name as '''actual generic parameter'''. So instead of relying on a special purpose class DEPOSIT_LIST, the class ACCOUNT could include the declaration
+all_deposits: LIST [DEPOSIT]
+
+using LIST as a generic class and DEPOSIT as the actual generic parameter. Then all features declared in LIST as working on values of type G will work, when called on the target all_deposits, on values of type DEPOSIT. With the target
+all_accounts: LIST [ACCOUNT]
+
+these features would work on values of type ACCOUNT.
+
+{{info|A note of terminology: to avoid confusion, Eiffel always uses the word '''argument''' for routine arguments, reserving '''parameter''' for the generic parameters of classes. }}
+
+Genericity reconciles extendibility and reusability with the static type checking demanded by reliability. A typical error, such as confusing an account and a deposit, will be detected immediately at compile time, since the call all_accounts. extend ( dep ) is invalid for dep declared of type DEPOSIT. What is valid is something like all_accounts. extend ( acc ) for acc of type ACCOUNT. In other approaches, the same effect might require costly run-time checks (as in Java, C# or Smalltalk), with the risk of run-time errors.
+
+{{info|This form of genericity is known as '''unconstrained''' because the formal generic parameter, G in the example, represents an arbitrary type. You may also want to use types that are guaranteed to have certain operations available. This is known as '''constrained''' genericity and will be studied with inheritance. }}
+
+==Arrays==
+
+An example of generic class from the Kernel Library is ARRAY [G], which describes direct-access arrays. Features include:
+* put to replace an element's value, as in my_array.put (val, 25) which replaces by val the value of the array entry at index 25.
+* item to access an entry, as in my_array.item (25) yielding the entry at index 25. A synonym is infix "@", so that you may also write more tersely, for the same result, my_array @ 25 .
+* lower, upper and count: queries yielding the bounds and the number of entries.
+* The creation procedure make, as in create my_array.make (1, 50) which creates an array with the given index bounds. It is also possible to resize an array through resize, retaining the old elements. In general, the Eiffel method abhors built-in limits, favoring instead structures that resize themselves when needed, either from explicit client request or automatically.
+
+The comment made about INTEGER and other basic classes applies to ARRAY too: Eiffel compilers know about this class, and will be able to process expressions of the form my_array.put (val, 25) and my_array @ 25 in essentially the same way as a C or Fortran array access -- my_array [25] in C. But it is consistent and practical to let developers treat ARRAY as a class and arrays as objects; many library classes in EiffelBase, for example, inherit from ARRAY. Once again the idea is to get the best of both worlds: the convenience and uniformity of the object-oriented way of thinking; and the efficiency of traditional approaches.
+
+A similar technique applies to another Kernel Library class, that one not generic: STRING, describing character strings with a rich set of string manipulation features.
+
+==Generic derivation==
+
+The introduction of genericity brings up a small difference between classes and types. A generic class C is not directly a type since you cannot declare an entity as being of type C: you must use some actual generic parameter T -- itself a type. C [T] is indeed a type, but class C by itself is only a type template.
+
+The process of obtaining a type C [T] from a general class C is known as a '''generic derivation'''; C [T] is a '''generically derived type'''. Type T itself is, recursively, either a non-generic class or again a generically derived type D [U] for some D and U, as in LIST [ARRAY [INTEGER]].)
+
+It remains true, however, that every type is based on a class. The base class of a generically derived type C [T] is C.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-hello-world.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-hello-world.wiki
new file mode 100644
index 00000000..ca3520c1
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-hello-world.wiki
@@ -0,0 +1,80 @@
+[[Property:title|ET: Hello World]]
+[[Property:weight|-12]]
+[[Property:uuid|5b286f94-dd63-1169-a64e-74b5f8c5ef14]]
+When discovering any approach to software construction, however ambitious its goals, it is reassuring to see first a small example of the big picture -- a complete program to print the famous "Hello World" string. Here is how to perform this fascinating task in the Eiffel notation.
+
+You write a class HELLO with a single procedure, say make, also serving as creation procedure. If you like short texts, here is a minimal version:
+
+class
+ HELLO
+
+create
+ make
+
+feature
+
+ make
+ do
+ print ("Hello World%N")
+ end
+
+end
+
+
+In practice, however, the Eiffel style rules suggest a better documented version:
+
+note
+ description: "Root for trivial system printing a message"
+ author: "Elizabeth W. Brown"
+
+class
+ HELLO
+
+create
+ make
+
+feature
+
+ make
+ -- Print a simple message.
+ do
+ io.put_string ("Hello World")
+ io.put_new_line
+ end
+
+end -- class HELLO
+
+
+The two versions perform identically; the following comments will cover the more complete second one.
+
+Note the absence of semicolons and other syntactic clatter or clutter. You may in fact use semicolons to separate instructions and declarations. But the language's syntax is designed to make the semicolon optional (regardless of text layout) and it's best for readability to omit it, except in the special case of successive elements on a single line.
+
+The note clause does not affect execution semantics; you may use it to associate documentation with the class, so that browsers and other indexing and retrieval tools can help users in search of reusable components satisfying certain properties. Here we see two notes, labeled description and author.
+
+The name of the class is HELLO. Any class may contain "features"; HELLO has just one, called make. The create clause indicates that make is a "creation procedure", that is to say an operation to be executed at class instantiation time. The class could have any number of creation procedures.
+
+The definition of make appears in a feature clause. There may be any number of such clauses (to separate features into logical categories), and each may contain any number of feature declarations. Here we have only one.
+
+The line starting with -- (two hyphen signs) is a comment; more precisely it is a "header comment", which style rules invite software developers to write for every such feature, just after the point at which the feature is named. As will be seen in [[ET: Design by Contract (tm), Assertions and Exceptions#The_contract_form_of_a_class|"The contract form of a class"]], the tools of EiffelStudio know about this convention and use it to include the header comment in the automatically generated class documentation.
+
+The body of the feature is introduced by the do keyword and terminated by end. It consists of two output instructions. They both use io, a generally available reference to an object that provides access to standard input and output mechanisms; the notation io.f, for some feature f of the corresponding library class (STD_FILES, in this case), means "apply f to io". Here we use two such features:
+* put_string outputs a string, passed as argument, here "Hello World".
+* put_new_line terminates the line.
+
+Rather than using a call to put_new_line, the first version of the class simply includes a new-line character, denoted as %N (the percent sign is used to introduce codes for [[Eiffel programming language syntax#Special characters|special characters]]), at the end of the string. Either technique is acceptable.
+
+You may have noticed another difference between the two versions. The first version uses a call to print where the second uses io.put_string . Here too, the effect is identical and either technique is acceptable. In the next section, you will begin to see how things like io and print become available for use in a class like HELLO.
+
+To build the system and execute it:
+* Start EiffelStudio
+* Create a new ''Basic application'' project
+* Specify HELLO as the "root class" and make as the "root procedure".
+* You can either use EiffelStudio to type in the above class text, or you may use any text editor and store the result into a file hello.e in the current directory.
+* Click the "Compile" icon.
+* Click the "Run" icon.
+
+Execution starts and outputs Hello World on the appropriate medium: under Windows, a Console; under Unix or OpenVMS, the windows from which you started EiffelStudio.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-inheritance.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-inheritance.wiki
new file mode 100644
index 00000000..d9a56e50
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-inheritance.wiki
@@ -0,0 +1,1057 @@
+[[Property:title|ET: Inheritance]]
+[[Property:weight|-7]]
+[[Property:uuid|c90e6ee3-b39d-48e5-2321-a34e12fd5327]]
+Inheritance is a powerful and attractive technique. A look at either the practice or literature shows, however, that it is not always well applied. Eiffel has made a particular effort to tame inheritance for the benefit of modelers and software developers. Many of the techniques are original with Eiffel. Paul Dubois has written (comp.lang.python Usenet newsgroup, 23 March 1997): there are two things that [Eiffel] got right that nobody else got right anywhere else: support for design by contract, and multiple inheritance. Everyone should understand these "correct answers" if only to understand how to work around the limitations in other languages.
+
+==Basic inheritance structure==
+
+To make a class inherit from another, simply use an `inherit` clause:
+
+note ...
+
+class
+ D
+
+inherit
+ A
+ B
+ ...
+
+feature
+ ...
+
+
+This makes `D` an heir of `A`, `B` and any other class listed. Eiffel supports '''multiple''' inheritance: a class may have as many parents as it needs. Later sections ( [[ET: Inheritance#Multiple_inheritance_and_renaming|"Multiple inheritance and renaming"]] and [[ET: Inheritance#Repeated_inheritance_and_selection|"Repeated inheritance and selection"]] ) will explain how to handle possible conflicts between parent features.
+
+
+{{note|This discussion will rely on the terminology introduced in [[ET: The Static Picture: System Organization|The Static Picture: System Organization]]: descendants of a class are the class itself, its heirs, the heirs of its heirs and so on. Proper descendants exclude the class itself. The reverse notions are ancestors and proper ancestors. }}
+
+
+By default `D` will simply include all the original features of `A`, `B`, ..., to which it may add its own through its `feature` clauses if any. But the inheritance mechanism is more flexible, allowing `D` to adapt the inherited features in many ways. Each parent name -- `A`, `B`, ... in the example -- can be followed by a '''Feature Adaptation''' clause, with subclauses, all optional, introduced by keywords `rename`, `export`, `undefine`, `redefine` and `select`, enabling the author of `D` to make the best use of the inheritance mechanism by tuning the inherited features to the precise needs of `D`. This makes inheritance a principal tool in the Eiffel process, mentioned earlier, of carefully crafting each individual class, like a machine, for the benefit of its clients. The next sections review the various Feature Adaptation subclauses.
+
+==Redefinition==
+
+The first form of feature adaptation is the ability to change the implementation of an inherited feature.
+
+Assume a class `SAVINGS_ACCOUNT` that specializes the notion of account. It is probably appropriate to define it as an heir to class `ACCOUNT`, to benefit from all the features of `ACCOUNT` still applicable to savings accounts, and to reflect the conceptual relationship between the two types: every savings account, apart from its own specific properties, also "is" an account. But we may need to produce a different effect for procedure `deposit` which, besides recording the deposit and updating the balance, may also need, for example, to update the interest.
+
+This example is typical of the form of reuse promoted by inheritance and crucial to effective reusability in software: the case of reuse with adaptation. Traditional forms of reuse are all-or-nothing: either you take a component exactly as it is, or you build your own. Inheritance will get us out of this "reuse or redo" dilemma by allowing us to reuse and redo. The mechanism is feature redefinition:
+
+note
+ description: "Savings accounts"
+
+class
+ SAVINGS_ACCOUNT
+
+inherit
+ ACCOUNT
+ redefine
+ deposit
+ end
+
+feature -- Element change
+
+ deposit (sum: INTEGER)
+ -- Add sum to account.
+ do
+ ... New implementation (see below) ...
+ end
+
+ ... Other features ...
+
+end -- class SAVINGS_ACCOUNT
+
+
+Without the `redefine` subclause, the declaration of `deposit` would be invalid, yielding two features of the same name, the inherited one and the new one. The subclause makes this valid by specifying that the new declaration will override the old one.
+
+In a redefinition, the original version -- such as the `ACCOUNT` implementation of `deposit` in this example -- is called the '''precursor''' of the new version. It is common for a redefinition to rely on the precursor's algorithm and add some other actions; the reserved word `Precursor` helps achieve this goal simply. Permitted only in a routine redefinition, it denotes the parent routine being redefined. So here the body of the new `deposit` (called "New implementation" above) could be of the form
+
+
+ Precursor (sum)
+ -- Apply ACCOUNT's version of deposit
+ ... Instructions to update the interest ...
+
+
+In the event that a routine has redefined a particular feature from multiple parent, the `Precursor` syntax allows the inclusion of a parent qualification:
+
+
+ Precursor {PARENT_X} (args...)
+ -- Apply PARENT_X's version of this feature
+ ... Instructions to update the interest ...
+
+
+
+Besides changing the implementation of a routine, a redefinition can turn an argument-less function into an attribute; for example a proper descendant of `ACCOUNT` could redefine `deposits_count`, originally a function, as an attribute. The Uniform Access Principle (introduced in [[ET: The Dynamic Structure: Execution Model|The Dynamic Structure: Execution Model]] ) guarantees that the redefinition makes no change for clients, which will continue to use the feature under the form
+
+ acc.deposits_count
+
+
+==Polymorphism==
+
+The inheritance mechanism is relevant to both roles of classes: module and type. Its application as a mechanism to reuse, adapt and extend features from one class to another, as just seen, covers its role as a '''module extension''' mechanism. But it's also a '''subtyping''' mechanism. To say that `D` is an heir of `A`, or more generally a descendant of `A`, is to express that instances of `D` can be viewed as instances of `A`.
+
+'''Polymorphic assignment''' supports this second role. In an assignment `x := y`, the types of `x` and `y` do not have, with inheritance, to be identical; the rule is that the type of `y` must simply '''conform''' to the type of `x`.
+
+
+{{definition|Conformance|A class `D` conforms to a class `A` if and only if it is a descendant of `A` (which includes the case in which `A` and `D` are the same class); if these classes are generic, conformance of `D` `[U]` to `C` `[T]` requires in addition that type `U` conform to type `T` (through the recursive application of the same rules). }}
+
+
+{{note|In addition, it will be shown in the discussion of tuples ([[ET: Other Mechanisms#Tuple_types|"Tuple types"]]), that `TUPLE [X]` conforms to `TUPLE`, `TUPLE [X, Y]` to `TUPLE [X]` and so on. }}
+
+
+So with the inheritance structure that we have seen, the declarations
+
+ acc: ACCOUNT
+ sav: SAVINGS_ACCOUNT
+
+
+make it valid to write the assignment
+
+ acc := sav
+
+
+which will assign to `acc` a reference attached (if not void) to a direct instance of type `SAVINGS_ACCOUNT`, not `ACCOUNT`.
+
+Such an assignment, where the source and target types are different, is said to be polymorphic. An entity such as `acc`, which as a result of such assignments may become attached at run time to objects of types other than the one declared for it, is itself called a polymorphic entity.
+
+For polymorphism to respect the reliability requirements of Eiffel, it must be controlled by the type system and enable static type checking. We certainly do not want an entity of type `ACCOUNT` to become attached to an object of type `DEPOSIT`. Hence the second typing rule:
+
+
+{{rule|name=Type Conformance|text=An assignment `x := y`, or the use of y as actual argument corresponding to the formal argument x in a routine call, is only valid if the type of y conforms to the the type of x. }}
+
+
+The second case listed in the rule is a call such as `target.routine(..., y, ...)` where the routine declaration is of the form `routine (..., x: SOME_TYPE)`. The relationship between `y`, the actual argument in the call, and the corresponding formal argument `x`, is exactly the same as in an assignment `x := y`: not just the type rule, as expressed by Type Conformance (the type of `y` must conform to `SOME_TYPE`), but also the actual run-time effect which, as for assignments, will be either a reference attachment or, for expanded types, a copy.
+
+The ability to accept the assignment `x := Void` for `x` of any reference type (see [[ET: The Dynamic Structure: Execution Model#Basic_operations|"Basic operations"]] ) is a consequence of the Type Conformance rule, since `Void` is of type `NONE` which by construction ([[ET: The Static Picture: System Organization#The_global_inheritance_structure|"The global inheritance structure"]] ) conforms to all types.
+
+Polymorphism also yields a more precise definition of "instance". A '''direct instance''' of a type `A` is an object created from the exact pattern defined by the declaration of `A` 's base class, with one field for each of the class attributes; you will obtain it through a creation instruction of the form `create x` ..., for `x` of type `A`, or by cloning an existing direct instance. An '''instance''' of `A` is a direct instance of any type conforming to `A`: `A` itself, but also any type based on descendant classes. So an instance of `SAVINGS_ACCOUNT` is also an instance, although not a direct instance, of `ACCOUNT`.
+
+A consequence of polymorphism is the ability to define '''polymorphic data structures'''. With a declaration such as
+
+ accounts: LIST [ACCOUNT]
+
+
+the procedure call `accounts.extend (acc)`, because it uses a procedure `extend` which in this case expects an argument of any type conforming to `ACCOUNT`, will be valid not only if `acc` is of type `ACCOUNT` but also if it is of a descendant type such as `SAVINGS_ACCOUNT`. Successive calls of this kind make it possible to construct a data structure that, at run-time, might contain objects of several types, all conforming to `ACCOUNT`:
+
+[[Image:tutorial-10]] [[Image:tutorial-11]]
+
+Such polymorphic data structures combine the flexibility and safety of genericity and inheritance. You can make them more or less general by choosing for the actual generic parameter, here `ACCOUNT`, a type higher or lower in the inheritance hierarchy. Static typing is again essential here, prohibiting for example a mistaken insertion of the form `accounts.extend (dep)` where `dep` is of type `DEPOSIT`, which does not conform to `ACCOUNT`.
+
+At the higher (most abstract) end of the spectrum, you can produce an unrestrictedly polymorphic data structure `general_list: LIST [ANY]` which makes the call `general_list.extend (x)` valid for any `x`. The price to pay is that retrieving an element from such a structure will yield an object on which the only known applicable operations are the most general ones, valid for all types: assignment, copy, twin, equality comparison and others from `ANY`. The [[#Object test|object test]], studied below, will make it possible to apply more specific operations after checking dynamically that a retrieved object is of the appropriate type.
+
+==Dynamic binding==
+
+The complement of polymorphism is dynamic binding, the answer to the question "What version of a feature will be applied in a call whose target is polymorphic?".
+
+Consider `acc` is of type `ACCOUNT`. Thanks to polymorphism, an object attached to `acc` may be a direct instance not just of `ACCOUNT` but also of `SAVINGS_ACCOUNT` or other descendants. Some of these descendants, indeed `SAVINGS_ACCOUNT` among them, redefine features such as `deposit`. Then we have to ask what the effect will be for a call of the form
+
+ acc.deposit (some_value)
+
+
+Dynamic binding is the clearly correct answer: the call will execute the version of `deposit` from the generating class of the object attached to `acc` at run time. If `acc` is attached to a direct instance of `ACCOUNT`, execution will use the original `ACCOUNT` version; if `acc` is attached to a direct instance of `SAVINGS_ACCOUNT`, the call will execute the version redefined in that class.
+
+This is a clear correctness requirement. A policy of static binding (as available for example in C++ or Delphi, for non-virtual functions) would take the declaration of `acc` as an `ACCOUNT` literally. But that declaration is only meant to ensure generality, to enable the use of a single entity `acc` in many different cases: what counts at execution time is the object that `acc` represents. Applying the `ACCOUNT` version to a `SAVINGS_ACCOUNT` object would be wrong, possibly leading in particular to objects that violate the invariant of their own generating class (since there is no reason a routine of `ACCOUNT` will preserve the specific invariant of a proper descendant such as `SAVINGS_ACCOUNT`, which it does not even know about).
+
+In some cases, the choice between static and dynamic binding does not matter: this is the case for example if a call's target is not polymorphic, or if the feature of the call is redefined nowhere in the system. In such cases the use of static binding permits slightly faster calls (since the feature is known at compile time). This application of static binding should, however, be treated as a '''compiler optimization'''. The EiffelStudio compiler, under its "finalization" mode, which performs extensive optimization, will detect some of these cases and process them accordingly -- unlike approaches that make developers responsible for specifying what should be static and what dynamic (a tedious and error-prone task, especially delicate because a minute change in the software can make a static call, in a far-away module of a large system, suddenly become dynamic). Eiffel programmers don't need to worry about such aspects; they can rely on the semantics of dynamic binding in all cases, with the knowledge that the compiler will apply static binding when safe and desirable.
+
+Even in cases that require dynamic binding, the design of Eiffel, in particular the typing rules, enable compilers to make the penalty over the static-binding calls of traditional approaches very small and, most importantly, '''constant-bounded''' : it does not grow with the depth or complexity of the inheritance structure. The discovery in 1985 of a technique for constant-time dynamic binding calls, even in the presence of multiple and repeated inheritance, was the event that gave the green light to the development of Eiffel.
+
+Dynamic binding is particularly interesting for polymorphic data structures. If you iterate over the list of accounts of various kinds, `accounts: LIST [ACCOUNT]`, illustrated in the last figure, and at each step let `acc` represent the current list element, you can repeatedly apply
+
+ acc.deposit (...)
+
+
+to have the appropriate variant of the `deposit` operation triggered for each element.
+
+The benefit of such techniques appears clearly if we compare them with the traditional way to address such needs: using multi-branch discriminating instructions of the form
+
+ if "Account is a savings account " then
+ ...
+ elseif "It is a money market account" then
+ ...
+ elseif ...
+
+and so on, or the corresponding `case ... of ..., switch` or `inspect` instructions. Apart from their heaviness and complexity, such solutions cause many components of a software system to rely on the knowledge of the exact set of variants available for a certain notion, such as bank account. Then any addition, change or removal of variants can cause a ripple of changes throughout the architecture. This is one of the majors obstacles to extendibility and reusability in traditional approaches. In contrast, using the combination of inheritance, redefinition, polymorphism and dynamic binding makes it possible to have a '''point of single choice''' -- a unique location in the system which knows the exhaustive list of variants. Every client then manipulates entities of the most general type, `ACCOUNT`, through dynamically bound calls of the form
+
+ acc.some_account_feature (...)
+
+
+These observations make dynamic binding appear for what it is: not an implementation mechanism, but an '''architectural technique''' that plays a key role (along with information hiding, which it extends, and Design by Contract, to which it is linked through the assertion redefinition rules seen below) in providing the modular system architectures of Eiffel, the basis for the method's approach to reusability and extendibility. These properties apply as early as analysis and modeling, and continue to be useful throughout the subsequent steps.
+
+==Deferred features and classes==
+
+The examples of dynamic binding seen so far assumed that all classes were fully implemented, and dynamically bound features had a version in every relevant class, including the most general ones such as `ACCOUNT`.
+
+It is also useful to define classes that leave the implementation of some of their features entirely to proper descendants. Such an abstract class is known as `deferred`; so are its unimplemented features. The reverse of deferred is effective, meaning fully implemented.
+
+`LIST` is a typical example of deferred class. As it describes the general notion of list, it should not favor any particular implementation; that will be the task of its effective descendants, such as `LINKED_LIST` (linked implementation), `TWO_WAY_LIST` (linked both ways) `ARRAYED_LIST, ` (implementation by an array), all effective, and all indeed to be found in EiffelBase.
+
+At the level of the deferred class `LIST`, some features such as `extend` (add an item at the end of the list) will have no implementation and hence will be declared as deferred. Here is the corresponding form, illustrating the syntax for both deferred classes and their deferred features:
+
+note
+ description: "[
+ Sequential finite lists, without a commitment
+ to a representation.
+ ]"
+
+deferred class
+ LIST [G]
+
+feature -- Access
+
+ count: INTEGER
+ -- Number of items in list
+ do
+ ... See below; this feature can be effective ...
+ end
+
+feature -- Element change
+
+ extend (x: G)
+ -- Add `x' at end of list.
+ require
+ space_available: not full
+ deferred
+ ensure
+ one_more: count = old count + 1
+ end
+
+ ... Other feature declarations and invariants ...
+
+end -- class LIST
+
+
+A deferred feature (considered to be a routine, although it can yield an attribute in a proper descendant) has the single keyword `deferred` in lieu of the `do` ''Instructions'' clause of an effective routine. A deferred class -- defined as a class that has at least one deferred feature -- must be introduced by `deferred class` instead of just `class`.
+
+As the example of `extend` shows, a deferred feature, although it has no implementation, can be equipped with assertions. They will be binding on implementations in descendants, in a way to be explained below.
+
+Deferred classes do not have to be fully deferred. They may contain some effective features along with their deferred ones. Here, for example, we may express `count` as a function:
+
+count: INTEGER
+ -- Number of items in list
+ do
+ from
+ start
+ until
+ after
+ loop
+ Result := Result + 1
+ forth
+ end
+ end
+
+
+This implementation relies on the loop construct described below ( `from` introduces the loop initialization) and on a set of deferred features of the class which allow traversal of a list based on moving a fictitious cursor: `start` to bring the cursor to the first element if any, `after` to find out whether all relevant elements have been seen, and `forth` (with precondition `not` `after`) to advance the cursor to the next element. Procedure `forth` itself appears as
+
+ forth
+ -- Advance cursor by one position
+ require
+ not_after: not after
+ deferred
+ ensure
+ moved_right: index = old index + 1
+ end
+
+
+where `index` -- another deferred feature -- is the integer position of the cursor.
+
+Although the above version of feature `count` is time-consuming -- it implies a whole traversal just for the purpose of determining the number of elements -- it has the advantage of being applicable to all variants, without any commitment to a choice of implementation, as would follow for example if we decided to treat `count` as an attribute. Proper descendants can always redefine `count` for more efficiency.
+
+Function `count` illustrates one of the most important contributions of the method to reusability: the ability to define '''behavior classes''' that capture common behaviors (such as count) while leaving the details of the behaviors (such as `start`, `after`, `forth`) open to many variants. As noted earlier, traditional approaches to reusability provide closed reusable components. A component such as `LIST`, although equipped with directly usable behaviors such as count, is open to many variations, to be provided by proper descendants.
+
+
+{{note|Some O-O languages support only the two extremes: fully effective classes, and fully deferred "interfaces", but not classes with a mix of effective and deferred features. This is an unacceptable limitation, negating the object-oriented method's support for a seamless, continuous spectrum from the most abstract to the most concrete. }}
+
+
+A class `B` inheriting from a deferred class `A` may provide implementations -- effective declarations -- for the features inherited in deferred form. In this case there is no need for a `redefine` subclause; the effective versions simply replace the inherited versions. The class is said to '''effect''' the corresponding features. If after this process there remain any deferred features, B is still considered deferred, even if it introduces no deferred features of its own, and must be declared as `class deferred`.
+
+In the example, classes such as `LINKED_LIST` and `ARRAYED_LIST` will effect all the deferred features they inherit from `LIST` -- `extend`, `start` etc. -- and hence will be effective.
+
+Except in some applications restricted to pure system modeling -- as discussed next -- the main benefit of deferred classes and features comes from polymorphism and dynamic binding. Because `extend` has no implementation in class `LIST`, a call of the form `my_list.extend(...)` with my_list of type `LIST [T]` for some `T` can only be executed if `my_list` is attached to a direct instance of an effective proper descendant of `LIST`, such as `LINKED_LIST`; then it will use the corresponding version of `extend`. Static binding would not even make sense here.
+
+Even an effective feature of `LIST` such as count may depend on deferred features (start and so on), so that a call of the form `my_list.count` can only be executed in the context of an effective descendant.
+
+All this indicates that a deferred class must have '''no direct instance'''. (It will have instances, the direct instances of its effective descendants.) If it had any, we could call deferred features on them, leading to execution-time impossibility. The rule that achieves this goal is simple: if the base type of `x` is a deferred class, no creation instruction of target `x`, of the form `create x...`, is permitted.
+
+==Applications of deferred classes==
+
+Deferred classes cover abstract notions with many possible variants. They are widely used in Eiffel where they cover various needs:
+note
+ description: "Individual fragments of a broadcasting schedule"
+
+deferred class
+ SEGMENT
+
+feature -- Access
+
+ schedule: SCHEDULE deferred end
+ -- Schedule to which segment belongs
+
+ index: INTEGER deferred end
+ -- Position of segment in its schedule
+
+ starting_time, ending_time: INTEGER deferred end
+ -- Beginning and end of scheduled air time
+
+ next: SEGMENT deferred end
+ -- Segment to be played next, if any
+
+ sponsor: COMPANY deferred end
+ -- Segment's principal sponsor
+
+ rating: INTEGER deferred end
+ -- Segment's rating (for children's viewing etc.)
+
+ Minimum_duration: INTEGER = 30
+ -- Minimum length of segments, in seconds
+
+ Maximum_interval: INTEGER = 2
+ -- Maximum time (seconds) between successive segments
+
+feature -- Element change
+
+ set_sponsor (s: SPONSOR)
+ require
+ not_void: s /= Void
+ deferred
+ ensure
+ sponsor_set: sponsor = s
+ end
+
+ ... change_next, set_rating omitted ...
+
+invariant
+ in_list: (1 <= index) and (index <= schedule.segments.count)
+ in_schedule: schedule.segments.item (index) = Current
+ next_in_list: (next /= Void) implies (schedule.segments.item (index + 1) = next)
+ no_next_if_last: (next = Void) = (index = schedule.segments.count)
+ non_negative_rating: rating >= 0
+ positive times: (starting_time > 0) and (ending_time > 0)
+ sufficient_duration: ending_time - starting_time >= Minimum_duration
+ decent_interval: (next.starting_time) - ending_time <= Maximum_interval
+
+end
+
+
+==Structural property classes==
+
+Some deferred classes describe a structural property, useful to the description of many other classes. Typical examples are classes of the Kernel Library in EiffelBase:
+
+`NUMERIC` describes objects on which arithmetic operations `+, -, *, /` are available, with the properties of a ring (associativity, distributivity, zero elements etc.). Kernel Library classes such as `INTEGER` and `REAL` -- but not, for example, `STRING` -- are descendants of `NUMERIC`. An application that defines a class `MATRIX` may also make it a descendant of `NUMERIC`.
+
+`COMPARABLE` describes objects on which comparison operations <, <=, >, >= are available, with the properties of a total preorder (transitivity, irreflexivity). Kernel Library classes such as `CHARACTER`, `STRING` and `INTEGER` -- but not our `MATRIX` example -- are descendants of `COMPARABLE`.
+
+For such classes it is again essential to permit effective features in a deferred class, and to include assertions. For example class `COMPARABLE` declares infix "<" as deferred, and expresses `>, >=` and <= effectively in terms of it.
+
+
+{{note|The type `like Current` will be explained in [[ET: Inheritance#Covariance, anchored declarations, and "catcalls"|"Covariance, anchored declarations, and "catcalls""]] ; you may understand it, in the following class, as equivalent to `COMPARABLE`. }}
+
+
+note
+ description: "Objects that can be compared according to a total preorder relation"
+
+deferred class
+ COMPARABLE
+
+feature -- Comparison
+
+ infix "<" (other: like Current): BOOLEAN
+ -- Is current object less than `other'?
+ require
+ other_exists: other /= Void
+ deferred
+ ensure
+ asymmetric: Result implies not (other < Current)
+ end
+
+ infix "<=" (other: like Current): BOOLEAN
+ -- Is current object less than or equal to `other'?
+ require
+ other_exists: other /= Void
+ do
+ Result := (Current < other) or is_equal (other)
+ ensure
+ definition: Result = (Current < other) or is_equal (other)
+ end
+
+ ... Other features: infix ">", min, max, ...
+
+invariant
+ irreflexive: not (Current < Current)
+
+end -- class COMPARABLE
+
+
+==Multiple inheritance and renaming==
+
+It is often necessary to define a new class in terms of several existing ones. For example:
+
+The Kernel Library classes `INTEGER` and `REAL` must inherit from both `NUMERIC` and `COMPARABLE`.
+
+A class `TENNIS_PLAYER`, in a system for keeping track of player ranking, will inherit from `COMPARABLE`, as well as from other domain-specific classes.
+
+A class `COMPANY_PLANE` may inherit from both `PLANE` and `ASSET`.
+
+Class `ARRAYED_LIST`, describing an implementation of lists through arrays, may inherit from both `LIST` and `ARRAY`.
+
+In all such cases multiple inheritance provides the answer.
+
+Multiple inheritance can cause '''name clashes''' : two parents may include a feature with the same name. This would conflict with the ban on name overloading within a class -- the rule that no two features of a class may have the same name. Eiffel provides a simple way to remove the name clash at the point of inheritance through the `rename` subclause, as in
+
+note
+ description: "Sequential finite lists implemented as arrays"
+
+class
+ ARRAYED_LIST [G]
+
+inherit
+ LIST [G]
+
+ ARRAY [G]
+ rename
+ count as capacity,
+ item as array_item
+ end
+
+feature
+
+ ...
+
+end -- class ARRAYED_LIST
+
+
+Here both `LIST` and `ARRAY` have features called `count` and `item`. To make the new class valid, we give new names to the features inherited from `ARRAY`, which will be known within `ARRAYED_LIST` as `capacity` and `array_item`. Of course we could have renamed the `LIST` versions instead, or renamed along both inheritance branches.
+
+Every feature of a class has a '''final name''' : for a feature introduced in the class itself ("immediate" feature) it is the name appearing in the declaration; for an inherited feature that is not renamed, it is the feature's name in the parent; for a renamed feature, it is the name resulting from the renaming. This definition yields a precise statement of the rule against in-class overloading:
+
+
+{{rule|name=Final Name|text=Two different features of a class may not have the same final name. }}
+
+
+It is interesting to compare renaming and redefinition. The principal distinction is between features and feature names. Renaming keeps a feature, but changes its name. Redefinition keeps the name, but changes the feature. In some cases, it is of course appropriate to do both.
+
+Renaming is interesting even in the absence of name clashes. A class may inherit from a parent a feature which it finds useful for its purposes, but whose name, appropriate for the context of the parent, is not consistent with the context of the heir. This is the case with `ARRAY`'s feature `count` in the last example: the feature that defines the number of items in an array -- the total number of available entries -- becomes, for an arrayed list, the maximum number of list items; the truly interesting indication of the number of items is the count of how many items have been inserted in the list, as given by feature `count` from `LIST`. But even if we did not have a name clash because of the two inherited `count` features we should rename `ARRAY` 's `count` as `capacity` to maintain the consistency of the local feature terminology.
+
+The `rename` subclause appears before all the other feature adaptation subclauses -- `redefine` already seen, and the remaining ones `export`, `undefine` and `select` -- since an inherited feature that has been renamed sheds its earlier identity once and for all: within the class, and to its own clients and descendants, it will be known solely through the new name. The original name has simply disappeared from the name space. This is essential to the view of classes presented earlier: self-contained, consistent abstractions prepared carefully for the greatest enjoyment of clients and descendants.
+
+==Inheritance and contracts==
+
+A proper understanding of inheritance requires looking at the mechanism in the framework of Design by Contract, where it will appear as a form of subcontracting.
+
+The first rule is that invariants accumulate down an inheritance structure:
+
+
+{{rule|name=Invariant Accumulation|text=The invariants of all the parents of a class apply to the class itself. }}
+
+
+The invariant of a class is automatically considered to include -- in the sense of logical "and" -- the invariants of all its parents. This is a consequence of the view of inheritance as an "is" relation: if we may consider every instance of `B` as an instance of `A`, then every consistency constraint on instances of `A` must also apply to instances of `B`.
+
+Next we consider routine preconditions and postconditions. The rule here will follow from an examination of what contracts mean in the presence of polymorphism and dynamic binding.
+
+Consider a parent `A` and a proper descendant `B` (a direct heir on the following figure), which redefines a routine `r` inherited from `A`.
+
+[[Image:tutorial-12]]
+
+As a result of dynamic binding, a call `a1`.`r` from a client `C` may be serviced not by `A`'s version of `r` but by `B` 's version if `a1`, although declared of type `A`, becomes at run time attached to an instance of `B`. This shows the combination of inheritance, redefinition, polymorphism and dynamic binding as providing a form of subcontracting; `A` subcontracts certain calls to `B`.
+
+The problem is to keep subcontractors honest. Assuming preconditions and postconditions as shown on the last figure, a call in `C` of the form
+
+ if a1.pre then
+ a1.r
+ end
+
+
+or possibly
+
+ a1.q
+ a1.r
+
+
+where the postcondition of some routine `q` implies the precondition `pre` of `r`, satisfies the terms of the contract and hence is entitled to being handled correctly -- to terminate in a state satisfying `a1`.`post`. But if we let the subcontractor `B` redefine the assertions to arbitrary ''pre' ''and ''post','' this is not necessarily the case: ''pre' ''could be stronger than ''pre'', enabling `B` not to process correctly certain calls that are correct from `A`'s perspective; and ''post' ''could be weaker than ''post'', enabling `B` to do less of a job than advertized for `r` in the Contract Form of `A`, the only official reference for authors of client classes such as `C`. (An assertion `p` is stronger than or equal to an assertion `q` if `p` implies `q` in the sense of boolean implication.)
+
+The rule, then, is that for the redefinition to be correct the new precondition ''pre' ''must be weaker than or equal to the original ''pre'', and the new postcondition ''post' ''must be stronger than or equal to the original ''post''.
+
+Because it is impossible to check simply that an assertion is weaker or stronger than another, the language rule relies on different forms of the assertion constructs, `require else` and `ensure then`, for redeclared routines. They rely on the mathematical property that for any assertions `p` and `q`, the following are true:
+
+ 1) p implies (p or q)
+ 2) (p and q) implies p
+
+For a precondition, using `require else` with a new assertion will perform an `or`, which can only weaken the original; for a postcondition, `ensure then` will perform an `and`, which can only strengthen the original. Hence the rule:
+
+
+{{rule|name=Assertion Redeclaration|text=In the redeclared version of a routine, it is not permitted to use a require or ensure clause. Instead you may: Introduce a new condition with require else, for or-ing with the original precondition. Introduce a new condition with ensure then, for and-ing with the original postcondition. In the absence of such a clause, the original assertions are retained. }}
+
+
+The last case -- retaining the original -- is frequent but by no means universal.
+
+The Assertion Redeclaration rule applies to '''redeclarations'''. This terms covers not just redefinition but also effecting (the implementation, by a class, of a feature that it inherits deferred). The rules -- not just for assertions but also, as reviewed below, for typing -- are indeed the same in both cases. Without the Assertion Redeclaration rule, assertions on deferred features, such as those on `extend`, `count` and `forth` in [[ET: Inheritance#Deferred_features_and_classes|"Deferred features and classes"]] , would be almost useless -- wishful thinking; the rule makes them binding on all effectings in descendants.
+
+From the Assertion Redeclaration rule follows an interesting technique: '''abstract preconditions'''. What needs to be weakened for a precondition (or strengthened for a postcondition) is not the assertion's concrete semantics but its abstract specification as seen by the client. A descendant can change the implementation of that specification as it pleases, even to the effect of strengthening the concrete precondition, as long as the abstract form is kept or weakened. The precondition of procedure `extend` in the deferred class `LIST` provided an example. We wrote the routine (in [[ET: Inheritance#Deferred_features_and_classes|"Deferred features and classes"]] ) as
+
+ extend (x: G)
+ -- Add `x' at end of list.
+ require
+ space_available: not full
+ deferred
+ ensure
+ one_more: count = old count + 1
+ end
+
+
+The precondition expresses that it is only possible to add an item to a list if the representation is not full. We may well consider -- in line with the Eiffel principle that whenever possible structures should be of unbounded capacity -- that `LIST` should by default make `full` always return false:
+
+ full: BOOLEAN
+ -- Is representation full?
+ -- (Default: no)
+ do
+ Result := False
+ end
+
+
+Now a class `BOUNDED_LIST` that implements bounded-size lists (inheriting, like the earlier `ARRAYED_LIST`, from both `LIST` and `ARRAY`) may redefine `full`:
+
+ full: BOOLEAN
+ -- Is representation full?
+ -- (Answer: if and only if number of items is capacity)
+ do
+ Result := (count = capacity)
+ end
+
+
+Procedure `extend` remains applicable as before; any client that used it properly with `LIST` can rely polymorphically on the `FIXED_LIST` implementation. The abstract precondition of `extend` has not changed, even though the concrete implementation of that precondition has in fact been strengthened.
+
+Note that a class such as `BOUNDED_LIST`, the likes of which indeed appear in EiffelBase, is not a violation of the Eiffel advice to stay away from fixed-size structures. The corresponding structures are bounded, but the bounds are changeable. Although `extend` requires `not full`, another feature, called `force` in all applicable classes, will add an element at the appropriate position by resizing and reallocating the structure if necessary. Even arrays in Eiffel are not fixed-size, and have a procedure `force` with no precondition, accepting any index position.
+
+The Assertion Redeclaration rule, together with the Invariant Accumulation rule, provides the right methodological perspective for understanding inheritance and the associated mechanisms. Defining a class as inheriting from another is a strong commitment; it means inheriting not only the features but the logical constraints. Redeclaring a routine is bound by a similar committment: to provide a new implementation (or, for an effecting, a first implementation) of a previously defined semantics, as expressed by the original contract. Usually you have a wide margin for choosing your implementation, since the contract only defines a range of possible behaviors (rather than just one behavior), but you '''must''' remain within that range. Otherwise you would be perverting the goals of redeclaration, using this mechanism as a sort of late-stage hacking to override bugs in ancestor classes.
+
+==Join and uneffecting==
+
+It is not an error to inherit two deferred features from different parents under the same name, provided they have the same signature (number and types of arguments and result). In that case a process of '''feature join''' takes place: the features are merged into just one -- with their preconditions and postconditions, if any, respectively or-ed and and-ed.
+
+More generally, it is permitted to have any number of deferred features and at most one effective feature that share the same name: the effective version, if present will effect all the others.
+
+All this is not a violation of the Final Name rule (defined in [[ET: Inheritance#Multiple_inheritance_and_renaming|"Multiple inheritance and renaming"]] ), since the name clashes prohibited by the rule involve two different features having the same final name; here the result is just one feature, resulting from the join of all the inherited versions.
+
+Sometimes we may want to join ''effective'' features inherited from different parents, assuming again the features have compatible signatures. One way is to redefine them all into a new version. That is, list each in a `redefine` clause, then write a redefined version of the feature. In this case, they again become one feature, with no name clash in the sense of the Final Name rule. But in other cases we may simply want one of the inherited implementations to take over the others. The solution is to revert to the preceding case by '''uneffecting''' the other features; uneffecting an inherited effective feature makes it deferred (this is the reverse of effecting, which turns an inherited deferred feature into an effective one). The syntax uses the `undefine` subclause:
+
+class D
+
+inherit
+ A
+ rename
+ g as f
+ -- g was effective in A
+ undefine
+ f
+ end
+
+ B
+ undefine
+ f
+ -- f was effective in B
+ end
+
+ C
+ -- C also has an effective feature f , which will serve as
+ -- implementation for the result of the join.
+
+feature
+ ...
+
+
+
+Again what counts, to determine if there is an invalid name clash, is the final name of the features. In this example, two of the joined features were originally called `f`; the one from `A` was called `g`, but in `D` it is renamed as `f`, so without the undefinition it would cause an invalid name clash.
+
+Feature joining is the most common application of uneffecting. In some non-joining cases, however, it may be useful to forget the original implementation of a feature and let it start a new life devoid of any burden from the past.
+
+==Changing the export status==
+
+Another Feature Adaptation subclause, `export`, makes it possible to change the export status of an inherited feature. By default -- covering the behavior desired in the vast majority of practical cases -- an inherited feature keeps its original export status (exported, secret, selectively exported). In some cases, however, this is not appropriate:
+
+A feature may have played a purely implementation-oriented role in the parent, but become interesting to clients of the heir. Its status will change from secret to exported.
+
+In implementation inheritance (for example `ARRAYED_LIST` inheriting from `ARRAY`) an exported feature of the parent may not be suitable for direct use by clients of the heir. The change of status in this case is from exported to secret.
+
+You can achieve either of these goals by writing
+
+class D inherit
+ A
+ export {X, Y, ...} feature1, feature2, ... end
+
+ ...
+
+
+This gives a new export status to the features listed (under their final names since, as noted, `export` like all other subclauses comes after `rename` if present): they become exported to the classes listed. In most cases this list of classes, `X`, `Y`, ..., consists of just `ANY`, to re-export a previously secret feature, or `NONE`, to hide a previously exported feature. It is also possible, in lieu of the feature list, to use the keyword `all` to apply the new status to all features inherited from the listed parent. Then there can be more than one class-feature list, as in
+
+class ARRAYED_LIST [G] inherit
+
+ ARRAY [G]
+ rename
+ count as capacity, item as array_item, put as array_put
+ export
+ {NONE} all
+ {ANY} capacity
+ end
+
+
+
+ ...
+
+
+where any explicit listing of a feature, such as `capacity`, takes precedence over the export status specified for `all`. Here most features of `ARRAY` are secret in `ARRAYED_LIST`, because the clients should not permitted to manipulate array entries directly: they will manipulate them indirectly through list features such as `extend` and `item`, whose implementation relies on `array_item` and `array_put`. But `ARRAY`'s feature `count` remains useful, under the name `capacity`, to the clients of `ARRAYED_LIST`.
+
+==Flat and Flat-Contract Forms==
+
+Thanks to inheritance, a concise class text may achieve a lot, relying on all the features inherited from direct and indirect ancestors.
+
+This is part of the power of the object-oriented form of reuse, but can create a comprehension and documentation problem when the inheritance structures become deep: how does one understand such a class, either as client author or as maintainer? For clients, the Contract Form, entirely deduced from the class text, does not tell the full story about available features; and maintainers must look to proper ancestors for much of the relevant information.
+
+These observations suggest ways to produce, from a class text, a version that is equivalent feature-wise and assertion-wise, but has no inheritance dependency. This is called the '''Flat Form''' of the class. It is a class text that has no inheritance clause and includes all the features of the class, immediate (declared in the class itself) as well as inherited. For the inherited features, the flat form must of course take account of all the feature adaptation mechanisms: renaming (each feature must appear under its final name), redefinition, effecting, uneffecting and export status change. For redeclared features, `require else` clauses are or-ed with the precursors' preconditions, and `ensure then` clauses are and-ed with precursors' postconditions. For invariants, all the ancestors' clauses are concatenated. As a result, the flat form yields a view of the class, its features and its assertions that conforms exactly to the view offered to clients and (except for polymorphic uses) heirs.
+
+As with the Contract Form ( [[ET: Design by Contract (tm), Assertions and Exceptions#The_contract_form_of_a_class|"The contract form of a class"]] ), producing the Flat Form is the responsibility of tools in the development environment. In EiffelStudio, you will just click the "Flat" icon.
+
+The Contract Form of the Flat Form of a class is known as its '''Flat-Contract Form'''. It gives the complete interface specification, documenting all exported features and assertions -- immediate or inherited -- and hiding implementation aspects. It is the appropriate documentation for a class.
+
+==Repeated inheritance and selection==
+
+An inheritance mechanism, following from multiple inheritance, remains to be seen. Through multiple inheritance, a class can be a proper descendant of another through more than one path. This is called repeated inheritance and can be indirect, as in the following figure, or even direct, when a class `D` lists a class `A` twice in its `inherit` clause.
+
+[[Image:tutorial-13]]
+
+The figure's particular example is in fact often used by introductory presentations of multiple inheritance, which is a pedagogical mistake: simple multiple inheritance examples (such as `INTEGER` inheriting from `NUMERIC` and `COMPARABLE`, or `COMPANY_PLANE` from `ASSET` and `PLANE`) should involve the combination of '''separate abstractions'''. Repeated inheritance is an advanced technique; although invaluable, it does not arise in elementary uses and requires a little more care.
+
+In fact there is only one non-trivial issue in repeated inheritance: what does a feature of the repeated ancestor, such as `change_address` and `computer_account`, mean for the repeated descendant, here `TEACHING_ASSISTANT`? (The example features chosen involve a routine and an attribute; the basic rules will be the same.)
+
+There are two possibilities: sharing (the repeatedly inherited feature yields just one feature in the repeated descendant) and duplication (it yields two). Examination of various cases shows quickly that a fixed policy, or one that would apply to all the features of a class, would be inappropriate.
+
+Feature `change_address` calls for sharing: as a teaching assistant, you may be both teacher and student, but you are just one person, with just one official domicile.
+
+If there are separate accounts for students' course work and for faculty, you may need one of each kind, suggesting that `computer_account` calls for duplication.
+
+The Eiffel rule enables, once again, the software developer to craft the resulting class so as to tune it to the exact requirements. Not surprisingly, it is based on names, in accordance with the Final Name rule (no in-class overloading):
+
+
+{{rule|name=Repeated Inheritance|text=
+class TEACHING_ASSISTANT
+
+inherit
+ TEACHER
+ rename
+ computer_account as faculty_account
+ select
+ faculty_account
+ end
+
+ STUDENT
+ rename
+ computer_account as student_account
+ end
+
+ ...
+
+
+We assume here that that no other renaming has occurred -- `TEACHING_ASSISTANT` takes care of the renaming to ensure replication -- but that one of the two parents has redefined `computer_account`, for example `TEACHER` to express the special privileges of faculty accounts. In such a case the rule is that one (and exactly one) of the two parent clauses in `TEACHING_ASSISTANT` '''must''' select the corresponding version. Note that no problem arises for an entity declared as
+
+ ta: TEACHING_ASSISTANT
+
+
+since the valid calls are of the form `ta.faculty_account` and `ta.student_account`, neither of them ambiguous; the call `ta.computer_account` would be invalid, since after the renamings class `TEACHING_ASSISTANT` has no feature of that name. The `select` only applies to a call
+
+ up.computer_account
+
+with `up` of type `UNIVERSITY_PERSON`, dynamically attached to an instance of `TEACHING_ASSISTANT`; then the `select` resolves the ambiguity by causing the call to use the version from `TEACHER`.
+
+So if you traverse a list `computer_users: LIST [UNIVERSITY_PERSON]` to print some information about the computer account of each list element, the account used for a teaching assistant is the faculty account, not the student account.
+
+You may, if desired, redefine `faculty_account` in class `TEACHING_ASSISTANT`, using `student_account` if necessary, to take into consideration the existence of another account. But in all cases we need a precise disambiguation of what `computer_account` means for a `TEACHING_ASSISTANT` object known only through a `UNIVERSITY_PERSON` entity.
+
+The `select` is only needed in case of replication. If the Repeated Inheritance rule would imply sharing, as with change_address, and one or both of the shared versions has been redeclared, the Final Name rule makes the class invalid, since it now has '''two different features''' with the same name. (This is only a problem if both versions are effective; if one or both are deferred there is no conflict but a mere case of feature joining as explained in [[ET: Inheritance#Join_and_uneffecting|"Join and uneffecting"]] .) The two possible solutions follow from the previous discussions:
+
+If you do want sharing, one of the two versions must take precedence over the other. It suffices to '''undefine''' the other, and everything gets back to order. Alternatively, you can redefine both into a new version, which takes precedence over both.
+
+If you want to keep both versions, switch from sharing to replication: rename one or both of the features so that they will have different names; then you must `select` one of them.
+
+==Constrained genericity==
+
+Eiffel's inheritance mechanism has an important application to extending the flexibility of the '''genericity''' mechanism. In a class `SOME_CONTAINER [G]`, as noted in [[ET: Genericity and Arrays|"Genericity and Arrays"]] ), the only operations available on entities of type `G`, the formal generic parameter, are those applicable to entities of all types. A generic class may, however, need to assume more about the generic parameter, as with a class `SORTABLE_ARRAY [G ...]` which will have a procedure `sort` that needs, at some stage, to perform tests of the form
+
+ if item (i) < item (j) then ...
+
+where `item (i)` and `item (j)` are of type `G`. But this requires the availability of a feature infix "<" in all types that may serve as actual generic parameters corresponding to `G`. Using the type `SORTABLE_ARRAY [INTEGER]` should be permitted, because `INTEGER` has such a feature; but not `SORTABLE_ARRAY [COMPLEX]` if there is no total order relation on `COMPLEX`.
+
+To cover such cases, declare the class as
+
+class SORTABLE_ARRAY [G -> COMPARABLE]
+
+making it '''constrained generic'''. The symbol `->` recalls the arrow of inheritance diagrams; what follows it is a type, known as the generic constraint. Such a declaration means that:
+
+Within the class, you may apply the features of the generic constraint -- here the features of `COMPARABLE`: infix "<", `infix ">"` etc. -- to expressions of type `G`.
+
+A generic derivation is only valid if the chosen actual generic parameter conforms to the constraint. Here you can use `SORTABLE_ARRAY [INTEGER]` since `INTEGER` inherits from `COMPARABLE`, but not `SORTABLE_ARRAY [COMPLEX]` if `COMPLEX` is not a descendant of `COMPARABLE`.
+
+A class can have a mix of constrained and unconstrained generic parameters, as in the EiffelBase class `HASH_TABLE [G, H -> HASHABLE]` whose first parameter represents the types of objects stored in a hash table, the second representing the types of the keys used to store them, which must be `HASHABLE`. As these examples suggest, structural property classes such as `COMPARABLE`, `NUMERIC` and `HASHABLE` are the most common choice for generic constraints.
+
+Unconstrained genericity, as in `C [G]`, is defined as equivalent to `C [G -> ANY]`.
+
+==Assignment attempt==
+
+{{Caution|As of version 7.1, the assignment attempt has been marked as obsolete. Use the object test (described [[ET: Inheritance#Object test|below]] in a variant of this same discussion) instead. The documentation for the assignment attempt will remain during a period of transition, but will be removed at some point in the future. }}
+
+The Type Conformance rule ( [[ET: Inheritance#Polymorphism|"Polymorphism"]] ) ensures type safety by requiring all assignments to be from a more specific source to a more general target.
+
+Sometimes you can't be sure of the source object's type. This happens for example when the object comes from the outside -- a file, a database, a network. The persistence storage mechanism( [[ET: The Dynamic Structure: Execution Model#Deep_operations_and_persistence|"Deep operations and persistence"]] ) includes, along with the procedure `store` seen there, the reverse operation, a function `retrieved` which yields an object structure retrieved from a file or network, to which it was sent using `store`. But `retrieved` as declared in the corresponding class `STORABLE` of EiffelBase can only return the most general type, `ANY`; it is not possible to know its exact type until execution time, since the corresponding objects are not under the control of the retrieving system, and might even have been corrupted by some external agent.
+
+In such cases you cannot trust the declared type but must check it against the type of an actual run-time object. Eiffel introduces for this purpose the '''assignment attempt''' operation, written
+
+ x ?= y
+
+
+with the following effect (only applicable if `x` is a writable entity of reference type):
+
+If `y` is attached, at the time of the instruction's execution to an object whose type conforms to the type of `x`, perform a normal reference assignment.
+
+Otherwise (if `y` is void, or attached to a non-conforming object), make `x` void.
+
+Using this mechanism, a typical object structure retrieval will be of the form
+
+ x ?= retrieved
+
+ if x = Void then
+ "We did not get what we expected"
+ else
+ "Proceed with normal computation, which will typically involve calls of the form x.some_feature "
+ end
+
+
+As another application, assume we have a `LIST [ACCOUNT]` and class `SAVINGS_ACCOUNT`, a descendant of `ACCOUNT`, has a feature `interest_rate` which was not in `ACCOUNT`. We want to find the maximum interest rate for savings accounts in the list. Assignment attempt easily solves the problem:
+
+ local
+ s: SAVINGS_ACCOUNT
+ do
+ from account_list.start until account_list.after loop
+ s ?= acc_list.item
+ -- item from LIST yields the element at
+ -- cursor position
+ if s /= Void and then s.interest_rate > Result then
+ -- Using and then (rather than and) guarantees
+ -- that s.interest_rate is not evaluated
+ -- if s = Void is true.
+ Result := s.interest_rate
+ end
+ account_list.forth
+ end
+ end
+
+
+Note that if there is no savings account at all in the list the assignment attempt will always yield void, so that the result of the function will be 0, the default initialization.
+
+Assignment attempt is useful in the cases cited -- access to external objects beyond the software's own control, and access to specific properties in a polymorphic data structure. The form of the instruction precisely serves these purposes; not being a general type comparison, but only a verification of a specific expected type, it does not carry the risk of encouraging developers to revert to multi-branch instruction structures, for which Eiffel provides the far preferable alternative of polymorphic, dynamically-bound feature calls.
+
+
+==Object test==
+
+The Type Conformance rule ( [[ET: Inheritance#Polymorphism|"Polymorphism"]] ) ensures type safety by requiring all assignments to be from a more specific source to a more general target.
+
+Sometimes you can't be sure of the source object's type. This happens for example when the object comes from the outside -- a file, a database, a network. The persistence storage mechanism( [[ET: The Dynamic Structure: Execution Model#Deep_operations_and_persistence|"Deep operations and persistence"]] ) includes, along with the procedure `store` seen there, the reverse operation, a function `retrieved` which yields an object structure retrieved from a file or network, to which it was sent using `store`. But `retrieved` as declared in the corresponding class `STORABLE` of EiffelBase can only return the most general type, `ANY`; it is not possible to know its exact type until execution time, since the corresponding objects are not under the control of the retrieving system, and might even have been corrupted by some external agent.
+
+In such cases you cannot trust the declared type but must check it against the type of an actual run-time object. Eiffel introduces for this purpose the '''object test''' operation, using a form of the [[Void-safety: Background, definition, and tools#The attached syntax (object test)|attached syntax]]. The complete attached syntax is:
+
+ attached {SOME_TYPE} exp as l_exp
+
+
+and is a boolean-valued expression. So we can use the attached syntax as an object test. A typical object structure retrieval will be of the form
+
+ if attached retrieved as l_temp then
+-- We got what we expected
+-- Proceed with normal computation, typically involving calls of the form l_temp.some_feature
+ else
+-- We did not get what we expected"
+ end
+
+
+The expression `attached retrieved as l_temp` tests `retrieved` for voidness. If `retrieved` is not void, that is, `retrieved` is currently attached to an object, then a fresh local entity `l_temp` is created, the object is attached to `l_temp`, and the value of the expression is `True`. If `retrieved` is void, then the value of the expression is `False`.
+
+
+As another application, assume we have a `LIST [ACCOUNT]` and class `SAVINGS_ACCOUNT`, a descendant of `ACCOUNT`, has a feature `interest_rate` which was not in `ACCOUNT`. We want to find the maximum interest rate for savings accounts in the list. Object test easily solves the problem:
+
+ do
+ from account_list.start until account_list.after loop
+ if attached {SAVINGS_ACCOUNT} account_list.item as l_s and then l_s.interest_rate > Result then
+ -- Using and then (rather than and) guarantees
+ -- that l_s.interest_rate is not evaluated
+ -- if `attached {SAVINGS_ACCOUNT} account_list.item as l_s' is False.
+ Result := l_s.interest_rate
+ end
+ account_list.forth
+ end
+ end
+
+
+Note that if there is no savings account at all in the list the object test will never be satisfied, so that the result of the function will be 0, the default initialization.
+
+The object test is useful also in building [[Void-safe programming in Eiffel|void-safe software systems]].
+
+{{SeeAlso|[[Creating a new void-safe project#More about the attached syntax|More about the attached syntax]] in the section on [[Void-safe programming in Eiffel]]. }}
+
+
+==Covariance, anchored declarations, and "catcalls"==
+
+The final properties of Eiffel inheritance involve the rules for adapting not only the implementation of inherited features (through redeclaration of either kind, effecting and redefinition, as seen so far) and their contracts (through the Assertion Redeclaration rule), but also their types. More general than type is the notion of a feature's '''signature''', defined by the number of its arguments, their types, the indication of whether it has a result (that is to say, is a function or attribute rather than a procedure) and, if so, the type of the result.
+
+===Covariance===
+
+In many cases the signature of a redeclared feature remains the same as the original's. But in some cases you may want to adapt it to the new class. Assume for example that class `ACCOUNT` has features
+
+ owner: HOLDER
+
+ set_owner (h: HOLDER)
+ -- Make `h' the account owner.
+ require
+ not_void: h /= Void
+ do
+ owner := h
+ end
+
+
+We introduce an heir `BUSINESS_ACCOUNT` of `ACCOUNT` to represent special business accounts, corresponding to class `BUSINESS` inheriting from `HOLDER`:
+
+[[Image:tutorial-14]]
+
+Clearly, we must redefine `owner` in class `BUSINESS_ACCOUNT` to yield a result of type `BUSINESS`; the same signature redefinition must be applied to the argument of `set_owner`. This case is typical of the general scheme of signature redefinition: in a descendant, you may need to redefine both results and arguments to types conforming to the originals. This is reflected by a language rule:
+
+
+{{rule|name=Covariance|text=In a feature redeclaration, both the result type if the feature is a query (attribute or function) and the type of any argument if it is a routine (procedure or function) must conform to the original type as declared in the precursor version. }}
+
+
+The term "covariance" reflects the property that all types -- those of arguments and those of results -- vary together in the same direction as the inheritance structure.
+
+If a feature such as `set_owner` has to be redefined for more than its signature -- to update its implementation or assertions -- the signature redefinition will be explicit. For example `set_owner` could do more for business owners than it does for ordinary owners. Then the redefinition will be of the form
+
+ set_owner (b: BUSINESS)
+ -- Make b the account owner.
+ do
+ ... New routine body ...
+ end
+
+
+====Anchored Declarations====
+
+In other cases, however, the body will be exactly the same as in the precursor. Then explicit redefinition would be tedious, implying much text duplication. The mechanism of '''anchored redeclaration''' solves this problem. The original declaration of `set_owner` in `ACCOUNT` should be of the form
+
+ set_owner (h: like owner)
+ -- Make h the account owner.
+ -- The rest as before:
+ require
+ not_void: h /= Void
+ do
+ owner := h
+ end
+
+
+A `like` ''anchor'' type, known as an anchored type, may appear in any context in which ''anchor'' has a well-defined type; that is, ''anchor'' can be an attribute or function of the enclosing class. Then, assuming `T` is the type of ''anchor'', the type `like` ''anchor'' means the following:
+
+In the class in which it appears, `like` ''anchor'' means the same as `T`. For example, in `set_owner` above, the declaration of `h` has the same effect as if `h` had been declared of type `HOLDER`, the type of the anchor `owner` in class `ACCOUNT`.
+
+The difference comes in proper descendants: if a type redefinition changes the type of ''anchor'', any entity declared `like` ''anchor'' will be considered to have been redefined too.
+
+This means that anchored declarations are a form of of implicit covariant redeclaration.
+
+In the example, class `BUSINESS_ACCOUNT` only needs to redefine the type of `owner` (to `BUSINESS`). It doesn't have to redefine `set_owner` except if it needs to change its implementation or assertions.
+
+It is possible to use `Current` as anchor; the declaration `like Current` denotes a type based on the current class (with the same generic parameters if any). This is in fact a common case; we saw in [[ET: Inheritance#Structural_property_classes|"Structural property classes"]] , that it applies in class `COMPARABLE` to features such as
+
+ is_less alias "<" (other: like Current): BOOLEAN ...
+
+
+since we only want to compare two comparable elements of compatible types -- but not, for example, integer and strings, even if both types conform to `COMPARABLE`. (A "balancing rule" makes it possible, however, to mix the various arithmetic types, consistently with mathematical traditions, in arithmetic expressions such as `3 + 45.82` or boolean expressions such as 3 < 45.82.)
+
+Similarly, class `ANY` declares procedure `copy` as
+
+ copy (other: like Current) ...
+
+
+with the argument anchored to the current object.
+
+A final, more application-oriented example of anchoring to `Current` is the feature `merge` posited in an earlier example (in [[ET: The Dynamic Structure: Execution Model|"The Dynamic Structure: Execution Model"]] ) with the signature `merge (other: ACCOUNT)`. By using instead `merge (other: like Current)` we can ensure that in any descendant class -- `BUSINESS_ACCOUNT`, `SAVINGS_ACCOUNT`, `MINOR_ACCOUNT` ... -- an account will only be mergeable with another of a compatible type.
+
+====Qualified Anchored Declarations====
+
+The anchored types shown above specify anchors which are either:
+* The name of a query of the class in which the anchored declaration appears
+** as in the case of: `set_owner (h: like owner)` or
+* `Current`
+** as in the case of: is_less alias "<" (other: like Current): BOOLEAN.
+
+Declarations can also use '''qualified''' anchored types. Consider this possible feature of `ACCOUNT`:
+
+
+ owner_name: like owner.name
+
+
+Here the type of `owner_name` is determined as the type of the feature `name` as applied to the type of the feature `owner` of the current class. As you can imagine, for declarations like this to be valid, the feature names `name` and `owner` must be the names queries, i. e., the names of attributes or functions.
+
+This notion can be extended to declare the type through multiple levels of remoteness, so patterns like the following can be valid:
+
+
+ f: like a.b.c.d
+
+
+For example if a class used a list of items of type `ACCOUNT`, it might include a declaration for that list:
+
+
+ all_accounts: LINKED_LIST [ACCOUNT]
+ -- All my accounts
+
+
+This class could declare a feature with a qualified anchored type like this:
+
+
+ account_owner_name: like all_accounts.item.owner.name
+
+
+A qualified anchored type can be qualified also by specifying a type for the qualifier:
+
+
+ owner_name: like {HOLDER}.name
+
+
+In this case, the type of `owner_name` is the same as the type of the `name` feature of type `HOLDER`.
+
+Anchored declarations serve as another way to make software more concise and more resilient in a changing world. Let's look at one last example of using a qualified anchored type:
+
+
+ a: ARRAY [DATA]
+ ...
+ local
+ idx: like a.lower
+ do
+ from
+ idx := a.lower
+ until
+ idx > a.upper
+
+ ...
+
+
+Declaring the local entity `idx` as the qualified anchored type `like a.lower` puts this code (well, actually the producer of this code) in the enviable position of never having to worry about what type is used by class `ARRAY` for its feature `lower`. So, `{ARRAY}.lower` could be implemented as `INTEGER_32`, `NATURAL_64`, or some other similar type and this code would be fine, even if at some point that type changed.
+
+===Catcalls===
+
+In our diversion about anchored declarations, we've gotten away from our discussion of covariance. Let's continue that now with a look at a side effect of covariance known as the '''catcall'''.
+
+Covariance makes static type checking more delicate; mechanisms of '''system validity''' and '''catcalls''' address the problem, discussed in detail in the book [[Object-Oriented Software Construction, 2nd Edition]].
+
+The capabilities of polymorphism combined with covariance provide for powerful and flexible modeling. Under certain conditions, though, this flexibility can lead to problems.
+
+In short, you should be careful to avoid polymorphic '''catcalls'''. The '''call''' part of '''catcall''' means feature call. The '''cat''' part is an acronym for '''C'''hanged '''A'''vailability or '''T'''ype. What is changing here are features of descendant classes through the adaptation of inheritance. So maybe a descendant class has changed the export status of an inherited feature, so that that feature is not available on instances of the descendant class ... this is the case of '''changed availability'''. Or perhaps, through covariant modeling, the type of an argument to a feature in a descendant class has changed ... the case of '''changed type'''.
+
+Let's look at an example of changed type, due to covariant modeling. Suppose we have a system which uses the classes depicted on the following diagram:
+
+[[Image:Catcall example class diagram]]
+
+If in a client class, we declare the following attributes:
+
+
+ my_animal: ANIMAL
+ my_food_stuff: FOOD_STUFF
+
+
+Also, the class `ANIMAL` contains the feature:
+
+ eat (a_f: FOOD_STUFF)
+ -- Consume `a_f'
+ deferred
+ end
+
+This routine is implemented in `COW` as:
+
+ eat (a_f: GRASS)
+
+and in class `LION` as:
+
+ eat (a_f: WILDEBEEST_FILET)
+
+
+So, covariant modeling is used to make the type of the argument for `eat` appropriate for each of `ANIMAL`'s heirs.
+
+Here's where the problem comes in. It is possible at run-time to attach to `my_animal` a direct instance of either `COW` or `LION`. So, `my_animal` is a polymorphic attribute. Likewise, it is possible at run-time that `my_food_stuff` could be attached to a direct instance of either `GRASS` or `WILDEBEEST_FILET`.
+
+So, the feature call:
+
+ my_animal.eat (my_food_stuff)
+
+is a '''catcall''', because there is a possibility that through the changing type of the argument to `eat`, we could be causing a `COW` to engage in the inappropriate practice of eating a `WILDEBEEST_FILET`.
+
+Because this possibility exists, developers should exercise caution in using polymorphism and covariant modeling.
+
+In version 6.2 of EiffelStudio, a capability was added to detect harmful catcalls at runtime. So, in our example, if we used `my_animal.eat (my_food_stuff)` only to feed grass to cows and wildebeest filets to lions, then all would be well. But if we attempted to use that same call to feed an inappropriate food to an animal, we would see an exception.
+
+Likewise the compiler in EiffelStudio will produce warnings in cases in which catcalls are possible. Below is an example of the compiler warning issued on the example.
+
+[[Image:Catcall compiler warning]]
+
+
+
+==Non-conforming inheritance==
+
+So far, our experience with inheritance is that of "conforming" inheritance ... the most commonly used type of inheritance. Conforming inheritance is what allows a direct instance (in the '''catcall''' example above) of `COW` to be attached at runtime to an entity of type `ANIMAL`. This can be a powerful modeling capability, but it is this same polymorphism facilitated by conforming inheritance that puts us in the danger of using polymorphic '''catcalls'''.
+
+In cases in which polymorphic attachment is not anticipated, the possibility of catcalls can be avoided by using '''non-conforming inheritance'''. Non-conforming inheritance is just a more restrictive form of inheritance.
+
+
+:'''Non-conforming inheritance allows features to be inherited from parent to heir, but it disallows polymorphic attachment of a direct instance of an heir to an entity based on a non-conforming parent.'''
+
+
+In order to use non-conforming inheritance for a particular parent, we use the marker `{NONE}` in the appropriate inheritance part of the class:
+
+
+class
+ MY_HEIR_CLASS
+
+inherit
+ MY_CONFORMING_PARENT
+
+inherit {NONE}
+ MY_NON_CONFORMING_PARENT
+ ...
+
+
+Here there are two `inherit` clauses, one to specify conforming parents, and one to specify non-conforming parents. The clause specifying the conforming inheritance must precede the one specifying the non-conforming inheritance.
+
+
+{{note|According to the Eiffel programming language [http://www.ecma-international.org/publications/standards/Ecma-367.htm standard], it is possible to have any number of inherit clauses an any order, however EiffelStudio versions as late as 6.5 allow only one conforming and one non-conforming clause, with the conforming clause preceding the non-conforming one. This restriction will be removed in a future release.}}
+
+
+So, in this case, at runtime it is valid for a direct instance of `MY_HEIR_CLASS` to be attached to an entity of type `MY_CONFORMING_PARENT`, but not to an entity of type `MY_NON_CONFORMING_PARENT`. Accordingly, the compiler would reject any code in which an instance of `MY_HEIR_CLASS` could become attached to an entity of type `MY_NON_CONFORMING_PARENT`. Because the polymorphic attachment cannot be made, the possibility of a catcall is avoided.
+
+
+{{note|As implemented, non-conforming inheritance mimics a copy/paste operation in which the features of the parent class are copied to the non-conforming heir class with no inheritance linkage maintained. You should keep this fact in mind when using non-conforming inheritance. In particular, `once` routines are replicated as unrelated features in the heir classes, so they share neither freshness status nor computed value (in the case of functions). Thus, a once function that comes from a non-conforming parent yields a result that is not related to the one returned by the parent's version.}}
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-instructions.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-instructions.wiki
new file mode 100644
index 00000000..a9c79262
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-instructions.wiki
@@ -0,0 +1,418 @@
+[[Property:title|ET: Instructions]]
+[[Property:weight|-6]]
+[[Property:uuid|628bf3db-728f-0b3c-bdbb-fe52deaae5b7]]
+==Instructions==
+
+Eiffel has a remarkably small set of instructions. The basic computational instructions have been seen: creation, assignment, procedure call, retry. They are complemented by control structures: conditional, multi-branch, loop, as well as debug and check.
+
+===Assignment and attachment===
+
+As noted above we have already introduced assignment. But let's take another look at the assignment in the context of the more abstract concept of '''attachment'''. Attachment can occur with reference types by assignment such as:
+
+ x := y
+
+In this assignment, x is the target of the assignment and y is the source. The object associated with y becomes ''attached'' to the entity x.
+
+Attachment also occurs in other contexts. For example, when actual arguments are substituted for formal arguments in a call to a routine.
+
+ f (w)
+
+In the call to f above, the object associated with the actual argument w will be ''attached'' to the formal argument for the duration of the execution of f. So, in this case, w can be viewed as the source of the attachment and the formal argument of f is the target.
+
+Other situations in which attachment occurs include [[ET: The Dynamic Structure: Execution Model#Creating and initializing objects|creation instructions]], attachment of [[Void-safety: Background, definition, and tools#The attached syntax (object test)|object test local variables]], and the attachment of local iteration cursors in the iteration form of the [[ET: Instructions#Loop|loop construct]].
+
+We learned in the section on [[ET: Inheritance#Polymorphism|polymorphism]], that the type of the source of an assignment must conform to the type of the assignment's target.
+
+The rule that governs validity of assignments expands upon this and is generalized to apply to all attachments.
+
+
+{{Rule|name=Assignment|text=An assignment is valid if and only if the type of its source expression is '''compatible''' with the type of its target entity. }}
+
+
+The phrase "'''compatible with'''" in this rule means that either it "'''conforms to'''" or "'''converts to'''".
+
+We saw conformance defined in the section on [[ET: Inheritance#Polymorphism|Polymorphism]]. [[ET: Other Mechanisms#Convertibility|Convertibility]] is explained in the section on [[ET: Other Mechanisms#Convertibility|Other Mechanisms]].
+
+
+===Conditional===
+
+A conditional instruction has the form
+
+ if ... then
+ ...
+ elseif ... then
+ ...
+ else
+ ...
+ end
+
+The elseif ... then ... part (of which there may be more than one) and the else ... part are optional. After if and elseif comes a boolean expression; after then and else come zero or more instructions.
+
+===Multi-branch===
+
+A multi-branch instruction has the form
+
+ inspect
+ exp
+ when v1 then
+ inst
+ when v2 then
+ inst2
+ ...
+ else
+ inst0
+ end
+
+
+where the else inst0 part is optional, exp is a character or integer expression, v1, v1, ... are constant values of the same type as exp, all different, and inst0, inst1, inst2, ... are sequences of zero or more instructions.
+
+The effect of such a multi-branch instruction, if the value of exp is one of the vi, is to execute the corresponding insti. If none of the vi matches, the instruction executes inst0, unless there is no else part, in which case it triggers an exception.
+
+{{note|Raising an exception is the proper behavior, since the absence of an else indicates that the author asserts that one of the values will match. If you want an instruction that does nothing in this case, rather than cause an exception, use an else part with an empty inst0. In contrast, if c then inst end with no else part does nothing in the absence of an else part, since in this case there is no implied claim that c must hold. }}
+
+===Loop===
+
+The loop construct provides a flexible framework for iterative computation. Its flexibility lies in how the complete form can be tailored and simplified for certain purposes by including or omitting optional parts.
+
+You'll learn that the loop construct is always used in one of two forms: a '''base''' form which allows precise control over details of all loop aspects, and an '''iteration''' form which abstracts many of the details and provides a concise notation, ideal for traversing data structures and other objects which support iteration.
+
+We will explore the entire mechanism, but let's approach things a little at a time.
+
+====Two forms -- two examples====
+
+First let's take a look at two examples. These examples accomplish the same goal: they both use a loop to visit and print the content of each node of a linked list of character strings. So, the list in question might be declared like this:
+
+
+ my_list: LINKED_LIST [STRING]
+
+
+Here's one example:
+
+
+ from
+ my_list.start
+ until
+ my_list.off
+ loop
+ print (my_list.item)
+ my_list.forth
+ end
+
+''Loop example 1.''
+
+
+and the other:
+
+
+ across
+ my_list as ic
+ loop
+ print (ic.item)
+ end
+
+''Loop example 2.''
+
+
+At first observation, it may not appear that both of these examples are using the same language construct. But, indeed, they are simply two different forms of a single language construct, as you will see.
+
+Incidentally, there is no requirement that ''Loop example 1'' occupy multiple lines, and ''Loop example 2'' occupy only one line. ''Loop example 1'' could have been written like this:
+
+ from
+ my_list.start
+ until
+ my_list.off
+ loop
+ print (my_list.item)
+ my_list.forth
+ end
+
+just as ''Loop example 2'' could have been written to take multiple lines. It comes down to a matter of balance among traditional style, conciseness, and readability.
+
+In fact, these two examples illustrate the two basic usage forms of the loop construct in Eiffel. The two basic forms can be differentiated by the parts of the construct with which they begin.
+
+The form shown in ''Loop example 1'' begins with an ''Initialization part'' ( from my_list.start ), which starts with the keyword from. Let's call this form the '''base''' form. So, the type of loop you see in ''Loop example 1'' has been the traditional mechanism for accomplishing iterative computation, including iterating across data structures. However, extensions to Eiffel's loop construct have provided a more concise way of expressing traversing "iterable" structures.
+
+This is the form shown in ''Loop example 2''. It begins with an ''Iteration part'' ( across my_list as c ), which starts with the keyword across. We'll call this form the '''iteration''' form.
+
+====A closer look at the ''base'' form====
+
+What is happening in ''Loop example 1''? Let's dissect it and see.
+
+First there is the ''initialization'' part:
+
+
+ from
+ my_list.start
+
+''Initialization part.''
+
+
+The first thing to occur in the execution of the base loop is the execution of any instructions in the initialization part (it is permissible for the initialization part to be empty of instructions, but the keyword from must be present to distinguish the base loop form). In our example, the feature start is applied to my_list which will attempt to set the list cursor to the first element in my_list.
+
+The ''Exit condition part'':
+
+
+ until
+ my_list.off
+
+''Exit condition part.''
+
+
+The exit condition part of the loop construct defines the conditions under which the loop body (explained below) should no longer be executed. In our example, the loop will no longer execute if the cursor is "off", that is, there is no current item. So, if the list is empty, the loop body will not execute at all.
+
+The ''loop body'' part:
+
+
+ loop
+ print (my_list.item)
+ my_list.forth
+
+''loop body part.''
+
+
+The loop body part contains the sequence of instructions to be executed during each iteration. In the example, that includes printing the current list item and then advancing the cursor. At some point, the cursor will pass the last item in the list, causing the exit condition to become true and stop the loop's execution. So, at the risk of stating the obvious, the key to loops that always complete is to ensure that there is something in the loop body that is guaranteed always to cause the exit condition eventually to become true. Loop correctness will discussed in more detail [[#Loop invariants and variants|later]].
+
+And finally, there's the ''End'' part:
+
+
+ end
+
+''end part.''
+
+
+====A closer look at the ''iteration'' form====
+
+Now let's examine the iteration form (sometimes called the "across syntax") used in ''Loop example 2.''
+
+The example begins with an iteration part:
+
+
+ across my_list as ic
+
+''Iteration part.''
+
+
+The iteration form is special in the sense that it is designed to work with objects which are ''iterable'', usually data structures. The iteration form always targets a particular object (usually a data structure) based on a class that inherits, either directly or indirectly from the library class ITERABLE. The iteration part specifies such a target for the iteration, in the case of our example, the target is my_list.
+
+The "as ic" indicates that a local iteration cursor object referenced by the name ic, and available only for the scope of the iteration, will be created to effect the iteration. The element of my_list which is currently referenced by the cursor ic is accessed through ic.item as you see in the loop body:
+
+
+ loop print (ic.item)
+
+''loop body part''.
+
+
+Notice that the loop body does not contain the call to the structure's forth feature, as our example in base form did. Neither do you see the call to start nor the check of off in the exit condition. The iteration form abstracts these for you, relieving you of their burden ... while eliminating some opportunities for error.
+
+Notice also that the call "print (ic.item)"" accesses the current item as "ic.item"" versus "my_list.item"" in the base form. This is because in the iteration form, access to the current item is through the cursor variable, "ic" in the case of ''Loop example 2''.
+
+Concerning cursors, both ways of using the loop construct to traverse a structure employ a cursor. In the base form, the cursor is internal to the structure object. In the case of the example, that would be the instance of LINKED_LIST [STRING] called my_list. Applying the feature item to my_list retrieves the list element currently referenced by the cursor. In the iteration version of traversal, the variable ic holds the iteration cursor, external to the list object. So, you apply ic.item to get the current list element. The advantage to the external cursor is that multiple traversals of the structure can occur simultaneously without interfering with one another. This is possible in the base form, but only by saving and restoring the structure's cursor.
+
+
+{{recommended|The ''iteration'' form of the loop construct is not appropriate for use in cases in which the target structure may be changed during the traversal. Therefore, if you choose to alter the structure during traversal, you must use the ''base'' loop form with explicit cursor manipulation. This is still tricky business, so you should be certain to protect your work with appropriate contracts.}}
+
+
+Lastly, of course, the iteration form includes an ''end part'' ... at the end.
+
+
+====The ''iteration'' form as a boolean expression====
+
+In ''Loop example 2'', the loop behaves as an instruction. But it is possible to have the iteration loop form behave as a boolean expression. This is helpful in cases in which you might want to ask a question that can be answered by traversing all or part of a structure.
+
+To get this effect, you use the iteration form with one of two alternative body notations, the ''all body part'' or the ''some body part'' in place of the ''loop body''. When you use either of these notations, the ''body'' is a boolean expression. So, the forms for these body parts are:
+
+
+ all boolean_expression
+
+''all body part.''
+
+
+ some boolean_expression
+
+''some body part.''
+
+
+So, to know if all the strings in my_list have lengths greater than three characters, we could code:
+
+
+ across my_list as ic all ic.item.count > 3 end
+
+''Loop example 3.''
+
+
+To know if at least one string in my_list has a length greater than three characters, we would use the ''some body part'':
+
+
+ across my_list as ic some ic.item.count > 3 end
+
+''Loop example 4.''
+
+Of course you can use iteration loops with "all" or "some" bodies in the same way that you would any other boolean expression; in [[#Conditional|conditionals]], for example.
+
+
+====Loop anatomy and rules for constructing loops====
+
+Now that we've seen examples of the two forms of loops and broken down their component parts, we're ready to examine the anatomy of the entire construct in more detail. You may remember from the beginning of this discussion that the flexibility of the loop construct lies in its ability to use or omit its various parts to gain certain effects.
+
+Here are all the possible loop parts, most of which we've seen in examples, in the order in which they must appear when we code them:
+
+
+{| border="2" cellpadding="8"
+! This loop part:
+! Has this pattern:
+|-
+| ''Iteration part'' || across expression as identifier
+|-
+| ''Initialization part'' || from zero_or_more_instructions
+|-
+| ''Invariant part'' || invariant assertion
+|-
+| ''Exit condition part'' || until boolean_expression
+|-
+| rowspan="3" | ''Body part'' || loop ''zero_or_more_instructions '' '''or'''
+|-
+| all ''boolean_expression'' '''or'''
+|-
+| some ''boolean_expression''
+|-
+| ''Variant part'' || variant optional_tag: integer_expression
+|-
+| ''end part'' || end
+|}
+
+
+Apart from seeing examples, it is useful to understand some of the rules of constructing loops from these parts. Here's an informal summary of what you should know about putting together valid loops:
+
+# Any loop parts being used must appear in the order shown in the table above.
+# Every loop used will assume one of the two forms mentioned early. As a result, every loop will begin either with the across keyword (''iteration'' form) or the from keyword (''base'' form).
+# A ''Body part'' and an ''End part'' are both required for every loop.
+## ''Body parts'' using either the all keyword or the some keyword are only allowed in the absence of an ''initialization part''.
+# An ''exit condition part'' is required for all loops of ''base'' form.
+# The expression you use in an ''iteration'' part, must have a type that is based on a class that inherits from the library class ITERABLE.
+# The identifier you choose for the internal cursor used in loops of the ''iteration'' form shouldn't be the same as another identifier you are using.
+
+There are implications of these rules that are worth understanding. Let's look at some of them.
+
+Consider that all parts must appear in order (1) and that every loop starts with one of two keywords: either across or from (2). Taken together, these imply that it would be invalid for a loop in ''base'' form to include an ''iteration part''. However, the opposite is not true. Because the ''initialization part'' falls after the ''iteration part'' it is possible for a loop in ''iteration'' form to contain an ''initialization'' part. Imagine for example, that we wanted to compute the sum of the number of characters in all elements of the list of strings in our examples. The ''initialization'' part could be used to initialize the sum entity before starting the iteration:
+
+ across
+ my_list as ic
+ from
+ sum := 0
+ loop
+ sum := sum + ic.item.count
+ end
+
+
+Loops of the ''base'' form require an ''exit condition part'' (4). This allows the possibility that ''Iteration'' loops ''may'' contain an ''exit condition part''. Indeed they may, but it is not required. Using an ''exit condition part'' in a loop of the ''iteration'' can be useful if you want to impose an early exit condition on an iteration. So, extending the previous example, if we wanted to sum the length of elements, but only until we reached an element whose content matched a certain criterion, we could add the ''exit condition part'':
+
+ across
+ my_list as ic
+ from
+ sum := 0
+ until
+ ic.item ~ "Stop now"
+ loop
+ sum := sum + ic.item.count
+ end
+
+
+For loops of the ''iteration'' form, types of iteration targets must be based on classes inheriting from ITERABLE (5). What classes meet this criterion? All the appropriate classes in the EiffelBase library: lists, hash tables, arrays, intervals, etc. Although the details are beyond the scope of this tutorial, you also should recognize the implication that your own classes could be made iterable.
+
+One useful descendant of ITERABLE is the integer interval. The general operator "|..|" provides a concise way of creating the interval between two integers. So, you can use this to loop across a range of integers without a lot of setup. This example:
+
+ across
+ 5 |..| 15 as ic
+ loop
+ print (ic.item.out+"%N")
+ end
+
+prints the integers in the interval 5 through 15.
+
+Also descending from ITERABLE are the iteration cursors themselves. This means that a cursor can be the target of a loop of the ''iteration'' form. Consider this example that prints the items in my_list in reverse order:
+
+ across
+ my_list.new_cursor.reversed as ic
+ loop
+ print (ic.item)
+ end
+
+Here the feature new_cursor is applied to my_list. The result is a new iteration cursor for traversing my_list. Then the reversed feature is applied to that result, which itself results in an iteration cursor having the order of the elements reversed. It is this cursor that is used for ic in the traversal.
+
+
+====Loop invariants and variants====
+
+The only loop parts that we have yet to address are the ''invariant part'' and the ''variant part''. These two optional loop parts exist to help guarantee the correctness of loops. The ''invariant part'' expresses a loop invariant (not to be confused with [[ET: Design by Contract (tm), Assertions and Exceptions#Class invariants|class invariants]]). For the loop to be correct, the instructions in ''initialization part'' must ensure that the loop invariant assertion is true, and then every execution of the loop body must preserve the invariant; so the effect of the loop is to yield a state, eventually, in which both the loop invariant and the exit condition are true.
+
+The loop must terminate after a finite number of iterations, of course. This can be guaranteed by including the loop ''variant part''. The ''variant part'' provides an integer expression whose value is non-negative after the execution of the instructions in the ''initialization part''. The value of the variant is then decreased by at least one, while remaining non-negative, by any execution of the loop body. Because a non-negative integer cannot be decreased forever, this guarantees that the loop will terminate.
+
+When assertion monitoring is enabled for loop invariants and variants, the integrity of these properties is checked after initialization and after each loop iteration. An exception will be triggered if the loop invariant does not hold, or if the variant either becomes negative or does not decrease.
+
+
+===Debug===
+
+An occasionally useful instruction is debug (''Debug_key'', ... ) ''instructions'' end where ''instructions'' is a sequence of zero or more instructions and the part in parentheses is optional, containing if present one or more strings, called debug keys. The EiffelStudio compiler lets you specify the corresponding debug compilation option: yes, no, or an explicit debug key. The ''instructions'' will be executed if and only if the corresponding option is on. The obvious use is for instructions that should be part of the system but executed only in some circumstances, for example to provide extra debugging information.
+
+===Check===
+
+The final instruction is connected with Design by Contract. The instruction
+
+ check
+ Assertion
+ end
+where Assertion is a sequence of zero or more assertions, will have no effect unless assertion monitoring is turned on at the Check level or higher. If so it will evaluate all the assertions listed, having no further effect if they are all satisfied; if any one of them does not hold, the instruction will trigger an exception.
+
+This instruction serves to state properties that are expected to be satisfied at some stages of the computation -- other than the specific stages, such as routine entry and exit, already covered by the other assertion mechanisms such as preconditions, postconditions and invariants. A recommended use of check involves calling a routine with a precondition, where the call, for good reason, does not explicitly test for the precondition. Consider a routine of the form
+
+ r (a_count: INTEGER)
+ require
+ valid_count: a_count >= minimum_allowable
+ do
+ ...
+ end
+
+
+This routine will only work if its precondition is satisfied on entry. To guarantee this precondition, the caller may protect it by the corresponding test, as in
+
+ if my_count >= a.minimum_allowable then
+ a.r (my_count)
+ end
+
+
+In effect, this says that if the value of my_count meets r's precondition requirement, then call r, otherwise continue execution. This implies that there is something useful to be done in the case that the call to r could not be executed because the value of my_count did not meet the precondition.
+
+But suppose that due to previous processing, it is reasonably expected that my_count should always have a value that complies with r's precondition. In other words, it would always be expected that the call to r should proceed without failure. In this case it might be a good idea to use a check to document this property,
+
+ check
+ my_count_is_large_enough: my_count >= a.minimum_allowable
+ -- Should always be large enough because ...
+ end
+
+if only to make sure that a reader of the code will realize that the omission of an explicit test was not a mistake.
+
+In production (finalized) mode, when assertion monitoring is typically turned off, this instruction will have no effect. But it will be precious for a maintainer of the software who is trying to figure out what it does, and in the process to reconstruct the original developer's reasoning. (The maintainer might of course be the same person as the developer, six months later.) And if the rationale is wrong somewhere, turning assertion checking on will immediately uncover the bug.
+
+There is, however, one form of check that continues to be monitored even when assertion monitoring is turned off.
+
+ check Assertion then
+ Compound
+ end
+
+Here Assertion is a list of assertions as above, and Compound is a list of zero or more executable instructions.
+
+This variant is used often when ensuring [[Void-safe programming in Eiffel|void-safety]]. It is used make certain that certain detachable entities are actually attached to objects when expected, and to create a new void-safe scope for accessing the objects. For example:
+
+ check attached my_detachable as l_temp then
+ l_temp.do_something
+ end
+
+In cases in which my_detachable is attached to an object (as is expected), the local entity l_temp will allow controlled access to the object during the scope of the check instruction. If a case occurs in which my_detachable is not attached to an object, then an exception is triggered. As noted above, for this variant of check, assertion monitoring is always in effect, even if it has been turned off for other cases.
+
+So, the form check ... then ... end is somewhat similar to if ... then ... end. The difference is that the if ... then ... end allows the possibility that valid cases might occur in which the boolean expression is not true, and processing continues. The check ... then ... end does not allow such a possibility. The boolean expression is expected always to hold. In fact, if the expression is not true, then like other assertion violations, this is indicative of a bug, and will cause an exception to be raised.
+
+
+{{recommended|An extra indentation of the check part to separate it from the algorithm proper; and inclusion of a comment listing the rationale behind the developer's decision not to check explicitly for the precondition. }}
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-learn-more.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-learn-more.wiki
new file mode 100644
index 00000000..4318f047
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-learn-more.wiki
@@ -0,0 +1,15 @@
+[[Property:title|ET: To Learn More]]
+[[Property:weight|-1]]
+[[Property:uuid|74a5c826-8f21-8cf2-4f2c-dee4ee28ead5]]
+Beyond this introduction, you will find the following books essential to a mastery of the method and language: elseif which is made of two words -- are reserved, meaning that you cannot use them to declare new entities. Here is the list:
+
+
+{| border="1"
+|-
+| agent
+| alias
+| all
+| and
+| as
+| assign
+| check
+|-
+| class
+| convert
+| create
+| Current
+| debug
+| deferred
+| do
+|-
+| else
+| elseif
+| end
+| ensure
+| expanded
+| export
+| external
+|-
+| False
+| feature
+| from
+| frozen
+| if
+| implies
+| indexing
+|-
+| infix
+| inherit
+| inspect
+| invariant
+| is
+| like
+| local
+|-
+| loop
+| not
+| obsolete
+| old
+| once
+| or
+| prefix
+|-
+| Precursor
+| pure
+| redefine
+| reference
+| rename
+| require
+| rescue
+|-
+| Result
+| retry
+| separate
+| then
+| True
+| TUPLE
+| undefine
+|}
+
+
+Since this tutorial has covered all the essential mechanisms, you may ignore the keywords not encountered; they are reserved for future use.
+
+Most of the reserved words are keywords, serving only as syntactic markers, and written in boldface in typeset texts such as the present one: class, feature, inherit. The others, such as Current, directly carry a semantic denotation; they start with an upper-case letter and are typeset in boldface.
+
+These conventions about letter case are only style rules. Eiffel is case-insensitive, since it is foolish to assume that two identifiers denote two different things just on the basis of a letter written in lower or upper case. The obvious exception is manifest character constants (appearing in single quotes, such as 'A') and manifest character strings (appearing in double quotes, such as "UPPER and lower").
+
+The style rules, however, are precise, and any serious Eiffel project will enforce them; the tools of EiffelStudio also observe them in the texts they output (although they will not mess up with your source text unless you ask them to reformat it). Here are the conventions, illustrated by the examples of this tutorial:
+* Class names in upper case, as ACCOUNT.
+* Non-constant feature names and keywords in lower case, as balance and class.
+* Constant features and predefined entities and expressions with an initial upper case, as Avogadro and Result.
+
+In typeset documents including Eiffel texts, the standard for font styles is also precise. You should use bold face for keywords and italics for all other Eiffel elements. Comments, however, are typeset in roman. This lets a software element, such as an identifier, stand out clearly in what is otherwise a comment text expressed in English or another human language, as in the earlier example
+
+ -- Add `sum' to account.
+
+
+which makes clear that sum is a software element, not the English word.
+
+There is also an Eiffel style to the choice of identifiers. For features, stay away from abbreviations and use full words. In multi-word identifiers, separate the constituents by underscores, as in LINKED_LIST and set_owner. The competing style of no separation but mid-identifier upper-case, as in linkedList or setOwner, is less readable and not in line with standard Eiffel practices.
+
+Features of reusable classes should use consistent names. A set of standard names -- put for the basic command to add or replace an element, count for the query that returns the number of element in a structure, item to access an element -- is part of the style rules, and used systematically in EiffelBase. Use them in your classes too.
+
+For local entities and formal arguments of routines, it is all right to use abbreviated names, since these identifiers only have a local scope, and choosing a loud name would give them too much pretense, leading to potential conflicts with features.
+
+The complete set of style rules applied by ISE is available on the web in both [http://archive.eiffel.com/doc/manuals/language/style/page.html HTML] and [http://archive.eiffel.com/doc/manuals/language/style/style.pdf PDF] forms. These rules are an integral part of the Eiffel method; in quality software, there is no such thing as a detail. Applying them systematically promotes consistency between projects in the Eiffel world, enhances reusability, and facilitates everyone's work.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-once-routines-and-shared-objects.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-once-routines-and-shared-objects.wiki
new file mode 100644
index 00000000..a6659d73
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-once-routines-and-shared-objects.wiki
@@ -0,0 +1,91 @@
+[[Property:title|ET: Once routines and shared objects]]
+[[Property:weight|-5]]
+[[Property:uuid|bc42c52f-c668-6036-9540-55d0f48b05cb]]
+==About ''once'' routines==
+
+The Eiffel's method obsession with extendibility, reusability and maintainability yields, as has been seen, modular and decentralized architectures, where inter-module coupling is limited to the strictly necessary, interfaces are clearly delimited, and all the temptations to introduce obscure dependencies, in particular global variables, have been removed. There is a need, however, to let various components of a system access common objects, without requiring their routines to pass these objects around as arguments (which would only be slightly better than global variables). For example various classes may need to perform output to a common "console window", represented by a shared object.
+
+Eiffel addresses this need through an original mechanism that also takes care of another important issue, poorly addressed by many design and programming approaches: initialization. The idea is simple: if instead of do the implementation of an effective routine starts with the keyword once, it will only be executed the first time the routine is called during a system execution (or, in a multi-threaded environment, the first time in each thread), regardless of what the caller was. Subsequent calls from the same caller or others will have no effect; if the routine is a function, it will always return the result computed by the first call -- object if an expanded type, reference otherwise.
+
+In the case of procedures, this provides a convenient initialization mechanism. A delicate problem in the absence of a once mechanism is how to provide the users of a library with a set of routines which they can call in any order, but which all need, to function properly, the guarantee that some context had been properly set up. Asking the library clients to precede the first call with a call to an initialization procedure setup is not only user-unfriendly but silly: in a well-engineered system we will want to check proper set-up in every one of the routines, and report an error if necessary; but then if we were able to detect improper set-up we might as well shut up and set up ourselves (by calling setup). This is not easy, however, since the object on which we call setup must itself be properly initialized, so we are only pushing the problem further. Making setup a once procedure solves it: we can simply include a call
+
+ setup
+
+
+at the beginning of each affected routine; the first one to come in will perform the needed initializations; subsequent calls will have, as desired, no effect.
+
+Once functions will give us shared objects. A common scheme is
+
+ console: WINDOW
+ -- Shared console window
+ once
+ create Result.make (...)
+ end
+
+
+Whatever client first calls this function will create the appropriate window and return a reference to it. Subsequent calls, from anywhere in the system, will return that same reference. The simplest way to make this function available to a set of classes is to include it in a class SHARED_STRUCTURES which the classes needing a set of related shared objects will simply inherit.
+
+For the classes using it, console, although a function, looks very much as if it were an attribute -- only one referring to a shared object.
+
+The "[[ET: Hello World|Hello World]]" system at the beginning of this discussion used an output instruction of the form io. put_string (some_string). This is another example of the general scheme illustrated by console. Feature io, declared in ANY and hence usable by all classes, is a once function that returns an object of type STANDARD_FILES (another Kernel Library class) providing access to basic input and output features, one of which is procedure put_string. Because basic input and output must all work on the same files, io should clearly be a once function, shared by all classes that need these mechanisms.
+
+==Adjusting once semantics with "once keys"==
+
+Sometimes it is helpful to adjust the way that once routines work, and that is done by applying '''once keys'''. For example, in multithreaded mode, it is reasonable most often for once routines to be executed once per ''thread'', versus once per ''process''. Therefore, the default once syntax, as shown in the example above, would behave as once per thread in multithreaded mode.
+
+Sometimes, however, it is useful in multithreaded mode to create an object which can be shared among threads. To do this, once per process is needed. To create effects like this which are outside the default behavior, we can use once "keys". In following example, a once key is used to specify that the once routine is executed only once per process:
+
+
+ shared_object: SOME_TYPE
+ -- An object that can be shared among threads
+ -- without being reinitialized.
+ once ("PROCESS")
+ create Result.make (...)
+ end
+
+
+Other valid once keys are "THREAD" and "OBJECT". Of course, "THREAD" ensures that the once routine executes only the first time it is called during the execution of a particular process thread. "OBJECT" is used when it is desirable to have a once routine executed on a once per object basis.
+
+
+{| border="2"
+|+ '''How once keys affect once routine execution'''
+! Once key ... !! Routine executed the first time it is called ...
+|-
+| PROCESS || During process execution
+|-
+| THREAD || During each process thread execution
+|-
+| OBJECT || By each instance
+|}
+
+
+THREAD is the default once key if none is specified (which for single threaded systems will have the same effect as PROCESS).
+
+The concept of once keys is open ended, so additional keys may become supported in the future to allow even finer grained control of once routine behavior.
+
+==Once per object internal implementation warning ==
+
+{{warning|As of version 6.6, once per object is implemented using 2 or 3 implementation attributes (these are used to store whether the once routine has already called or not, the eventual exception if any, and the result value if any).INTERNAL, the implementation attributes will be included in the field_count, and available through the INTERNAL features. note clause to specify a once key, as in the following example.
+
+
+ shared_object: SOME_TYPE
+ -- Obsolete syntax
+ -- An object that can be shared among threads
+ -- without being reinitialized.
+ note
+ once_status: global
+ once
+ create Result.make (...)
+ end
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-other-mechanisms.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-other-mechanisms.wiki
new file mode 100644
index 00000000..6149707e
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-other-mechanisms.wiki
@@ -0,0 +1,343 @@
+[[Property:title|ET: Other Mechanisms]]
+[[Property:weight|-4]]
+[[Property:uuid|c0a01664-194c-4e84-0517-8e7c1ca61dec]]
+We now examine a few important mechanisms that complement the preceding picture.
+
+
+==Manifest constants==
+
+Sometimes we want to provide in software text a self-denoting value of a particular type. In Eiffel this is what we call a '''manifest constant'''. For example, if we are searching an indexed structure, we might have an integer variable that we would want to initialize to reference the first item in the structure:
+
+
+ my_index := 1
+
+
+In this case we used a manifest constant, 1, to provide an initial value for my_index. In particular, this is a manifest integer.
+
+Eiffel also supports [[Eiffel Programming Language Syntax#Manifest constants|manifest constants]] for real (and double) numbers (ex: 3.1415), boolean values (ex: True, False), and characters (ex: 'A', with [[Eiffel programming language syntax#Special characters|special characters]] expressed using a percent sign as in '%N' for new line, '%B' for backspace, '%"' for double quote, and '%U' for null).
+
+Manifest constants are also available for strings, using double quotes as in: "Hello world!". As with character constants, special characters are denoted using the % codes.
+
+===Verbatim strings===
+
+You may occasionally have a need for a manifest string that represents a multi-line formatted string. In Eiffel we call this type of manifest string a '''verbatim string''', and there is a special syntax for specifying verbatim strings in Eiffel code. Verbatim strings are either '''aligned''' or '''non-aligned'''. Aligned verbatim strings will automatically be adjusted so that their leftmost line (the line with text characters closest to the left margin) contains no "white space" to the left of the first text character. For non-aligned verbatim strings, the white space is left untouched. You use a slightly different way of specifying each type of string. For example, this aligned verbatim string:
+
+
+ my_aligned_string: STRING =
+ "[
+ Thrice hail the still unconquered King of Song!
+ For all adore and love the Master Art
+ That reareth his throne in temple of the heart;
+ And smiteth chords of passion full and strong
+ Till music sweet allures the sorrowing throng!
+ ]"
+
+
+will print like this:
+
+
+ Thrice hail the still unconquered King of Song!
+ For all adore and love the Master Art
+ That reareth his throne in temple of the heart;
+And smiteth chords of passion full and strong
+ Till music sweet allures the sorrowing throng!
+
+
+The same string, declared as a non-aligned verbatim string:
+
+
+ my_non_aligned_string: STRING =
+ "{
+ Thrice hail the still unconquered King of Song!
+ For all adore and love the Master Art
+ That reareth his throne in temple of the heart;
+ And smiteth chords of passion full and strong
+ Till music sweet allures the sorrowing throng!
+ }"
+
+
+will print like this:
+
+
+ Thrice hail the still unconquered King of Song!
+ For all adore and love the Master Art
+ That reareth his throne in temple of the heart;
+ And smiteth chords of passion full and strong
+ Till music sweet allures the sorrowing throng!
+
+
+The difference in declaration is that the aligned verbatim string uses as its "opener" the double-quote plus bracket combination, " "[ ", and the bracket plus double quote, " ]" ", as its "closer". The non-aligned verbatim string uses braces, " { " and " } " instead of the bracket.
+
+The syntax for specifying verbatim strings allows an option for the situation in which the specified string might conflict with the "closer". You can include a simple string between the double quote and the bracket on each end of the verbatim string to guarantee uniqueness. Here's our aligned verbatim string with the simple string " *? " inserted in the opener and closer:
+
+
+ my_aligned_string: STRING =
+ "*?[
+ Thrice hail the still unconquered King of Song!
+ For all adore and love the Master Art
+ That reareth his throne in temple of the heart;
+ And smiteth chords of passion full and strong
+ Till music sweet allures the sorrowing throng!
+ ]*?"
+
+
+
+==Constant attributes==
+
+The attributes studied earlier were variable: each represents a field present in each instance of the class and changeable by its routines.
+
+It is also possible to declare '''constant attributes''', as in
+
+ Solar_system_planet_count: INTEGER = 8
+
+
+These will have the same value for every instance and hence do not need to occupy any space in objects at execution time. (In other approaches similar needs would be addressed by symbolic constants, as in Pascal or Ada, or macros, as in C.)
+
+What comes after the = is a manifest constant. So you can declare a constant attribute for any type for which there is a manifest constant.
+
+
+==Obsolete features and classes==
+
+One of the conditions for producing truly great reusable software is to recognize that although you should try to get everything right the first time around you won't always succeed. But if "good enough" may be good enough for application software, it's not good enough, in the long term, for reusable software. The aim is to get ever closer to the asymptote of perfection. If you find a better way, you must implement it. The activity of generalization, discussed as part of the lifecycle, doesn't stop at the first release of a reusable library.
+
+This raises the issue of backward compatibility: how to move forward with a better design, without compromising existing applications that used the previous version?
+
+The notion of obsolete class and feature helps address this issue. By declaring a feature as obsolete, using the syntax
+
+ enter (i: INTEGER; x: G)
+ obsolete
+ "Use ` put (x, i)' instead "
+ require
+ ...
+ do
+ put (x, i)
+ end
+
+
+you state that you are now advising against using it, and suggest a replacement through the message that follows the keyword obsolete, a mere string. The obsolete feature is still there, however; using it will cause no other harm than a warning message when someone compiles a system that includes a call to it. Indeed, you don't want to hold a gun to your client authors' forehead (''"Upgrade now or die !"''); but you do want to let them know that there is a new version and that they should upgrade at their leisure.
+
+Besides routines, you may also mark classes as obsolete.
+
+The example above is a historical one, involving an early change of interface for the EiffelBase library class ARRAY; the change affected both the feature's name, with a new name ensuring better consistency with other classes, and the order of arguments, again for consistency. It shows the recommended style for using obsolete: obsolete keyword is critical to ensure the harmonious long-term development of ambitious reusable software.
+
+
+==Creation variants==
+
+The basic forms of creation instruction, and the one most commonly used, are the two illustrated earlier ( [[ET: The Dynamic Structure: Execution Model#Creating_and_initializing_objects|"Creating and initializing objects"]] ):
+
+ create x.make (2000)
+ create x
+
+
+the first one if the corresponding class has a create clause, the second one if not. In either form you may include a type name in braces, as in
+
+ create {SAVINGS_ACCOUNT} x.make (2000)
+
+
+which is valid only if the type listed, here SAVINGS_ACCOUNT, conforms to the type of x, assumed here to be ACCOUNT. This avoids introducing a local entity, as in
+
+ local
+ xs: SAVINGS_ACCOUNT
+ do
+ create xs.make (2000)
+ x := xs
+ ...
+
+
+and has exactly the same effect. Another variant is the '''creation expression''', which always lists the type, but returns a value instead of being an instruction. It is useful in the following context:
+
+ some_routine (create {ACCOUNT}.make (2000))
+
+
+which you may again view as an abbreviation for a more verbose form that would need a local entity, using a creation instruction:
+
+ local
+ x: ACCOUNT
+ do
+ create x.make (2000)
+ some_routine (x)
+ ...
+
+
+Unlike creation instructions, creation expressions must always list the type explicitly, {ACCOUNT} in the example. They are useful in the case shown: creating an object that only serves as an argument to be passed to a routine. If you need to retain access to the object through an entity, the instruction create x ... is the appropriate construct.
+
+The creation mechanism gets an extra degree of flexibility through the notion of default_create. The simplest form of creation instruction, create x without an explicit creation procedure, is actually an abbreviation for create x.default_create, where default_create is a procedure defined in class ANY to do nothing. By redefining default_create in one of your classes, you can ensure that create x will take care of non-default initialization (and ensure the invariant if needed). When a class has no create clause, it's considered to have one that lists only default_create. If you want to allow create x as well as the use of some explicit creation procedures, simply list default_create along with these procedures in the create clause. To disallow creation altogether, include an empty create clause, although this technique is seldom needed since most non-creatable classes are deferred, and one can't instantiate a deferred class.
+
+One final twist is the mechanism for creating instances of formal generic parameters. For x of type G in a class C [G], it wouldn't be safe to allow create x, since G stands for many possible types, all of which may have their own creation procedures. To allow such creation instructions, we rely on constrained genericity. You may declare a class as
+
+ [G -> T create cp end]
+
+
+to make G constrained by T, as we learned before, and specify that any actual generic parameter must have cp among its creation procedures. Then it's permitted to use create x.cp, with arguments if required by cp, since it is guaranteed to be safe. The mechanism is very general since you may use ANY for T and default_create for cp. The only requirement on cp is that it must be a procedure of T, not necessarily a creation procedure; this permits using the mechanism even if T is deferred, a common occurrence. It's only descendants of T that must make cp a creation procedure, by listing it in the create clause, if they want to serve as actual generic parameters for C.
+
+
+==Non-object calls==
+
+The Eiffel model for object-oriented computation involves the application of some feature f to some object x, and possibly passing arguments a:
+
+
+ x.f (a)
+
+
+This type of feature call is known as an '''object call''' because it applies the feature to a target object, in this case x. However, under certain circumstances we may apply a feature of a class in a fashion that does not involve a target object. This type of call is a '''non-object call'''. In place of the target object, the syntax of the non-object call uses the type on which the feature can be found.
+
+
+ circumference := radius * 2.0 * {MATH_CONST}.Pi
+
+
+In the sample above, the call to feature {MATH_CONST}.Pi is a non-object call. This case illustrates one of the primary uses of non-object calls: constants. The library class MATH_CONST contains commonly used mathematical constants. Non-object calls make it possible to use the constants in MATH_CONST without having to create an instance of MATH_CONST or inherit from it.
+
+The other primary use is for external features. One example is when we use Microsoft .NET classes from Eiffel code and have to access mechanisms for which there is no direct analog in Eiffel. Microsoft .NET supports so-called "static" methods and enumeration types. To access these, we use non-object calls. In the example below, a non-object call is used to access the enumeration CreateNew from the .NET enumeration type System.IO.FileMode.
+
+
+ create my_file_stream.make ("my_file.txt", {FILE_MODE}.create_new)
+
+
+The validity of a non-object call is restricted in ways that mirror these primary uses. That is, any feature called in a non-object call must be either a constant attribute or an external feature. See the [[ECMA Standard 367|ISO/ECMA Eiffel standard document]] for additional details.
+
+
+==Convertibility==
+
+It is useful at times to designate that instances of one type can be created through the controlled conversion of instances of some other type. This can be done through a safe Eiffel type conversion mechanism called '''convertibility'''.
+
+Convertibility is useful when refactoring, moving from one design to another, or, as you will see in the example, accommodating external technologies over which we have no control.
+
+
+{{Definition|Convertibility: converts to, converts from|
+ my_string: STRING_8 -- Native Eiffel string
+ my_system_string: SYSTEM_STRING -- Native Microsoft .Net string
+
+ …
+
+ my_string := my_system_string
+
+
+In the snippet above, we have attributes declared of type STRING_8 and SYSTEM_STRING.
+
+We know that if we have a attribute of type STRING_8 that we can make a direct assignment of a .Net type of string (that is, the .Net type System.String which we see as class SYSTEM_STRING) to our STRING_8 attribute.
+
+We know also that SYSTEM_STRING does not conform to STRING_8, so according to the definition of [[ET: Instructions#Assignment and attachment|compatibility]], this must happen through conversion.
+
+Therefore SYSTEM_STRING converts to STRING_8. And according to the definition above this means that either:
+
+# Class SYSTEM_STRING has a conversion query listing STRING_8 as a conversion type, or
+# Class STRING_8 has a conversion procedure listing SYSTEM_STRING as a conversion type
+
+In this case STRING_8 has a conversion procedure for objects of type SYSTEM_STRING. Conversion procedures are always [[ET: The Dynamic Structure: Execution Model#Creating and initializing objects|creation procedures]]. So they appear in both the create and the convert parts of the class.
+
+
+ class STRING_8
+ …
+ create
+ make_from_cil
+ …
+ convert
+ make_from_cil ({SYSTEM_STRING})
+ …
+
+
+We won't show the implementation of the conversion procedure, but as you can imagine, it initializes its target with the content of its argument.
+
+Because of convertibility, this code:
+
+
+ my_string := my_system_string
+
+
+is equivalent to:
+
+
+ create my_string.make_from_cil (my_system_string)
+
+
+So, we've seen how SYSTEM_STRING converts to STRING_8. But, in the context of our example, we could also do this:
+
+
+ my_system_string := my_string
+
+
+Which means that STRING_8 converts to SYSTEM_STRING. The convert part of class STRING_8 also has a conversion query listing SYSTEM_STRING as a conversion type:
+
+
+ class STRING_8
+ …
+ create
+ make_from_cil
+ …
+ convert
+ make_from_cil ({SYSTEM_STRING})
+ to_cil: {SYSTEM_STRING}
+ …
+
+
+Because of convertibility, this code:
+
+
+ my_system_string := my_string
+
+
+is equivalent to:
+
+
+ my_system_string := my_string.to_cil
+
+
+You should bear in mind that assignments are not the only situation in which conversions take place. Convertibility works for other types of attachments as well. For example, if a routine calls for an argument of type SYSTEM_STRING, and you supply an actual argument of type STRING_8, this constitutes an attachment, and the conversion from STRING to SYSTEM_STRING will occur.
+
+
+==Tuple types==
+
+The study of genericity described arrays. Another common kind of container objects bears some resemblance to arrays: sequences, or "tuples", of elements of specified types. The difference is that all elements of an array were of the same type, or a conforming one, whereas for tuples you will specify the types we want for each relevant element. A typical tuple type is of the form
+
+ TUPLE [X, Y, Z]
+
+
+denoting a tuple of at least three elements, such that the type of the first conforms to X, the second to Y, and the third to Z.
+
+You may list any number of types in brackets, including none at all: TUPLE, with no types in brackets, denotes tuples of arbitrary length.
+
+{{info|The syntax, with brackets, is intentionally reminiscent of generic classes, but TUPLE is a reserved word, not the name of a class; making it a class would not work since a generic class has a fixed number of generic parameters. You may indeed use TUPLE to obtain the effect of a generic class with a variable number of parameters. }}
+
+To write the tuples themselves -- the sequences of elements, instances of a tuple type -- you will also use square brackets; for example
+
+ [x1, y1, z1]
+
+
+with x1 of type X and so on is a tuple of type TUPLE [X, Y, Z].
+
+The definition of tuple types states that TUPLE [X1 ... Xn] denotes sequences of at least n elements, of which the first n have types respectively conforming to X1, ..., Xn. Such a sequence may have more than n elements.
+
+Features available on tuple types include count: INTEGER, yielding the number of elements in a tuple, item (i: INTEGER): ANY which returns the i-th element, and put which replaces an element.
+
+Tuples are appropriate when these are the only operations you need, that is to say, you are using sequences with no further structure or properties. Tuples give you "anonymous classes" with predefined features count, item and put. A typical example is a general-purpose output procedure that takes an arbitrary sequence of values, of arbitrary types, and prints them. It may simply take an argument of type TUPLE, so that clients can call it under the form
+
+ write ([your_integer, your_real, your_account])
+
+
+As soon as you need a type with more specific features, you should define a class.
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-overview.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-overview.wiki
new file mode 100644
index 00000000..805ddf19
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/et-overview.wiki
@@ -0,0 +1,24 @@
+[[Property:title|ET: Overview]]
+[[Property:weight|-15]]
+[[Property:uuid|0eaddff9-5d72-87fc-663a-2fc8a9152c25]]
+Eiffel is a method and language for the efficient description and development of quality systems.
+
+As a language, Eiffel is more than a programming language. It covers not just programming in the restricted sense of implementation but the whole spectrum of software development: B depends on a class A if it is either a '''client''' of A, that is to say uses objects of type A, or an '''heir''' of A, that is to say extends or specializes A. (These two relations, client and inheritance, are covered below.)
+
+==Classes==
+
+The notion of class is central to the Eiffel approach. A class is the description of a type of run-time data structures (objects), characterized by common operations features) and properties. Examples of classes include:
+* In a banking system, a class ACCOUNT may have features such as deposit, adding a certain amount to an account, all_deposits, yielding the list of deposits since the account's opening, and balance, yielding the current balance, with properties stating that deposit must add an element to the all_deposits list and update balance by adding the sum deposited, and that the current value of balance must be consistent with the lists of deposits and withdrawals.
+* A class COMMAND in an interactive system of any kind may have features such as execute and undo , as well as a feature undoable which indicates whether a command can be undone, with the property that undo is only applicable if undoable yields the value true.
+* A class LINKED_LIST may have features such as put, which adds an element to a list, and count, yielding the number of elements in the list, with properties stating that put increases count by one and that count is always non-negative.
+
+We may characterize the first of these examples as an analysis class, directly modeling objects from the application domain; the second one as a design class, describing a high-level solution; and the third as an implementation class, reused whenever possible from a library such as EiffelBase. In Eiffel, however, there is no strict distinction between these categories; it is part of the approaches seamlessness that the same notion of class, and the associated concepts, may be used at all levels of the software development process.
+
+==Class relations==
+
+Two relations may exist between classes:
+* You can define a class C as a '''client''' of a class A to enable the features of C to rely on objects of type A.
+* You may define a class B as an '''heir''' of a class A to provide B with all the features and properties of A, letting B add its own features and properties and modify some of the inherited features if appropriate.
+
+If C is a client of A, A is a '''supplier''' of C. If B is an heir of A, A is a '''parent''' of B. A '''descendant''' of A is either A itself or, recursively, a descendant of an heir of A; in more informal terms a descendant is a direct or indirect heir, or the class itself. To exclude A itself we talk of '''proper descendant'''. In the reverse direction the terms are '''ancestor''' and '''proper ancestor'''.
+
+The client relation can be cyclic; an example involving a cycle would be classes PERSON and HOUSE, modeling the corresponding informal everyday "object" types and expressing the properties that every person has a home and every home has an architect. The inheritance (heir) relation may not include any cycle.
+
+In modeling terms, client roughly represents the relation "has" and heir roughly represents "is". For example we may use Eiffel classes to model a certain system and express that every child has a birth date (client relation) and is a person (inheritance).
+
+Distinctive of Eiffel is the rule that classes can only be connected through these two relations. This excludes the behind-the-scenes dependencies often found in other approaches, such as the use of global variables, which jeopardize the modularity of a system. Only through a strict policy of limited and explicit inter-class relations can we achieve the goals of reusability and extendibility.
+
+==The global inheritance structure==
+
+An Eiffel class that you write does not come into a vacuum but fits in a preordained structure, shown in the figure and involving two library classes: ANY and NONE.
+
+
+[[Image:tutorial-4]]
+
+
+Any class that does not explicitly inherit from another is considered to inherit from ANY, so that every class is a descendant, direct or indirect, of ANY. ANY introduces a number of general-purpose features useful everywhere, such as copying, cloning and equality testing operations (see [[ET: The Dynamic Structure: Execution Model|The Dynamic Structure: Execution Model]] ) and default input-output. The procedure print used in the first version of our "[[ET: Hello World|Hello World]]" comes from ANY.
+
+NONE inherits from any class that has no explicit heir. Since inheritance has no cycles, NONE cannot have proper descendants. This makes it useful, as we will see, to specify non-exported features, and to denote the type of void values. Unlike ANY, class NONE doesn't have an actual class text; instead, it's a convenient fiction.
+
+==Clusters==
+
+Classes are the only form of module in Eiffel. As will be explained in more detail, they also provide the basis for the only form of type. This module-type identification is at the heart of object technology and of the fundamental simplicity of the Eiffel method.
+
+Above classes, you will find the concept of cluster. A cluster is a group of related classes. Clusters are a property of the method, enabling managers to organize the development into teams. As we have already seen (in [[ET: The Software Process in Eiffel|The Software Process in Eiffel]] ) they also play a central role in the lifecycle model. Clusters are an organizational concept, not a form of module, and do not require an Eiffel programming language construct.
+
+==External software==
+
+The subsequent sections will show how to write Eiffel classes with their features. In an Eiffel system, however, not everything has to be written in Eiffel: some features may be '''external''' , coming from languages such as C, C++, Java, C# Fortran and others. For example a feature declaration may appear (in lieu of the forms seen later) as
+
+ file_status (filedesc: INTEGER): INTEGER
+ -- Status indicator for filedesc
+ external
+ "C" alias "_fstat"
+ end
+
+
+to indicate that it is actually an encapsulation of a C function whose original name is _fstat. The alias clause is optional, but here it is needed because the C name, starting with an underscore, is not valid as an Eiffel identifier.
+
+Similar syntax exists to interface with C++ classes. EiffelStudio includes a tool called Legacy++ which will automatically produce, from a C++ class, an Eiffel class that encapsulates its facilities, making them available to the rest of the Eiffel software as bona fide Eiffel features.
+
+These mechanisms illustrate one of the roles of Eiffel: as an system architecturing and software composition tool, used at the highest level to produce systems with robust, flexible structures ready for extendibility, reusability and maintainability. In these structures not everything must be written in the Eiffel programming language: existing software elements and library components can play their part, with the structuring capabilities of Eiffel (classes, information hiding, inheritance, clusters, contracts and other techniques seen in this presentation) serving as the overall wrapping mechanism.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/index.wiki b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/index.wiki
new file mode 100644
index 00000000..e33b5c1d
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/eiffel-tutorial-et/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|An Eiffel Tutorial (ET)]]
+[[Property:link_title|Tutorial]]
+[[Property:weight|2]]
+[[Property:uuid|4dbc41e2-ecfc-8c50-9288-fce30f4abd90]]
+This Eiffel Tutorial (ET) should provide you with a broad understanding of what Eiffel is all about and why it is different from other technologies. Still more detail is available in [[Object-Oriented Software Construction, 2nd Edition]].
+
diff --git a/documentation/18.11/eiffel/Tutorials/index.wiki b/documentation/18.11/eiffel/Tutorials/index.wiki
new file mode 100644
index 00000000..62bc013d
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/index.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Eiffel Tutorials]]
+[[Property:link_title|Tutorials]]
+[[Property:weight|2]]
+[[Property:uuid|f443f10d-9dbc-4d6b-b9fb-c59af76abde9]]
+
+== Tutorials about Eiffel ==
+
+* [[Invitation to Eiffel (I2E)]]
+* [[An Eiffel Tutorial (ET)]]
+* [https://webcourses.inf.ethz.ch/se_courses/edx/eiffel_tutorial/] from Marco Piccioni
+* ...
+
+{{Note|Please, don't hesitate to comment this page to add link to other existing tutorials on the web.This list is for now far from being complete.}}
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-classes.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-classes.wiki
new file mode 100644
index 00000000..51bd61cc
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-classes.wiki
@@ -0,0 +1,110 @@
+[[Property:title|I2E: Classes]]
+[[Property:weight|-11]]
+[[Property:uuid|218bead9-428e-f61d-1e45-7eea4291d895]]
+A class, it was said above, is an implementation of an abstract data type. This means that it describes a set of run-time objects, characterized by the ''' features''' (operations) applicable to them, and by the formal properties of these features.
+
+Such objects are called the '''direct instances''' of the class. Classes and objects should not be confused: "class" is a compile-time notion, whereas objects only exist at run time. This is similar to the difference that exists in classical programming between a program and one execution of that program, or between a type and a run-time value of that type.
+
+{{info|"Object-Oriented" is a misnomer; "Class-Oriented Analysis, Design and Programming" would be a more accurate description of the method. }}
+
+To see what a class looks like, let us look at a simple example, ACCOUNT, which describes bank accounts. But before exploring the class itself it is useful to study how it may be used by other classes, called its '''clients'''.
+
+A class X may become a client of ACCOUNT by declaring one or more '''entities''' of type ACCOUNT. Such a declaration is of the form:
+acc: ACCOUNT
+
+The term "entity" generalizes the more common notion of "variable". An entity declared of a reference type, such as acc, may at any time during execution become " '''attached to''' " an object; the type rules imply that this object must be a direct instance of ACCOUNT -- or, as seen below, of a "descendant" of that class.
+
+[[Image:invitation-2]]
+
+An entity is said to be void if it is not attached to any object. By default, entities are void at initialization. To obtain objects at run-time, a routine r appearing in the client class X may use a '''creation instruction''' of the form
+
+
+ create acc
+
+
+which creates a new direct instance of ACCOUNT, attaches acc to that instance, and initializes all its fields to default values. A variant of this notation, studied below, makes it possible to override the default initializations.
+
+Once the client has attached acc to an object, it may call on this object the features defined in class ACCOUNT. Here is an extract with some feature calls using acc as their target:
+
+ acc.open ("Jill")
+ acc.deposit (5000)
+ if acc.may_withdraw (3000) then
+ acc.withdraw (3000)
+ print (acc.balance)
+ end
+
+
+These feature calls use dot notation, of the form target_name.feature_name, possibly followed by a list of arguments in parentheses. Features are of two kinds:
+* '''Routines''', such as open, deposit, may_withdraw, withdraw, represent computations applicable to instances of the class.
+* '''Attributes''' represent data items associated with these instances.
+
+Routines are further divided into '''procedures''' (commands, which do not return a value) and '''functions''' (queries, returning a value). Here may_withdraw is a function returning a boolean; the other three-routines called are procedures.
+
+{{info|A note on syntax: you may separate instructions by semicolons, and indeed you should when, as on the next-to-last line of the example, two or more instructions appear on a line. But the language's syntax has been designed so that the semicolon is almost always optional, regardless of the layout. Indeed the practice is to omit it between instructions or declarations on separate lines, as this results in lighter, clearer software texts. }}
+
+In class ACCOUNT, is feature balance an attribute, or is it a function with no argument? The above extract of the client class X doesn't say, and this ambiguity is intentional. A client of ACCOUNT must not need to know how class ACCOUNT delivers an account's balance when requested: by looking up a field present in each account object, or by calling a function that computes the balance from other fields. Choosing between these techniques is the business of class ACCOUNT, not anybody else's. Because such implementation choices are often changed over the lifetime of a project, it is essential to protect clients against their effects. This is known as the '''Uniform Access Principle''', stating that the choice between representing a property through memory (an attribute) or through an algorithm (function) shall not affect how clients use it.
+
+So much for how client classes will typically use ACCOUNT. Below is a first sketch of how class ACCOUNT itself might look. Line segments beginning with -- are comments. The class includes two feature clauses, introducing its features. The first begins with just the keyword feature, without further qualification; this means that the features declared in this clause are available (or "exported") to all clients of the class. The second clause is introduced by feature {NONE} to indicate that the feature that follows, called add, is available to no client. What appears between the braces is a list of client classes to which the corresponding features are available; NONE is a special class of the Kernel Library, which has no instances, so that add is in effect a secret feature, available only locally to the other routines of class ACCOUNT. So in a client class such as X, the call acc.add ( -3000 ) would be invalid.
+
+class
+ ACCOUNT
+
+feature
+
+ balance: INTEGER
+ owner: PERSON
+ minimum_balance: INTEGER = 1000
+
+ open (who: PERSON)
+ -- Assign the account to owner who.
+ do
+ owner := who
+ end
+
+ deposit (sum: INTEGER)
+ -- Deposit sum into the account.
+ do
+ add (sum)
+ end
+
+ withdraw (sum: INTEGER)
+ -- Withdraw sum from the account.
+ do
+ add (-sum)
+ end
+
+ may_withdraw (sum: INTEGER): BOOLEAN
+ -- Is there enough money to withdraw sum?
+ do
+ Result := (balance >= sum + minimum_balance)
+ end
+
+feature {NONE}
+
+ add (sum: INTEGER)
+ -- Add sum to the balance
+ do
+ balance := balance + sum
+ end
+
+end -- ACCOUNT
+
+
+Let us examine the features in sequence. The do ... end distinguishes routines from attributes. So here the class has implemented balance as an attribute, although, as noted, a function would also have been acceptable. Feature owner is also an attribute.
+
+The language definition guarantees automatic initialization, so that the initial balance of an account object will be zero after a creation instruction. Each type has a default initial value: zero for INTEGER and REAL, false for BOOLEAN, null character for CHARACTER, and a void reference for reference types. The class designer may also provide clients with different initialization options, as will be seen below in a revised version of this example.
+
+The other public features, withdraw, deposit, open, and may_withdraw are straight-forward routines. The special entity Result, used in may_withdraw, denotes the function result; it is initialized on function entry to the default value of the function's result type. You may only use Result in functions.
+
+The secret procedure add serves for the implementation of the public procedures deposit and withdraw; the designer of ACCOUNT judged it too general to be exported by itself. The clause "= 1000" introduces minimum_balance as a constant attribute, which will not occupy any space in instances of the class; in contrast, every instance has a field for every non-constant attribute such as balance.
+
+In Eiffel's object-oriented programming style any operation is relative to a certain object. A client invoking the operation specifies this object by writing the corresponding entity on the left of the dot, as acc in acc.open ("Jill"). Within the class, however, the "current" instance to which operations apply usually remains implicit, so that unqualified feature names, such as owner in procedure open or add in deposit, mean "the owner attribute or add routine relative to the current instance".
+
+If you need to denote the current object explicitly, you may use the special entity Current. For example the unqualified occurrences of add appearing in the class text above are equivalent to Current. add.
+
+In some cases, infix or prefix notation will be more convenient than dot notation. For example, if a class VECTOR offers an addition routine, most people will feel more comfortable with calls of the form v + w than with the dot-notation call v.plus (w). To make this possible it suffices to give the routine a "+" alias. The operation is still a normal routine call which can be invoked with either the infix form or the dot-notation.
+
+The above simple example has shown the basic structuring mechanism of the language: the class. A class describes objects accessible to clients through an official interface comprising some of the class features. Features are implemented as attributes or routines; the implementation of exported features may rely on other, secret ones.
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-combining-genericity-and-inheritance.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-combining-genericity-and-inheritance.wiki
new file mode 100644
index 00000000..2b15de29
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-combining-genericity-and-inheritance.wiki
@@ -0,0 +1,34 @@
+[[Property:title|I2E: Combining Genericity and Inheritance]]
+[[Property:weight|-3]]
+[[Property:uuid|912e4c38-9add-e478-59c3-5c10aa75d784]]
+Genericity and inheritance, the two fundamental mechanisms for generalizing classes, may be combined in two fruitful ways.
+
+The first technique yields '''polymorphic data structures'''. Assume that in the generic class LIST [G] the insertion procedure put has a formal argument of type G, representing the element to be inserted. Then with a declaration such as
+
+ pl: LIST [POLYGON]
+
+the type rules imply that in a call pl.put (p) the permitted types for the argument p include not just POLYGON, but also RECTANGLE (an heir of POLYGON) or any other type conforming to POLYGON through inheritance.
+
+The basic conformance requirement used here is the inheritance-based type compatibility rule: V conforms to T if V is a descendant of T.
+
+Structures such as pl may contain objects of different types, hence the name "polymorphic data structure". Such polymorphism is, again, made safe by the type rules: by choosing an actual generic parameter ( POLYGON in the example) based higher or lower in the inheritance graph, you extend or restrict the permissible types of objects in pl. A fully general list would be declared as
+
+ LIST [ANY]
+
+where ANY, a Kernel Library class, is automatically an ancestor of any class that you may write.
+
+The other mechanism for combining genericity and inheritance is '''constrained genericity'''. By indicating a class name after a formal generic parameter, as in
+
+ VECTOR [T -> NUMERIC]
+
+you express that only descendants of that class (here NUMERIC) may be used as the corresponding actual generic parameters. This makes it possible to use the corresponding operations. Here, for example, class VECTOR may define a routine infix "+" for adding vectors, based on the corresponding routine from NUMERIC for adding vector elements. Then by making VECTOR itself inherit from NUMERIC, you ensure that it satisfies its own generic constraint and enable the definition of types such as VECTOR [VECTOR [T]] .
+
+As you have perhaps guessed, unconstrained genericity, as in LIST [G] , may be viewed as an abbreviation for genericity constrained by ANY, as in
+
+ LIST [G -> ANY]
+
+Something else you may have guessed: if ANY, introduced in this session, is the top of the inheritance structure -- providing all classes with universal features such as equal to compare arbitrary objects and twin to duplicate objects -- then NONE, seen earlier in the notation feature {NONE}, is its bottom. NONE indeed conceptually inherits from all other classes. NONE is, among other things, the perceived type of the Void keyword which represents a void reference.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-deferred-classes-and-seamless-development.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-deferred-classes-and-seamless-development.wiki
new file mode 100644
index 00000000..306c1008
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-deferred-classes-and-seamless-development.wiki
@@ -0,0 +1,64 @@
+[[Property:title|I2E: Deferred Classes and Seamless Development]]
+[[Property:weight|-2]]
+[[Property:uuid|b3264238-f160-a6fc-0b03-adcd80b1f55a]]
+The inheritance mechanism includes one more major notion: deferred features and classes.
+
+Declaring a feature f as deferred in a class C expresses that there is no default implementation of f in C; such implementations will appear in eventual descendants of C. A class that has one or more deferred routines is itself said to be deferred. A non-deferred routine or class -- like all those seen until now -- is said to be '''effective'''.
+
+For example, a system used by a Department of Motor Vehicles to register vehicles might include a class of the form
+
+deferred class
+ VEHICLE
+
+feature
+
+ dues_paid (year: INTEGER): BOOLEAN
+ do ... end
+
+ valid_plate (year: INTEGER): BOOLEAN
+ do ... end
+
+ register (year: INTEGER)
+ -- Register vehicle for year.
+ require
+ dues_paid (year)
+ deferred
+ ensure
+ valid_plate (year)
+ end
+
+ ... Other features, deferred or effective ...
+
+end -- VEHICLE
+
+
+This example assumes that no single registration algorithm applies to all kinds of vehicle; passenger cars, motorcycles, trucks etc. are all registered differently. But the same precondition and postcondition apply in all cases. The solution is to treat register as a deferred routine, making VEHICLE a deferred class. Descendants of class VEHICLE, such as CAR or TRUCK, effect this routine, that is to say, give effective versions. An effecting is similar to a redefinition; only here there is no effective definition in the original class, just a specification in the form of a deferred routine. The term '''redeclaration''' covers both redefinition and effecting.
+
+
+[[Image:invitation-5]]
+
+
+Whereas an effective class described an implementation of an abstract data types, a deferred class describes a set of possible implementations. You may not instantiate a deferred class: create v is invalid if v is declared of type VEHICLE. But you may assign to v a reference to an instance of an effective descendant of VEHICLE. For example, assuming CAR and TRUCK provide effective definitions for all deferred routines of VEHICLE, the following will be valid:
+
+ v: VEHICLE
+ c: CAR
+ t: TRUCK
+ ...
+ create c
+ create t
+ ...
+ if "Some test" then
+ v := c
+ else
+ v := t
+ end
+ v.register (2008)
+
+This example fully exploits polymorphism: depending on the outcome of "Some test", v will be treated as a car or a truck, and the appropriate registration algorithm will be applied. Also, "Some test" may depend on some event whose outcome is impossible to predict until run-time, for example the user clicking with the mouse to select one among several vehicle icons displayed on the screen.
+
+Deferred classes are particularly useful at the design stage. The first version of a module may be a deferred class, which will later be refined into one or more effective classes. Eiffel's Design by Contract mechanisms are essential here: you may a precondition and a postcondition with a routine even though it is a deferred routine (as with register above), and an invariant with a class even though it is a deferred class. This enables you, as a designer, to attach precise semantics to a module at the design stage long before you will make any implementation choices.
+
+Beyond design and implementation, these techniques extend to the earliest stage of development, analysis. Deferred classes written at that stage describe not software objects, but objects from the external world being modeled -- documents, airplanes, investments. Here again the presence of contracts to express constraints, and the language's other structuring facilities, provide an attractive combination.
+
+Eiffel appears here in its full role of a lifecycle approach, covering areas traditionally considered separate: program implementation, the traditional province of development environments; system modeling and architecture, the traditional province of CASE tools based on UML or similar notations disconnected from the rest of the lifecycle. Eiffel instead emphasizes the fundamental unity of the software process and the usefulness of a single set of notations, concepts and tools applicable throughout. Such a seamless approach is indispensable to support the inevitable reversals that occur during the process of building software, such as detecting at implementation time a problem that leads to a change in the system's functionality, set at analysis time. The use of separate tools and notations, such as UML on one side and a programming language on the other, makes such round-trips difficult at best and often leads to monolithic, hard-to-change software. Eiffel lets you focus on the issues, without interposing artificial barriers between different software development activities. You'll use the fundamental problem-solving techniques -- data abstraction through classes, precise specification through contracts, modularity through information hiding, rational organization through inheritance, decentralized architecture through dynamic binding, parameterization of the solution through genericity, reusability through all these techniques -- all along; only the level of abstraction changes.
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-design-contract-and-assertions.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-design-contract-and-assertions.wiki
new file mode 100644
index 00000000..53f3af4a
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-design-contract-and-assertions.wiki
@@ -0,0 +1,150 @@
+[[Property:title|I2E: Design by Contract and Assertions]]
+[[Property:weight|-9]]
+[[Property:uuid|f563aa75-3a5a-5110-b4f1-07da5448f668]]
+If classes are to deserve their definition as abstract data type implementations, they must be known not just by the available operations, but also by the formal properties of these operations, which did not yet appear in the preceding example.
+
+==The role of assertions==
+
+Eiffel encourages software developers to express formal properties of classes by writing '''assertions''', which may in particular appear in the following roles: ACCOUNT may wish to permit a withdrawal operation only if it keeps the account's balance at or above the minimum. Preconditions are introduced by the keyword require.
+* Routine '''postconditions''', introduced by the keyword ensure, express conditions that the routine (the supplier) guarantees on return, if the precondition was satisfied on entry.
+* A class '''invariant''' must be satisfied by every instance of the class whenever the instance is externally accessible: after creation, and after any call to an exported routine of the class. The invariant appears in a clause introduced by the keyword invariant, and represents a general consistency constraint imposed on all routines of the class.
+
+
+With appropriate assertions, the class ACCOUNT becomes:
+
+class
+ ACCOUNT
+
+create
+ make
+
+feature
+ ... Attributes as before:
+ balance , minimum_balance , owner , open ...
+
+ deposit (sum: INTEGER)
+ -- Deposit sum into the account.
+ require
+ sum >= 0
+ do
+ add (sum)
+ ensure
+ balance = old balance + sum
+ end
+
+ withdraw (sum: INTEGER)
+ -- Withdraw sum from the account.
+ require
+ sum >= 0
+ sum <= balance - minimum_balance
+ do
+ add (-sum)
+ ensure
+ balance = old balance - sum
+ end
+
+ may_withdraw ... -- As before
+
+feature {NONE}
+
+ add ...
+
+ make (initial: INTEGER)
+ -- Initialize account with balance initial.
+ require
+ initial >= minimum_balance
+ do
+ balance := initial
+ end
+
+invariant
+ balance >= minimum_balance
+
+end -- ACCOUNT
+
+
+The notation old expression is only valid in a routine postcondition. It denotes the value the expression had on routine entry.
+
+==Creation procedures==
+
+In its last version above, the class now includes a creation procedure, make. With the first version, clients used creation instructions such as create acc1 to create accounts; but then the default initialization, setting balance to zero, violated the invariant. By having one or more creation procedures, listed in the create clause at the beginning of the class text, a class offers a way to override the default initializations. The effect of
+
+ create acc1.make (5_500)
+
+is to allocate the object (as with the default creation) and to call procedure make on this object, with the argument given. This call is correct since it satisfies the precondition; it will ensure the invariant.
+
+{{info|The underscore _ in the integer constant ''5_500'' has no semantic effect. The general rule is that you can group digits by sets of three from the right to improve the readability of integer constants. }}
+
+
+Note that the same keyword, create, serves both to introduce creation instructions and the creation clause listing creation procedures at the beginning of the class.
+
+A procedure listed in the creation clause, such as make, otherwise enjoys the same properties as other routines, especially for calls. Here the procedure make is secret since it appears in a clause starting with
+
+feature {NONE}
+
+so it would be invalid for a client to include a call such as
+
+ acc.make (8_000)
+
+To make such a call valid, it would suffice to move the declaration of make to the first feature clause of class ACCOUNT, which carries no export restriction. Such a call does not create any new object, but simply resets the balance of a previously created account.
+
+==Design by Contract==
+
+Syntactically, assertions are boolean expressions, with a few extensions such as the old notation. Also, you may split an assertion into two or more clauses, as here with the precondition of withdraw; this is as if you had separated the clauses with an and, but makes the assertion clearer, especially if it includes many conditions.
+
+Assertions play a central part in the Eiffel method for building reliable object-oriented software. They serve to make explicit the assumptions on which programmers rely when they write software elements that they believe are correct. Writing assertions amounts to spelling out the terms of the '''contract''' which governs the relationship between a routine and its callers. The precondition binds the callers; the postcondition binds the routine.
+
+The underlying theory of Design by Contract, the centerpiece of the Eiffel method, views software construction as based on contracts between clients (callers) and suppliers (routines), relying on mutual obligations and benefits made explicit by the assertions.
+
+==The Contract Form==
+
+Assertions are also an indispensable tool for the documentation of reusable software components: one cannot expect large-scale reuse without a precise documentation of what every component expects (precondition), what it guarantees in return (postcondition) and what general conditions it maintains (invariant).
+
+Documentation tools in EiffelStudio use assertions to produce information for client programmers, describing classes in terms of observable behavior, not implementation. In particular the '''Contract Form''' of a class, also called its "short form", which serves as its interface documentation, is obtained from the full text by removing all non-exported features and all implementation information such as do clauses of routines, but keeping interface information and in particular assertions. Here is the Contract Form of the above class:
+
+class interface ACCOUNT
+
+create
+ make
+
+feature
+
+ balance: INTEGER
+ ...
+
+ deposit (sum: INTEGER)
+ -- Deposit sum into the account.
+ require
+ sum >= 0
+ ensure
+ balance = old balance + sum
+
+ withdraw (sum: INTEGER)
+ -- Withdraw sum from the account.
+ require
+ sum >= 0
+ sum <= balance - minimum_balance
+ ensure
+ balance = old balance - sum
+
+ may_withdraw ...
+
+end -- ACCOUNT
+
+
+This is not actual Eiffel, only documentation of Eiffel classes, hence the use of slightly different syntax to avoid any confusion ( interface class rather than class). In accordance with the Uniform Access Principle (in [[I2E: Classes|Classes]]), the output for balance would be the same if this feature were a function rather than an attribute.
+
+You will find in EiffelStudio automatic tools to produce the Contract Form of a class. You can also get the '''Flat Contract''' form, based on the same ideas but including inherited features along with those introduced in the class itself. EiffelStudio can produce these forms, and other documentation views of a class, in a variety of output formats including HTML, so that collaborative projects can automatically post the latest versions of their class interfaces on the Internet or an Intranet.
+
+==Contracts for testing and debugging==
+
+Under EiffelStudio you may also set up compilation options, for the whole system or specific classes only, to evaluate assertions at run time, to uncover potential errors ("bugs"). EiffelStudio provides several levels of assertion monitoring: preconditions only, postconditions etc. When monitoring is on, an assertion which evaluates to true has no further effect on the execution. An assertion that evaluates to false will trigger an exception, as described next; unless you have written an appropriate exception handler, the exception will cause an error message and termination with a precise message and a call trace.
+
+This ability to check assertions provides a powerful testing and debugging mechanism, in particular because the classes of the EiffelBase Libraries, widely used in Eiffel software development, are protected by carefully written assertions.
+
+Run-time monitoring, however, is only one application of assertions, whose role as design and documentation aids, as part of the theory of Design by Contract, exerts a pervasive influence on the Eiffel style of software development.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-design-principles.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-design-principles.wiki
new file mode 100644
index 00000000..0c9246c0
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-design-principles.wiki
@@ -0,0 +1,22 @@
+[[Property:title|I2E: Design Principles]]
+[[Property:weight|-13]]
+[[Property:uuid|529659bd-ec13-5805-87f2-2fd9318ad442]]
+The aim of Eiffel is to help specify, design, implement and modify quality software. This goal of quality in software is a combination of many factors; the language design concentrated on the three factors which, in the current state of the industry, are in direct need of improvements: reusability, extendibility and reliability. Also important were other factors such as efficiency, openness and portability.
+
+'''Reusability''' is the ability to produce components that may serve in many different applications. Central to the Eiffel approach is the presence of predefined libraries such as EiffelBase, and the language's support for the production of new libraries.
+
+'''Extendibility''' is the ability to produce easily modifiable software. "Soft" as software is supposed to be, it is notoriously hard to modify software systems, especially large ones.
+
+Among quality factors, reusability and extendibility play a special role: satisfying them means having less software to write -- and hence more time to devote to other important goals such as efficiency, ease of use or integrity.
+
+The third fundamental factor is '''reliability, ''' the ability to produce software that is correct and robust -- that is to say, bug-free. Eiffel techniques such as static typing, assertions, disciplined exception handling and automatic garbage collection are essential here.
+
+Three other factors are also part of Eiffel's principal goals:
+"When the user clicks this OK button, the system must update the file"
+
+
+each involves a '''control''' (here the OK button), an '''event''' (mouse click) and an '''operation''' (update the file). This can be programmed by having an "event loop", triggered for each event, which performs massive decision-making (if "The latest event was `left mouse click on button 23'" then "Appropriate instructions" else if ... and so on with many branches); but this leads to bulky software architectures where introducing any new control or event requires updating a central part of the code. It's preferable to let any element of the system that encounters a new control-event-operation association
+
+[control, event, operation]
+
+
+store it as a triple of objects into an object structure, such as an array or a list. Triples in that structure may come from different parts of the system; there is no central know-it-all structure. The only central element is a simple mechanism which can explore the object structure to execute each operation associated with a certain control and a certain event. The mechanism is not just simple; it's also independent of your application, since it doesn't need to know about any particular control, event or operation (it will find them in the object structure). So it can be programmed once and for all, as part of a library such as EiffelVision 2 for platform-independent graphics.
+
+To build an object structure, we need objects. A control, an event are indeed objects. But an operation is not: it's program code -- a routine of a certain class.
+
+Agents address this issue. An agent is an object that represents a routine, which can then be kept in an object structure. The simplest form of agent is written agent r, where r is a routine. This denotes an object. If your_agent is such an agent object, the call
+
+ your_agent.call ([a, b])
+
+
+where a and b are valid arguments for r, will have the same effect as a direct call to r with arguments a and b. Of course, if you know that you want to call r with those arguments, you don't need any agents; just use the direct call r (a, b). The benefit of using an agent is that you can store it into an object structure to be called '''later''', for example when an event-driven mechanism finds the agent in the object structure, associated with a certain control and a certain event. For this reason agents are also called '''delayed calls'''.
+
+{{info|The notation [a, b] denotes a sequence of elements, or '''tuple'''. The reason call needs a tuple as argument, whereas the direct call r (a, b) doesn't, is that call is a general routine (from the EiffelBase class ROUTINE, representing agents) applicable to any agent, whereas the direct call refers explicitly to r and hence requires arguments a and b of specific types. The agent mechanism, however, is statically typed like the rest of the language; when you call call, the type checking mechanism ensures that the tuple you pass as argument contains elements a and b of the appropriate types. }}
+
+
+A typical use of agents with EiffelVision 2 is
+
+ ok_button.select_actions.extend (agent your_routine)
+
+which says: "add your_routine to the list of operations to be performed whenever a select event (left click) happens on ok_button". ok_button.select_actions is the list of agents associated with the button and the event; in list classes, procedure extend adds an item at the end of a list. Here, the object to be added is the agent.
+
+This enables the EiffelVision 2 event-handling mechanism to find the appropriate agent when it processes an event, and call call on that agent to trigger the appropriate routine. EiffelVision 2 doesn't know that it's your_routine; in fact, it doesn't know anything about your application. It simply finds an agent in the list, and calls call on it. For your part, as the author of a graphical application, you don't need to know how EiffelVision 2 handles events; you simply associate the desired agents with the desired controls and events, and let EiffelVision 2 do the rest.
+
+Agents extend to many areas beyond GUIs. In '''numerical computation''', you may use an agent to pass to an "integrator" object a numerical function to be integrated over a certain interval. In yet another area, you can use agents (as in the iteration library of EiffelBase) to program '''iterators''' : mechanisms that repetitively apply an arbitrary operation -- represented by an agent -- to every element of a list, tree or other object structure. More generally, agent embody properties of the associated routines, opening the way to mechanism for '''reflection''', also called "introspection": the ability, during software execution, to discover properties of the software itself.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-exceptions.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-exceptions.wiki
new file mode 100644
index 00000000..5668d427
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-exceptions.wiki
@@ -0,0 +1,47 @@
+[[Property:title|I2E: Exceptions]]
+[[Property:weight|-8]]
+[[Property:uuid|e3e10dac-0dd7-bbe1-240c-6a6985c7376a]]
+Whenever there is a contract, the risk exists that someone will break it. This is where exceptions come in.
+
+Exceptions -- contract violations -- may arise from several causes. One is an assertion violation, if you've selected run-time assertion monitoring. Another is a signal triggered by the hardware or operating system to indicate an abnormal condition such as arithmetic overflow, or an attempt to create a new object when there's not enough memory available.
+
+Unless a routine has made specific provision to handle exceptions, it will '''fail''' if an exception arises during its execution. This in turn provides one more source of exceptions: a routine that fails triggers an exception in its caller.
+
+A routine may, however, handle an exception through a rescue clause. This optional clause attempts to "patch things up" by bringing the current object to a stable state (one satisfying the class invariant). Then it can terminate in either of two ways:rescue clause may execute a retry instruction, which causes the routine to restart its execution from the beginning, attempting again to fulfill its contract, usually through another strategy. This assumes that the instructions of the rescue clause, before the retry, have attempted to correct the cause of the exception.
+* If the rescue clause does not end with retry, then the routine fails: it returns to its caller, immediately triggering an exception. (The caller's rescue clause will be executed according to the same rules.)
+
+
+The principle is that '''a routine must either succeed or fail''': it either fulfills its contract, or not; in the latter case it must notify its caller by triggering an exception.
+
+Usually, only a few routines of a system will explicitly include a rescue clause. A routine that doesn't have an explicit rescue is considered to have an implicit one, which calls a routine default_rescue that by default does nothing, so that an exception will cause the routine to fail immediately, propagating the exception to the caller.
+
+An example using the exception mechanism is a routine attempt_transmission that tries to transmit a message over a phone line. The actual transmission is performed by an external, low-level routine transmit; once started, however, transmit may abruptly fail, triggering an exception, if the line is disconnected. Routine attempt_transmission tries the transmission at most 50 times; before returning to its caller, it sets a boolean attribute successful to True or False depending on the outcome. Here is the text of the routine:
+
+attempt_transmission (message: STRING)
+ -- Try to transmit message, at most 50 times.
+ -- Set successful accordingly.
+ local
+ failures: INTEGER
+ do
+ if failures < 50 then
+ transmit (message)
+ successful := True
+ else
+ successful := False
+ end
+ rescue
+ failures := failures + 1
+ retry
+ end
+
+
+Initialization rules ensure that failures, a local entity, is set to zero on entry.
+
+This example illustrates the simplicity of the mechanism: the rescue clause never attempts to achieve the routine's original intent; this is the sole responsibility of the body (the do clause). The only role of the rescue clause is to clean up the objects involved, and then either to fail or to retry.
+
+This disciplined exception mechanism is essential for software developers, who need protection against unexpected events, but cannot be expected to sacrifice safety and simplicity to pay for this protection.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-genericity.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-genericity.wiki
new file mode 100644
index 00000000..01ab0951
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-genericity.wiki
@@ -0,0 +1,28 @@
+[[Property:title|I2E: Genericity]]
+[[Property:weight|-6]]
+[[Property:uuid|091c0b65-73de-b454-b3f2-d8752983780e]]
+Building software components (classes) as implementations of abstract data types yields systems with a solid architecture but does not in itself ensure reusability and extendibility. Two key techniques address the problem: genericity (unconstrained or constrained) and inheritance. Let us look first at the unconstrained form.
+
+To make a class generic is to give it '''formal generic parameters''' representing as unknown types, as in these examples from EiffelBase, an open-source library covering basic data structures and algorithms:
+
+ ARRAY [G]
+ LIST [G]
+ LINKED_LIST [G]
+
+These classes describe data structures -- arrays, lists without commitment to a specific representation, lists in linked representation -- containing objects of a certain type. The formal generic parameter G denotes this type.
+
+A class such as these doesn't quite yet describe a type, but a type template, since G itself denotes an unknown type. To derive a directly usable list or array type, you must provide a type corresponding to G, called an '''actual generic parameter'''; this may be either an expanded type, including basic types such as INTEGER, or a reference type. Here are some possible generic derivations:
+
+ il: LIST [INTEGER]
+ aa: ARRAY [ACCOUNT]
+ aal: LIST [ARRAY [ACCOUNT]]
+
+As the last example indicates, an actual generic parameter may itself be generically derived.
+
+It would not be possible, without genericity, to have static type checking in a realistic object-oriented language.
+
+A variant of this mechanism, constrained genericity, will enable a class to place specific requirements on possible actual generic parameters. Constrained genericity will be described after inheritance.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-inheritance.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-inheritance.wiki
new file mode 100644
index 00000000..b9045767
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-inheritance.wiki
@@ -0,0 +1,72 @@
+[[Property:title|I2E: Inheritance]]
+[[Property:weight|-5]]
+[[Property:uuid|acf84989-0e7c-f2f7-427a-19e7fce404ce]]
+Inheritance, the other fundamental generalization mechanism, makes it possible to define a new class by combination and specialization of existing classes rather than from scratch.
+
+The following simple example, from the Data Structure Library in EiffelBase, is typical. LIST, as noted, describes lists in any representation. One such representation if the lists have a fixed number of elements uses an array. We may define the corresponding class by combination of LIST and ARRAY, as follows:
+
+class ARRAYED_LIST [G]
+ inherit
+ LIST [G]
+ ARRAY [G]
+
+ export ... See below ... end
+
+feature
+ ... Specific features of fixed-size lists ...
+
+end -- ARRAYED_LIST
+
+
+The inherit ... clause lists all the "parents" of the new class, which is said to be their "heir". (The "ancestors" of a class include the class itself, its parents, grandparents etc.; the reverse term is "descendant".) Declaring ARRAYED_LIST as shown ensures that all the features and properties of lists and arrays are applicable to arrayed lists as well. Since the class has more than one parent, this is a case of multiple inheritance.
+
+Standard graphical conventions -- drawn from the Business Object Notation or BON, a graphical object-oriented notation based on concepts close to those of Eiffel, and directly supported by EiffelStudio -- illustrate such inheritance structures:
+
+
+[[Image:invitation-4]]
+
+
+An heir class such as ARRAYED_LIST needs the ability to define its own export policy. By default, inherited features keep their export status (publicly available, secret, available to selected classes only); but this may be changed in the heir. Here, for example, ARRAYED_LIST will export only the exported features of LIST, making those of ARRAY unavailable directly to ARRAYED_LIST 's clients. The syntax to achieve this is straightforward:
+
+class ARRAYED_LIST [G]
+ inherit
+ LIST [G]
+ ARRAY [G]
+
+ export {NONE} all end
+
+ ... The rest as above ...
+
+
+Another example of multiple inheritance comes from a windowing system based on a class WINDOW, close to actual classes in EiffelVision 2. Windows have '''graphical''' features: a height, a width, a position, routines to scale windows, move them, and other graphical operations. The system permits windows to be nested, so that a window also has '''hierarchical''' features: access to sub windows and the parent window, adding a sub window, deleting a sub window, attaching to another parent and so on. Rather than writing complex class that would contain specific implementations for all of these features, it is preferable to inherit all hierarchical features from TREE (a class in EiffelBase describing trees), and all graphical features from a class RECTANGLE.
+
+Inheritance complements the "client" relation by providing another form of reuse that yields remarkable economies of effort -- for analysis, design, implementation, evolution -- and has a profound effect on the entire software development process.
+
+The very power of inheritance demands adequate means to keep it under control. Multiple inheritance, in particular, raises the question of name conflicts between features inherited from different parents; this case will inevitably arise in practice, especially for classes contributed by independent developers. You may remove such a name conflict through '''renaming''', as in
+
+class C
+ inherit
+ A
+ rename
+ x as x1,
+ y as y1
+ end
+
+ B
+ rename
+ x as x2,
+ y as y2
+ end
+
+feature ...
+
+
+Here, if both A and B have features named x and y, class C would be invalid without the renaming.
+
+Renaming also serves to provide more appropriate feature names in descendants. For example, class WINDOW may inherit a routine insert_subtree from TREE. For clients of WINDOW, however, such a routine name is no longer appropriate. An application that uses this class needs coherent window terminology, and should have to concern itself with the inheritance structure that led to the class. So you may wish to rename insert_subtree as add_subwindow in the inheritance clause of WINDOW.
+
+As a further protection against misusing multiple inheritance, the invariants of all parent classes automatically apply to a newly defined class. So classes may not be combined if their invariants are incompatible.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-invitation-eiffel-copyright.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-invitation-eiffel-copyright.wiki
new file mode 100644
index 00000000..c6aa3eaa
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-invitation-eiffel-copyright.wiki
@@ -0,0 +1,37 @@
+[[Property:title|I2E: Invitation to Eiffel Copyright]]
+[[Property:weight|0]]
+[[Property:uuid|ce7b4af4-b669-9fec-92e1-c24c4f089336]]
+Title: Invitation to Eiffel, Eiffel Software Technical Report TR-EI-67/IV.
+
+==Publication history==
+First published 1987. Some revisions (in particular Web versions) have used the title "Eiffel in a Nutshell" a : = b is permitted not only if a and b are of the same type, but more generally if a and b are of reference types A and B, based on classes A and B such that B is a descendant of A.
+
+This corresponds to the intuitive idea that a value of a more specialized type may be assigned to an entity of a less specialized type -- but not the reverse. (As an analogy, consider that if you request vegetables, getting green vegetables is fine, but if you ask for green vegetables, receiving a dish labeled just "vegetables" is not acceptable, as it could include, say, carrots.)
+
+What makes this possibility particularly powerful is the complementary facility: '''feature redefinition'''. A class may redefine some or all of the features which it inherits from its parents. For an attribute or function, the redefinition may affect the type, replacing the original by a descendant; for a routine it may also affect the implementation, replacing the original routine body by a new one.
+
+Assume for example a class POLYGON, describing polygons, whose features include an array of points representing the vertices and a function perimeter which computes a polygon's perimeter by summing the successive distances between adjacent vertices. An heir of POLYGON may begin as:
+
+class RECTANGLE
+ inherit
+ POLYGON
+ redefine
+ perimeter
+ end
+
+feature -- Specific features of rectangles, such as:
+
+ side1: REAL
+ side2: REAL
+
+ perimeter: REAL
+ -- Rectangle-specific version
+ do
+ Result := 2 * (side1 + side2)
+ end
+
+... Other RECTANGLE features ...
+
+
+Here it is appropriate to redefine perimeter for rectangles as there is a simpler and more efficient algorithm. Note the explicit redefine sub clause (which would come after the rename if present).
+
+Other descendants of POLYGON may also have their own redefinitions of perimeter. The version to use in any call is determined by the run-time form of the target. Consider the following class fragment:
+
+ p: POLYGON
+ r: RECTANGLE
+ ...
+
+ create p
+ create r
+ ...
+ if c then
+ p := r
+ end
+ print (p.perimeter)
+
+The polymorphic assignment p := r is valid because of the above rule. If condition c is false, p will be attached to an object of type POLYGON for the computation of p. perimeter, which will thus use the polygon algorithm. In the opposite case, however, p will be attached to a rectangle; then the computation will use the version redefined for RECTANGLE. This is known as '''dynamic binding'''.
+
+Dynamic binding provides a high degree of flexibility. The advantage for clients is the ability to request an operation (such as perimeter computation) without explicitly selecting one of its variants; the choice only occurs at run-time. This is essential in large systems, where many variants may be available; dynamic binding protects each component against changes in other components.
+
+This technique is particularly attractive when compared to its closest equivalent in traditional approaches, where you would need records with variant components, or union types (C), together with case (switch) instructions to discriminate between variants. This means that every client must know about every possible case, and that any extension may invalidate a large body of existing software.
+
+The combination of inheritance, feature redefinition, polymorphism and dynamic binding supports a development mode in which every module is open and incremental. When you want to reuse an existing class but need to adapt it to a new context, you can define a new descendant of that class (with new features, redefined ones, or both) without any change to the original. This facility is of great importance in software development, an activity that -- by design or circumstance -- is invariably incremental.
+
+The power of these techniques demands adequate controls. First, feature redefinition, as seen above, is explicit. Second, because the language is typed, a compiler can check statically whether a feature application a.f is correct. In contrast, dynamically typed object-oriented languages defer checks until run-time and hope for the best: if an object "sends a message" to another (that is to say, calls one of its routines) one just expects that the corresponding class, or one of its ancestors, will happen to include an appropriate routine; if not, a run-time error will occur. Such errors will not happen during the execution of a type-checked Eiffel system.
+
+In other words, the language reconciles dynamic binding with static typing. Dynamic binding guarantees that whenever more than one version of a routine is applicable the right version (the one most directly adapted to the target object) will be selected. Static typing means that the compiler makes sure there is at least one such version.
+
+This policy also yields an important performance benefit: in contrast with the costly run-time searches that may be needed with dynamic typing (since a requested routine may not be defined in the class of the target object but inherited from a possibly remote ancestor), the EiffelStudio implementation always finds the appropriate routine in constant-bounded time.
+
+Assertions provide a further mechanism for controlling the power of redefinition. In the absence of specific precautions, redefinition may be dangerous: how can a client be sure that evaluation of p.perimeter will not in some cases return, say, the area? Preconditions and postconditions provide the answer by limiting the amount of freedom granted to eventual redefiners. The rule is that any redefined version must satisfy a weaker or equal precondition and ensure a stronger or equal postcondition than in the original. This means that it must stay within the semantic boundaries set by the original assertions.
+
+The rules on redefinition and assertions are part of the Design by Contract theory, where redefinition and dynamic binding introduce subcontracting. POLYGON, for example, subcontracts the implementation of perimeter to RECTANGLE when applied to any entity that is attached at run-time to a rectangle object. An honest subcontractor is bound to honor the contract accepted by the prime contractor. This means that it may not impose stronger requirements on the clients, but may accept more general requests: weaker precondition; and that it must achieve at least as much as promised by the prime contractor, but may achieve more: stronger postcondition.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-putting-system-together.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-putting-system-together.wiki
new file mode 100644
index 00000000..05baa13d
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-putting-system-together.wiki
@@ -0,0 +1,33 @@
+[[Property:title|I2E: Putting a System Together]]
+[[Property:weight|-1]]
+[[Property:uuid|97460714-8ae1-a7cb-8216-235827045ea6]]
+We have now studied the constituents of Eiffel software. It remains to see how you can combine these elements into executable '''systems''' (the Eiffel concept closest to the traditional notion of program) and libraries.
+
+How do you get an executable system? All you need is to lists, tables, iteration, and so on. You can nest clusters, using for example EiffelBase, with its own subclusters as listed, as a cluster of your system.
+
+How will you specify a universe? Any Eiffel implementation can use its own conventions. EiffelStudio applies a simple policy: name.e . For clarity, name should be the lower-case version of the class name, although this is a style rule, not a requirement.
+* Put all the class files of a cluster into a single directory (folder on Windows), called its cluster directory.
+{{note|It is desirable for clarity, as a style rule, to separate clusters that directly contain classes ("terminal clusters") from those that have subclusters. Cluster directories will then contain class files or cluster subdirectories, but not both. }}
+* To specify a system, it suffices to provide a list of cluster directories, along with the name of the root class and root procedure. The universe consists of the classes contained in all the class files in the listed cluster directories.
+
+
+Such a system specification is written in an ecf (eiffel configuration file) which is an xml based file format. It can be created by using the project settings in EiffelStudio.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-types.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-types.wiki
new file mode 100644
index 00000000..005c69b9
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-types.wiki
@@ -0,0 +1,24 @@
+[[Property:title|I2E: Types]]
+[[Property:weight|-10]]
+[[Property:uuid|344a9fdc-3346-5e2d-5fdd-77464e92f72f]]
+Eiffel is strongly typed for readability and reliability. Every entity is declared of a certain type, which may be either a reference type or an expanded type.
+
+Any type T is based on a class, which defines the operations that will be applicable to instances of T. The difference between the two categories of type affects the semantics of an entity x declared of type T: for a reference type, the most common case, possible values for x are references to objects; for an expanded type, the values are objects. In both cases, the type rules guarantee that the objects will be instances of T.
+
+A non-expanded class such as ACCOUNT yields a reference type. As a result, an entity of type ACCOUNT, such as acc in the earlier client example (see the declaration of acc and the accompanying picture as given in [[I2E: Classes]] ), denotes possible run-time references to objects of type ACCOUNT.
+
+In contrast, the value of an entity acc declared of type expanded ACCOUNT is an object such as the one shown on the figure below, with no reference. The only difference with the earlier figure is that the value of acc is now an ACCOUNT object, not a reference to such an object. No creation instruction is needed in this case. (The figure does not show the PERSON object to which the owner field of the ACCOUNT object -- itself a reference -- is attached.)
+
+
+[[Image:invitation-3]]
+
+
+An important group of expanded types, based on library classes, includes the basic types CHARACTER, DOUBLE, REAL, INTEGER, and BOOLEAN. Clearly, the value of an entity declared of type INTEGER should be an integer, not a reference to an object containing an integer value. Operations on these types are defined by prefix and infix operators such as "+" and "<".
+
+As a result of these conventions, the type system is uniform and consistent: all types, including the basic types, are defined from classes, either as reference types or as expanded types.
+
+In the case of basic types, for obvious reasons of efficiency, the compilation mechanism implements the standard arithmetic and boolean operations directly through the corresponding machine operations, not through routine calls. But this is only a compiler optimization, which does not hamper the conceptual homogeneity of the type edifice.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-what-must-i-know-first.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-what-must-i-know-first.wiki
new file mode 100644
index 00000000..a40b4903
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/i2e-what-must-i-know-first.wiki
@@ -0,0 +1,10 @@
+[[Property:title|I2E: What Must I Know First?]]
+[[Property:weight|-14]]
+[[Property:uuid|f40b4a30-87f7-2c27-b6e7-ef2f2a74661b]]
+This Invitation assumes that you have some experience of software development, but that's all. Previous exposure to object technology is not required. If you've had it, it will help; but if it has all been to notations like UML or programming languages like C++ and Java, you should not let it guide your study of this Invitation. Although Eiffel shares a number of properties with these other approaches, it takes a fresh path to object technology, based on a small number of simple, far-reaching concepts.
+
+Once you are familiar with the basic ideas you may want to try them with EiffelStudio, which provides a direct implementation of the Eiffel concepts, available in a completely portable way across Windows, Linux, many versions of Unix and OpenVMS.
+
+
+
+
diff --git a/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/index.wiki b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/index.wiki
new file mode 100644
index 00000000..ad06e3be
--- /dev/null
+++ b/documentation/18.11/eiffel/Tutorials/invitation-eiffel-i2e/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|Invitation to Eiffel (I2E)]]
+[[Property:link_title|Invitation to Eiffel]]
+[[Property:weight|-15]]
+[[Property:uuid|7a606387-2653-b122-b4ef-e283a389656e]]
+The Invitation to Eiffel (I2E) is a short set of pages that should provide you with the essence of the Eiffel way, without taking too much of your time. Enjoy this profoundly different way of thinking about developing software! When you are done, move on to the more detailed Eiffel tutorial.
+
diff --git a/documentation/18.11/eiffel/_files/expression_language.pdf b/documentation/18.11/eiffel/_files/expression_language.pdf
new file mode 100644
index 00000000..6aab45db
Binary files /dev/null and b/documentation/18.11/eiffel/_files/expression_language.pdf differ
diff --git a/documentation/18.11/eiffel/_files/void-safe-eiffel.pdf b/documentation/18.11/eiffel/_files/void-safe-eiffel.pdf
new file mode 100644
index 00000000..a736f52a
Binary files /dev/null and b/documentation/18.11/eiffel/_files/void-safe-eiffel.pdf differ
diff --git a/documentation/18.11/eiffel/_images/Catcall_demo_class_diagram.png b/documentation/18.11/eiffel/_images/Catcall_demo_class_diagram.png
new file mode 100644
index 00000000..bc9dc593
Binary files /dev/null and b/documentation/18.11/eiffel/_images/Catcall_demo_class_diagram.png differ
diff --git a/documentation/18.11/eiffel/_images/Catcall_demo_class_diagram.png.data b/documentation/18.11/eiffel/_images/Catcall_demo_class_diagram.png.data
new file mode 100644
index 00000000..9deac1f8
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/Catcall_demo_class_diagram.png.data
@@ -0,0 +1,3 @@
+title=Catcall example class diagram
+author=halw
+path=content/catcall-example-class-diagram
diff --git a/documentation/18.11/eiffel/_images/Catcall_warning.png b/documentation/18.11/eiffel/_images/Catcall_warning.png
new file mode 100644
index 00000000..4dd3ed4d
Binary files /dev/null and b/documentation/18.11/eiffel/_images/Catcall_warning.png differ
diff --git a/documentation/18.11/eiffel/_images/Catcall_warning.png.data b/documentation/18.11/eiffel/_images/Catcall_warning.png.data
new file mode 100644
index 00000000..0d58433f
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/Catcall_warning.png.data
@@ -0,0 +1,3 @@
+title=Catcall compiler warning
+author=halw
+path=content/catcall-compiler-warning
diff --git a/documentation/18.11/eiffel/_images/ECMA-367_cover.png b/documentation/18.11/eiffel/_images/ECMA-367_cover.png
new file mode 100644
index 00000000..4c837a29
Binary files /dev/null and b/documentation/18.11/eiffel/_images/ECMA-367_cover.png differ
diff --git a/documentation/18.11/eiffel/_images/ECMA-367_cover.png.data b/documentation/18.11/eiffel/_images/ECMA-367_cover.png.data
new file mode 100644
index 00000000..f0adb2c8
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/ECMA-367_cover.png.data
@@ -0,0 +1,3 @@
+title=ECMA-367 cover small
+author=halw
+path=content/ecma-367-cover-small
diff --git a/documentation/18.11/eiffel/_images/ETL.png b/documentation/18.11/eiffel/_images/ETL.png
new file mode 100644
index 00000000..7de269ca
Binary files /dev/null and b/documentation/18.11/eiffel/_images/ETL.png differ
diff --git a/documentation/18.11/eiffel/_images/ETL.png.data b/documentation/18.11/eiffel/_images/ETL.png.data
new file mode 100644
index 00000000..10d4f2c1
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/ETL.png.data
@@ -0,0 +1,3 @@
+title=ETL
+author=halw
+path=content/etl
diff --git a/documentation/18.11/eiffel/_images/OOSC2_small.png b/documentation/18.11/eiffel/_images/OOSC2_small.png
new file mode 100644
index 00000000..9da6e0b4
Binary files /dev/null and b/documentation/18.11/eiffel/_images/OOSC2_small.png differ
diff --git a/documentation/18.11/eiffel/_images/OOSC2_small.png.data b/documentation/18.11/eiffel/_images/OOSC2_small.png.data
new file mode 100644
index 00000000..fdb8413c
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/OOSC2_small.png.data
@@ -0,0 +1,3 @@
+title=OOSC2 small
+author=halw
+path=content/oosc2-small
diff --git a/documentation/18.11/eiffel/_images/Touch_of_Class_cover_small.png b/documentation/18.11/eiffel/_images/Touch_of_Class_cover_small.png
new file mode 100644
index 00000000..34f00bff
Binary files /dev/null and b/documentation/18.11/eiffel/_images/Touch_of_Class_cover_small.png differ
diff --git a/documentation/18.11/eiffel/_images/Touch_of_Class_cover_small.png.data b/documentation/18.11/eiffel/_images/Touch_of_Class_cover_small.png.data
new file mode 100644
index 00000000..e87bab71
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/Touch_of_Class_cover_small.png.data
@@ -0,0 +1,3 @@
+title=Touch of Class cover small
+author=halw
+path=content/touch-class-cover-small
diff --git a/documentation/18.11/eiffel/_images/Tour_sec_5_class_diagram.png b/documentation/18.11/eiffel/_images/Tour_sec_5_class_diagram.png
new file mode 100644
index 00000000..e7364c8e
Binary files /dev/null and b/documentation/18.11/eiffel/_images/Tour_sec_5_class_diagram.png differ
diff --git a/documentation/18.11/eiffel/_images/Tour_sec_5_class_diagram.png.data b/documentation/18.11/eiffel/_images/Tour_sec_5_class_diagram.png.data
new file mode 100644
index 00000000..e1c7e593
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/Tour_sec_5_class_diagram.png.data
@@ -0,0 +1,3 @@
+title=tutorial-4
+author=halw
+path=content/tutorial-4
diff --git a/documentation/18.11/eiffel/_images/VGCC_error.png b/documentation/18.11/eiffel/_images/VGCC_error.png
new file mode 100644
index 00000000..4acfde61
Binary files /dev/null and b/documentation/18.11/eiffel/_images/VGCC_error.png differ
diff --git a/documentation/18.11/eiffel/_images/VGCC_error.png.data b/documentation/18.11/eiffel/_images/VGCC_error.png.data
new file mode 100644
index 00000000..f89f3679
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/VGCC_error.png.data
@@ -0,0 +1,3 @@
+title=VGCC error
+author=halw
+path=content/vgcc-error
diff --git a/documentation/18.11/eiffel/_images/VoidSafeAddLibraryDialog_noGobo.png b/documentation/18.11/eiffel/_images/VoidSafeAddLibraryDialog_noGobo.png
new file mode 100644
index 00000000..edbba2fc
Binary files /dev/null and b/documentation/18.11/eiffel/_images/VoidSafeAddLibraryDialog_noGobo.png differ
diff --git a/documentation/18.11/eiffel/_images/VoidSafeAddLibraryDialog_noGobo.png.data b/documentation/18.11/eiffel/_images/VoidSafeAddLibraryDialog_noGobo.png.data
new file mode 100644
index 00000000..4807a799
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/VoidSafeAddLibraryDialog_noGobo.png.data
@@ -0,0 +1,3 @@
+title=VoidSafeAddLibraryDialog
+author=halw
+path=content/voidsafeaddlibrarydialog
diff --git a/documentation/18.11/eiffel/_images/VoidSafeErrorList.png b/documentation/18.11/eiffel/_images/VoidSafeErrorList.png
new file mode 100644
index 00000000..9e2a5614
Binary files /dev/null and b/documentation/18.11/eiffel/_images/VoidSafeErrorList.png differ
diff --git a/documentation/18.11/eiffel/_images/VoidSafeErrorList.png.data b/documentation/18.11/eiffel/_images/VoidSafeErrorList.png.data
new file mode 100644
index 00000000..48731813
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/VoidSafeErrorList.png.data
@@ -0,0 +1,3 @@
+title=VoidSafeErrorList
+author=halw
+path=content/voidsafeerrorlist
diff --git a/documentation/18.11/eiffel/_images/VoidSafePrecompileOffer.png b/documentation/18.11/eiffel/_images/VoidSafePrecompileOffer.png
new file mode 100644
index 00000000..d0c2739e
Binary files /dev/null and b/documentation/18.11/eiffel/_images/VoidSafePrecompileOffer.png differ
diff --git a/documentation/18.11/eiffel/_images/VoidSafePrecompileOffer.png.data b/documentation/18.11/eiffel/_images/VoidSafePrecompileOffer.png.data
new file mode 100644
index 00000000..a559422c
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/VoidSafePrecompileOffer.png.data
@@ -0,0 +1,3 @@
+title=VoidSafePrecompileOffer
+author=halw
+path=content/voidsafeprecompileoffer
diff --git a/documentation/18.11/eiffel/_images/VoidSafeVEVI1.png b/documentation/18.11/eiffel/_images/VoidSafeVEVI1.png
new file mode 100644
index 00000000..9ebc80e4
Binary files /dev/null and b/documentation/18.11/eiffel/_images/VoidSafeVEVI1.png differ
diff --git a/documentation/18.11/eiffel/_images/VoidSafeVEVI1.png.data b/documentation/18.11/eiffel/_images/VoidSafeVEVI1.png.data
new file mode 100644
index 00000000..cfa1e2c5
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/VoidSafeVEVI1.png.data
@@ -0,0 +1,3 @@
+title=VoidSafeVEVI1
+author=halw
+path=content/voidsafevevi1
diff --git a/documentation/18.11/eiffel/_images/VoidSafeVJAR1.png b/documentation/18.11/eiffel/_images/VoidSafeVJAR1.png
new file mode 100644
index 00000000..b757a42b
Binary files /dev/null and b/documentation/18.11/eiffel/_images/VoidSafeVJAR1.png differ
diff --git a/documentation/18.11/eiffel/_images/VoidSafeVJAR1.png.data b/documentation/18.11/eiffel/_images/VoidSafeVJAR1.png.data
new file mode 100644
index 00000000..a6ce8267
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/VoidSafeVJAR1.png.data
@@ -0,0 +1,3 @@
+title=VoidSafeVJAR1
+author=halw
+path=content/voidsafevjar1
diff --git a/documentation/18.11/eiffel/_images/invitation-2.png b/documentation/18.11/eiffel/_images/invitation-2.png
new file mode 100644
index 00000000..644c0fda
Binary files /dev/null and b/documentation/18.11/eiffel/_images/invitation-2.png differ
diff --git a/documentation/18.11/eiffel/_images/invitation-2.png.data b/documentation/18.11/eiffel/_images/invitation-2.png.data
new file mode 100644
index 00000000..08f9b58b
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/invitation-2.png.data
@@ -0,0 +1,3 @@
+title=invitation-2
+author=admin
+path=content/invitation-2
diff --git a/documentation/18.11/eiffel/_images/invitation-3.png b/documentation/18.11/eiffel/_images/invitation-3.png
new file mode 100644
index 00000000..d5b7d3b6
Binary files /dev/null and b/documentation/18.11/eiffel/_images/invitation-3.png differ
diff --git a/documentation/18.11/eiffel/_images/invitation-3.png.data b/documentation/18.11/eiffel/_images/invitation-3.png.data
new file mode 100644
index 00000000..9ff2ef7b
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/invitation-3.png.data
@@ -0,0 +1,3 @@
+title=invitation-3
+author=admin
+path=content/invitation-3
diff --git a/documentation/18.11/eiffel/_images/invitation-4.png b/documentation/18.11/eiffel/_images/invitation-4.png
new file mode 100644
index 00000000..75d213eb
Binary files /dev/null and b/documentation/18.11/eiffel/_images/invitation-4.png differ
diff --git a/documentation/18.11/eiffel/_images/invitation-4.png.data b/documentation/18.11/eiffel/_images/invitation-4.png.data
new file mode 100644
index 00000000..0a9644cd
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/invitation-4.png.data
@@ -0,0 +1,3 @@
+title=invitation-4
+author=admin
+path=content/invitation-4
diff --git a/documentation/18.11/eiffel/_images/invitation-5.png b/documentation/18.11/eiffel/_images/invitation-5.png
new file mode 100644
index 00000000..5733334b
Binary files /dev/null and b/documentation/18.11/eiffel/_images/invitation-5.png differ
diff --git a/documentation/18.11/eiffel/_images/invitation-5.png.data b/documentation/18.11/eiffel/_images/invitation-5.png.data
new file mode 100644
index 00000000..d852bd29
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/invitation-5.png.data
@@ -0,0 +1,3 @@
+title=invitation-5
+author=admin
+path=content/invitation-5
diff --git a/documentation/18.11/eiffel/_images/tutorial-10.png b/documentation/18.11/eiffel/_images/tutorial-10.png
new file mode 100644
index 00000000..c5d680f5
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-10.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-10.png.data b/documentation/18.11/eiffel/_images/tutorial-10.png.data
new file mode 100644
index 00000000..00154ebf
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-10.png.data
@@ -0,0 +1,3 @@
+title=tutorial-10
+author=admin
+path=content/tutorial-10
diff --git a/documentation/18.11/eiffel/_images/tutorial-11.png b/documentation/18.11/eiffel/_images/tutorial-11.png
new file mode 100644
index 00000000..fc3ff485
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-11.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-11.png.data b/documentation/18.11/eiffel/_images/tutorial-11.png.data
new file mode 100644
index 00000000..fec1db81
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-11.png.data
@@ -0,0 +1,3 @@
+title=tutorial-11
+author=admin
+path=content/tutorial-11
diff --git a/documentation/18.11/eiffel/_images/tutorial-12.png b/documentation/18.11/eiffel/_images/tutorial-12.png
new file mode 100644
index 00000000..0c8eb762
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-12.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-12.png.data b/documentation/18.11/eiffel/_images/tutorial-12.png.data
new file mode 100644
index 00000000..60f09c82
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-12.png.data
@@ -0,0 +1,3 @@
+title=tutorial-12
+author=admin
+path=content/tutorial-12
diff --git a/documentation/18.11/eiffel/_images/tutorial-13.png b/documentation/18.11/eiffel/_images/tutorial-13.png
new file mode 100644
index 00000000..e1cf7705
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-13.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-13.png.data b/documentation/18.11/eiffel/_images/tutorial-13.png.data
new file mode 100644
index 00000000..812c0a57
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-13.png.data
@@ -0,0 +1,3 @@
+title=tutorial-13
+author=admin
+path=content/tutorial-13
diff --git a/documentation/18.11/eiffel/_images/tutorial-14.png b/documentation/18.11/eiffel/_images/tutorial-14.png
new file mode 100644
index 00000000..c067ec78
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-14.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-14.png.data b/documentation/18.11/eiffel/_images/tutorial-14.png.data
new file mode 100644
index 00000000..517f06ad
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-14.png.data
@@ -0,0 +1,3 @@
+title=tutorial-14
+author=admin
+path=content/tutorial-14
diff --git a/documentation/18.11/eiffel/_images/tutorial-2.png b/documentation/18.11/eiffel/_images/tutorial-2.png
new file mode 100644
index 00000000..941406b5
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-2.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-2.png.data b/documentation/18.11/eiffel/_images/tutorial-2.png.data
new file mode 100644
index 00000000..0901a1a7
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-2.png.data
@@ -0,0 +1,3 @@
+title=tutorial-2
+author=admin
+path=content/tutorial-2
diff --git a/documentation/18.11/eiffel/_images/tutorial-3.png b/documentation/18.11/eiffel/_images/tutorial-3.png
new file mode 100644
index 00000000..0a58d632
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-3.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-3.png.data b/documentation/18.11/eiffel/_images/tutorial-3.png.data
new file mode 100644
index 00000000..d94c5dcf
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-3.png.data
@@ -0,0 +1,3 @@
+title=tutorial-3
+author=admin
+path=content/tutorial-3
diff --git a/documentation/18.11/eiffel/_images/tutorial-5.png b/documentation/18.11/eiffel/_images/tutorial-5.png
new file mode 100644
index 00000000..2e4dd67e
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-5.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-5.png.data b/documentation/18.11/eiffel/_images/tutorial-5.png.data
new file mode 100644
index 00000000..bbca28cb
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-5.png.data
@@ -0,0 +1,3 @@
+title=tutorial-5
+author=admin
+path=content/tutorial-5
diff --git a/documentation/18.11/eiffel/_images/tutorial-6.png b/documentation/18.11/eiffel/_images/tutorial-6.png
new file mode 100644
index 00000000..6ac1f2b1
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-6.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-6.png.data b/documentation/18.11/eiffel/_images/tutorial-6.png.data
new file mode 100644
index 00000000..b180a4e0
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-6.png.data
@@ -0,0 +1,3 @@
+title=tutorial-6
+author=admin
+path=content/tutorial-6
diff --git a/documentation/18.11/eiffel/_images/tutorial-7.png b/documentation/18.11/eiffel/_images/tutorial-7.png
new file mode 100644
index 00000000..513ac0f8
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-7.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-7.png.data b/documentation/18.11/eiffel/_images/tutorial-7.png.data
new file mode 100644
index 00000000..c38f5f4e
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-7.png.data
@@ -0,0 +1,3 @@
+title=tutorial-7
+author=admin
+path=content/tutorial-7
diff --git a/documentation/18.11/eiffel/_images/tutorial-8.png b/documentation/18.11/eiffel/_images/tutorial-8.png
new file mode 100644
index 00000000..07e4f070
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-8.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-8.png.data b/documentation/18.11/eiffel/_images/tutorial-8.png.data
new file mode 100644
index 00000000..cdcab461
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-8.png.data
@@ -0,0 +1,3 @@
+title=tutorial-8
+author=admin
+path=content/tutorial-8
diff --git a/documentation/18.11/eiffel/_images/tutorial-9.png b/documentation/18.11/eiffel/_images/tutorial-9.png
new file mode 100644
index 00000000..ed7980ac
Binary files /dev/null and b/documentation/18.11/eiffel/_images/tutorial-9.png differ
diff --git a/documentation/18.11/eiffel/_images/tutorial-9.png.data b/documentation/18.11/eiffel/_images/tutorial-9.png.data
new file mode 100644
index 00000000..46d38ae6
--- /dev/null
+++ b/documentation/18.11/eiffel/_images/tutorial-9.png.data
@@ -0,0 +1,3 @@
+title=tutorial-9
+author=admin
+path=content/tutorial-9
diff --git a/documentation/18.11/eiffel/index.wiki b/documentation/18.11/eiffel/index.wiki
new file mode 100644
index 00000000..bef52569
--- /dev/null
+++ b/documentation/18.11/eiffel/index.wiki
@@ -0,0 +1,16 @@
+[[Property:title|Eiffel]]
+[[Property:description|Eiffel development method and the Eiffel programming language]]
+[[Property:link_title|Eiffel]]
+[[Property:weight|1]]
+[[Property:uuid|ae6f212e-bdc6-d5f2-972a-1bfee586479e]]
+== The Eiffel Method and Language ==
+
+Here you can learn about the Eiffel development method and the Eiffel programming language.
+
+At the heart of the Eiffel Development Framework is the Eiffel method. Everything else -- the language, the tools, the libraries -- exists because of the method.
+
+In order for us to communicate effectively about the activities of the method we must have some way to record the products of those activities. That is what the Eiffel programming language does for us ... with the added benefit that, ultimately, we implement whole running software systems in the language.
+
+The method is laid out in wonderful detail in [[Object-Oriented Software Construction, 2nd Edition]]. But, if you're just getting started, you will find some good introductory material on this page. The invitation to Eiffel is fairly short introduction to the method and language. and the tutorial gives a more detailed look.
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/Technical_papers/index.wiki b/documentation/18.11/eiffelstudio/Tutorials/Technical_papers/index.wiki
new file mode 100644
index 00000000..f390f47e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/Technical_papers/index.wiki
@@ -0,0 +1,9 @@
+[[Property:title|Technical papers about EiffelStudio]]
+[[Property:description|Background, foundation, or supplemental information about uncovered topics]]
+[[Property:link_title|Papers]]
+[[Property:weight|4]]
+[[Property:uuid|97fe7aa0-adbf-405a-b5be-8187470dce50]]
+Occasionally papers are produced providing background, foundation, or supplemental information about the topics covered by the EiffelStudio documentation. Although the material in these papers might be of interest to many EiffelStudio users, they might not be suitable in their current form for inclusion in the mainstream documentation books.
+
+You will find a collection of these papers in this book.
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/appendix-writing-documentation-filters-eff-eiffel-filter-format.wiki b/documentation/18.11/eiffelstudio/Tutorials/appendix-writing-documentation-filters-eff-eiffel-filter-format.wiki
new file mode 100644
index 00000000..ad07140c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/appendix-writing-documentation-filters-eff-eiffel-filter-format.wiki
@@ -0,0 +1,119 @@
+[[Property:title|Appendix: Writing Documentation Filters with EFF, the Eiffel Filter Format]]
+[[Property:weight|6]]
+[[Property:uuid|0d17d433-3d4f-9575-49f7-d97eccb1a5b1]]
+This appendix provides reference information, not needed in simple uses of EiffelStudio.
+
+We saw in the [[PRODUCING AND EXPORTING DOCUMENTATION|section on documentation]] that you can output documentation about your system in many different formats. A number of predefined formats are available, from Postscript to Microsoft's Rich Text Format, FrameMaker, HTML with and without style sheets, TEX and others. There's nothing special about these formats: they just make their conventions known to EiffelStudio through a '''filter''' expressed in a simple notation called EFF, or Eiffel Filter Format. If you have a favorite format that you'd like EiffelStudio to use for producing documentation, you can define your own filter in EFF. Applications include:
+* Producing a variant of an existing format, to support some "house style" that you have defined, such as a different formatting or fonts.
+* Producing documentation for a text processing tool that's not among those supported by default.
+* Producing documentation that purposely omit some parts of Eiffel texts, in line with the ideas applied by the Contract and Flat Contract forms.
+
+This appendix describes EFF and its conventions, enabling you to write filters. Note that in practice the best way to write an EFF filter is usually not from scratch, but by copying an existing filter -- one that seems closest to your needs -- and adapting the copy.
+
+==Where to put filters==
+
+When you choose to generate documentation, EiffelStudio will ask you to select a filter from a list it obtains by looking up the files of extension . fil in the directory
+$ISE_EIFFEL/studio/filters
+
+To make a new filter available to yourself and other users of this installation, just add the corresponding file name . fil to this directory. Make sure to choose the appropriate name, since this is what the menu of available filters will display.
+
+==Filter basics==
+
+An EFF filter follows a very simple structure. As with all other Eiffel-related notations (such as Eiffel itself and Lace, the control language for Eiffel systems), any line or part of a line beginning with two consecutive dashes -- is a comment, except if it immediately follows a percent sign since, as will be seen below, - %- is used to denote an Eiffel comment in the class text. Blank lines are also permitted. Comments and blank lines carry no semantic value.
+
+Except for comments and blank lines, a filter is a sequence of entries, all of the form
+Construct | Replacement
+
+where: Construct is one of a set of possible strings, most of which correspond to Eiffel constructs such as Class_declaration or Eiffel keywords such as class ; and Replacement is a string indicating how to format specimens of the Construct that appear in a class text.
+
+For readability, there may be any number of blanks or tabs between the Construct and the vertical bar |, so that you can align all the bars if you wish. On the right of the bar, however, all characters including blanks and tabs are significant, since they are part of the replacement for the Construct.
+
+==The asterisk==
+
+In the Replacement part, you may use the symbol * (asterisk) to denote the construct specimen itself. So for example the entry
+Feature_clause | %N%N*%N%N
+
+specifies the following formatting for any Feature_clause: two successive blank lines (expressed as %N, New Line, a convention taken from Eiffel); the feature clause itself; two blank lines.
+
+Similarly, in an HTML format, the entry
+External | *
+
+means that the Eiffel keyword external must appear in the filtered form immediately preceded by , the HTML code for switching to boldface, and immediately followed by , the code for reverting to the previous setup. Here you can also write the right-hand side without the asterisks, as external. If, however, all keywords are to use boldface, it is preferable to write a single entry
+Keyword | *
+
+which, thanks to the asterisk, will govern all construct specimens of the Keyword category. You can still override this specification for an individual keyword by including a specific entry for it.
+
+==Constructs==
+
+The following general syntactic constructs may appear as the left-hand side, Construct, of an entry:
+
+Class_declaration
+Class_end
+Class_header
+Class_name
+Comment
+Creators
+Escape
+Feature_clause
+Feature_declaration
+Features
+Formal_generics
+Indexing_clause
+Inheritance
+Invariant_clause
+Keyword
+New_line
+Obsolete_clause
+Suffix
+Symbol
+Tab
+
+
+Most of these denote Eiffel constructs as they appear in the official language reference, the book [[Eiffel: The Language]] . Since the Eiffel construct names Feature, Invariant and Obsolete are also keywords and EFF, like Eiffel, is case-insensitive, the EFF construct names use the suffix _clause, for example Feature_clause.
+
+The constructs corresponding to syntactic constructs are self-explanatory. The others are:
+* Class_end, denoting the final end of a class text.
+* Keyword, denoting any Eiffel keyword among those listed in boldface in the corresponding appendix in [[Eiffel: The Language]]
+* New_line, denoting any passage to a new line in the class text.
+* Suffix, used to introduce the file extension for the generated documentation files. If you don't specify this, EiffelStudio will use the filter's name as extension.
+* Symbol, denoting any of the Eiffel symbols listed in the corresponding appendix of [[Eiffel: The Language]] .
+* Escape, to protect special characters of the external tool, as explained below.
+* Tab, denoting any tab character appearing in the class text.
+
+==Keywords==
+
+A Construct part may consist of the name of an Eiffel keyword. To see the complete list of possible keywords, look at the template filter, file format.fil-template in the default filter directory $ISE_EIFFEL/studio/filters, which includes all of them with a single asterisk * as the Replacement part.
+
+If entries are present for both the Keyword construct and individual keywords, the individual keyword entries will override the general entry for the keywords listed; the general entry will apply to all other keywords. This makes it possible to have both a general convention for keywords and a special convention for some of them.
+
+==Symbol==
+
+A Construct part may consist of an Eiffel symbol, such as :=, /= and many others. Again, you may see the complete list by looking at format.fil-template. Note the following conventions:
+* % * represents an asterisk. For example as a multiplication operator; the % avoids the confusion with the special meaning of the asterisk for EFF. You can find examples of this convention in the EFF filters for troff and gtroff.
+* Similarly, the Eiffel comment symbol appears as - %-, since just writing - - would introduce a comment in the EFF filter itself.
+
+As with keywords, you may specify a general convention for symbols, defined by an entry for the construct Symbol, and special conventions for certain individual symbols. Specific symbol entries will override the general Symbol convention.
+
+==Escape characters==
+
+A text processing system or other external tool may attach a special role to characters that may normally appear in Eiffel texts. For example, the braces { and }, used in Eiffel's Export clauses, have a special meaning for TEX. Including them without precaution in TEX input will cause trouble. Similarly, many text processing formats attach a special meaning to the backslash character \ which, although not special for Eiffel, may appear in an Eiffel string.
+
+In such cases the filter must " escape " the special character, that is to say, protect it by other characters. For example troff and other text processing tools treat two successive backslash characters \\ as denoting a single backslash in the text to be output. The first backslash is the escape character, protecting the second one.
+
+The Escape construct addresses such cases. The first character that follows Escape (after one or more blanks or tabs) is the character to be escaped. The string after the vertical bar is the replacement for that character.
+
+Here for example is an escape entry for the backslash in tools that need to escape it through another backslash:
+
+==Special characters and strings==
+
+EFF uses Eiffel-like conventions, based on the percent sign, for control characters appearing in Replacement parts of entries. Two of these conventions have just been noted: % * to represent an asterisk and %- to represent a dash that does not introduce an Eiffel comment. In addition:
+* %| denotes a vertical bar. (This is necessary since EFF uses | by itself in each entry to separate the Construct from the corresponding Replacement.)
+* %N (recommended form) or %n denotes a new line.
+* %T (recommended form) or %t denotes a tab.
+* %% denotes a percent sign.
+* % (percent followed by a space) denotes a space. This is equivalent to just a space, but more visible.
+
+If c is not one of the characters for which special conventions have been listed, % c denotes the character c itself.
+
+A multi-line entry uses the Eiffel convention for string continuations: % at the end of a line to signal that there is a continuation; a continuation line begins with zero or more spaces and tabs followed by a % ; the characters after the % are the continuation of the string.
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/browsing-features.wiki b/documentation/18.11/eiffelstudio/Tutorials/browsing-features.wiki
new file mode 100644
index 00000000..c4c70a05
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/browsing-features.wiki
@@ -0,0 +1,95 @@
+[[Property:title|Browsing Features]]
+[[Property:weight|-6]]
+[[Property:uuid|2c0b0a6c-08e8-fdbc-1eab-e2d87b01ce48]]
+Let us get back to EiffelStudio. Before studying the documentation generation we saw how to display properties of '''classes'''. It's also interesting to explore the properties of '''features'''.
+
+There are two tools with similar sounding names that we will use to explore features:
+# The [[Features Tool|Features tool]] (plural) which provides a list of the immediate features of the class on which the development window is targeted. This tool is located by default in the vertical pane on the right hand side of the development window.
+# The Feature tool (singular) which allows you to explore the properties of some particular feature. By default, the Feature tool is available as a tab on the lower pane of the development window along with the Class tool, Outputs tool, and others.
+
+Your Development Window should still be targeted to class LIST, from the last view, Routines, that you displayed on it. If you've lost it, just retarget a Development Window to this class.
+
+Let's start by making the [[Features Tool|Features tool]] visible. To see the Features tool click on the tab labeled [[Image:features-tab]] (note that this is the plural "Features" versus the singular "Feature").
+
+If the tab for the Features tool is not visible, bring it back by following the menu path:
+
+View --> Tools --> Features
+
+
+While we are at it, let's get make the Feature tool visible as well. Click on the tab on the lower pane that's labeled [[Image:feature-tab]]. As with the Features tool, if the Feature tab is missing, you can use the menu path to restore it.
+
+One more thing, and we'll look at some features. If you restarted EiffelStudio since you worked through the [[Viewing Classes]] section, you may have to select Link Context Tool again from the View menu.
+
+
+==Targeting to a feature==
+
+The list of features, organized by feature clauses, appears in the Features tool:
+
+[[Image:es gt features tool 01]]
+
+The class only has a few immediate features because most of its interesting features are inherited. Make sure the Editor tool is tall enough (as on the above figure) and click the feature forth, the last one, in the Feature Tree on the left. This makes the feature the Editor tool's current target, and scrolls the text to its declaration:
+
+[[Image:es gt features tool 02]]
+
+Note how both of the top target fields are now filled: the first one shows the target class, LIST, and the second one shows the target feature, forth.
+
+
+==Basic feature information==
+
+Now let's look at the views of the feature forth provided in the Feature tool.
+
+A view of forth is already visible in the Feature tool. By default, it is the Flat view.
+
+[[Image:es gt feature tool 01]]
+
+The flat view of a feature, similar in concept to the flat view of a class, gives the full text of a feature, taking into account any inherited precondition or postcondition clauses. Here the feature as declared in the class appears in the top Editing Tool, with no precondition and an ensure then postcondition clause. But it's a redefinition of an inherited feature; the flat view in the bottom Context Tool shows the full precondition, inherited from the ancestor LINEAR, as well as the postcondition from LIST.
+
+Flat is just one of the available Feature Views, shown by the buttons on the toolbar of the Feature tool.
+
+[[Image:es gt feature tool toolbar buttons 01]]
+
+You can mouse-over the different buttons to see the views they represent.
+
+Just to the left of Flat, Basic Text gives the feature text, fully clickable.
+
+
+==Who calls this feature?==
+
+To the right of Flat is Callers. Try it now by clicking the corresponding button. You may have to scroll down some in the display to see the series of entries show in the image below;
+
+[[Image:es gt feature tool callers 01]]
+
+This view shows all the places in the system that call the routine, or one of its redefinitions. Such information can be invaluable for debugging in particular. The successive paragraphs correspond to the various versions of forth in class LIST, its ancestors and its descendants. Reading from the top we'll examine a few entries:
+* The version from LIST is called in LIST itself by the function is_equal.
+* The version from LIST is called in routines in two debugger classes RT_DBG_CALL_RECORD and RT_DBG_COMMON
+* The version forth from MULTI_ARRAY_LIST is a version in a descendant of LIST, and is called by three routines of MULTI_ARRAY_LIST itself: duplicate, put_right, and remove_right.
+* Although it is not shown in the figure, if you scroll around some, you will find cases in which a descendant of forth has been renamed and that renamed version is called. For example child_forth from LINKED_TREE is descendant version of forth and is called by routines in LINKED_CURSOR_TREE and LINKED_TREE.
+
+The following five view buttons are similar except that they let you specify what kind of callers you are looking for, or what is being called by the currently selected feature. Feel free to explore these views.
+
+
+==What happens to my feature through the inheritance hierarchy?==
+
+After the caller/callee views, the next view button is Implementers.
+
+This is a very useful view, showing all the ancestors and descendants of LIST that provide a separate version of forth, including the original introduction of this feature in LINEAR and subsequent redeclarations (redefinitions or effectings). The mention (version from) signals the version applicable to the current class, here LIST.
+
+Since all class and feature names on these views are hyperlinks, you can display any of the listed versions in a new Development Window by control-right-clicking it (we will see shortly how to display it in the ''same'' tool). Right-click on the feature name forth on the line that reads MULTI_ARRAY_LIST forth. This brings up a context menu and chose Show --> Text. The tool is now targeted to the routine forth from MULTI_ARRAY_LIST, so that you can see the implementation of the routine in that class.
+
+We still have two unexplored views, Ancestor versions and Descendant versions. Click the first of these to obtain the ancestor versions of forth from MULTI_ARRAY_LIST.
+
+The format is self-explanatory: for each ancestor of MULTI_ARRAY_LIST that has a version of MULTI_ARRAY_LIST 's forth feature, it indicates the name of that feature -- which could be something else than forth as a result of renaming, although here this happens only in descendants, not ancestors -- and the version of the feature applicable to the given class.
+
+In the case of feature merging (combining several features inherited from different parents, in conformance with the rules of the language) there could be more than one history branch, in this case each branch is labeled Branch #X.
+
+The next button, Descendant versions, similarly tells you all that happens to a feature in the descendants of the current class.
+
+
+==Who has the same name?==
+
+The last button, Homonyms, displays all the features of the system which, related or not to the current feature by redeclaration, have the same name. You can then explore any such feature to see if the relationship is more than casual.
+
+In any system or library that takes advantage of inheritance and its associated mechanisms -- renaming, redefinition, effecting, undefinition, multiple and repeated inheritance, polymorphism, dynamic binding -- the feature browsing facilities that we have just explored are invaluable to track what happens to features. What makes them even more precious is their connection with the rest of the browsing and documentation capabilities, especially the pick-and-drop which we will now study.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/command-line-compiler.wiki b/documentation/18.11/eiffelstudio/Tutorials/command-line-compiler.wiki
new file mode 100644
index 00000000..2d56c99a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/command-line-compiler.wiki
@@ -0,0 +1,10 @@
+[[Property:title|The Command-Line Compiler]]
+[[Property:weight|4]]
+[[Property:uuid|62bd8d62-a734-3ec0-9533-eaa096e7b81f]]
+Along with compilation from within EiffelStudio, it is possible to start compilation from a command line (shell). This is useful in particular to recompile your system automatically as part of a script.
+
+Click [[EiffelStudio: Using command line options|here]] to see how to use the command line compiler and the set of supported options.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/compiling-and-executing-system.wiki b/documentation/18.11/eiffelstudio/Tutorials/compiling-and-executing-system.wiki
new file mode 100644
index 00000000..509942a3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/compiling-and-executing-system.wiki
@@ -0,0 +1,56 @@
+[[Property:title|Compiling and Executing a System]]
+[[Property:weight|-12]]
+[[Property:uuid|58494be3-f29f-3a15-a27e-e635bdc71c53]]
+EiffelStudio first comes up with a window and a dialog on top of it; the dialog looks like this (from here on the look-and-feel will be slightly different on platforms other than Windows, but the content will be the same):
+
+[[Image:es gt open 01]]
+
+
+As this is our first project we want to "Add Project...". We could also
+* "Create project", which would let you select one among the common schemes -- basic application, graphical Windows application, graphical multi-platform application, Microsoft .NET application -- and set up everything for you.
+* "Open project", which would let you open a previously added project.
+
+In future sessions you'll probably use "Create project" for a new project, as it takes care of generating a root class and configuration file for you, and Open project" to open an existing project.
+
+Right now you first have to add the project, so click on the Add Project... button. This brings up a File Explorer inviting you to select an ECF file. The file you want is the file
+
+ simple.ecf
+
+
+in the directory "YOURDIR", (either $ISE_EIFFEL\examples\studio\tour or the copy that you have made). The ".ecf" file is an Eiffel Configuration File which contains the information necessary for construction of an Eiffel project.
+
+So, use the File Explorer to find and select the file simple.ecf.
+
+[[Image:es gt open 02]]
+
+
+Click the button labeled Open to confirm. This starts compilation of your project.
+
+During Eiffel compilation, you can observe the successive compilation steps, or "degrees", in the [[Outputs tool]]. The bulk of our little project is the EiffelBase library, which the EiffelStudio installation procedure has precompiled; as a result, there are only a few extra classes to compile, and the process is almost instantaneous on a state-of-the-art computer.
+
+
+{{note|As a frame of reference, on a Toshiba Satellite laptop, mobile dual core 1.73 GHz, 1 GB memory, running Windows Vista, this Eiffel compilation takes about 3.5 seconds. }}
+
+After Eiffel compilation completes you will see the message
+
+ Eiffel Compilation Succeeded
+
+in the Outputs tool.
+
+At this stage your project has finished compiling.
+
+So, congratulations! You have successfully compiled your first Eiffel project. More precisely your project has been "melted". Strange terminology, you may think; in a [[How EiffelStudio Compiles|later section]] we'll see the derivation of the names used in the compilation process.
+
+==Executing the system==
+
+Our system doesn't do anything very exciting, but let's execute it anyway. Find and click the Run button ( [[Image:debug-run-icon]] ) on the toolbar at the top of the EiffelStudio window.
+
+This little application doesn't use graphics or any other fancy stuff. It simply creates some objects and displays some information. Output is accomplished by using the default Eiffel I/O features (from the EiffelBase classes ANY and STANDARD_FILES), and that output goes to a console. On Unix/Linux and OpenVMS it's the window from which you started EiffelStudio. On Windows, by default, it's a new console window that comes up when and if the system does its first output operation, and stays up you dismiss it:
+
+[[Image:es gt execute 01]]
+
+
+The message "Press Return to finish the execution..." would not appear if you executed the system from outside of EiffelStudio, for example from a command line. Its purpose within EiffelStudio is clear: to let you see the console output; without it, the console would go away at the end of execution. (None of this applies to Unix/Linux/OpenVMS because no new console window was created when we executed the system.)
+
+Before closing the console window, if you look at the main EiffelStudio window (by moving the console window aside) you will notice that it looks different than it did before. This is because EiffelStudio is now in debug mode, so it shows the fields useful in monitoring, controlled execution, and debugging. But we'll look at all this later. For the moment just dismiss the console by following the advice to "Press Return to finish the execution...": hit the Return or Enter key.
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/computing-project-metrics.wiki b/documentation/18.11/eiffelstudio/Tutorials/computing-project-metrics.wiki
new file mode 100644
index 00000000..5cb20342
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/computing-project-metrics.wiki
@@ -0,0 +1,51 @@
+[[Property:title|Computing Project Metrics]]
+[[Property:weight|0]]
+[[Property:uuid|8d1a3556-d9a2-0ac8-4d54-458f18cb56ad]]
+In earlier sections we saw how EiffelStudio provides extensive documentation on your systems. That information was qualitative. Project managers and developers will also be interested in quantitative information about their projects. You can get such information through the Metrics tool, which enables you to perform a number of operations, detailed over the next few pages:
+* Apply predefined metrics -- number of classes, number of invariants, number of features, number of compilations so far and many others -- to components of a system at various levels including feature, class, cluster, entire system.
+* Define new metrics, through mathematical formulae or boolean selection, and apply them to your project.
+* Store measurement results, as well as metric definitions, into an XML archive that can be stored locally or made available on the Web for future reference.
+* Compare the measurements on a system to those on record locally or on a Web site. Eiffel Software has released on its own site an archive recording the metric properties of its basic libraries, available to any other project for comparison.
+
+==Methodological observations==
+
+Although the field of software metrics is a rich one with an abundant literature, its methodological basis is sometimes subject to question. One should resist the tendency to believe numbers just because they are numbers ("lies, damn lies, and metrics").
+
+Software engineers and their managers expect, however, to reap at least some of the benefits that precise quantification has brought to other engineering fields. Such is the purpose of software metrics, defined as '''quantitative estimates of product and project properties'''. Object-oriented development, with the rich software structures that it induces, is a particularly amenable to metric analysis. Even when some of the measures do not seem to bring much by themselves, comparing them to those of other projects may reveal significant peculiarities of a system or of some of its parts.
+
+The metrics capabilities of EiffelStudio were designed with these observations in mind. They result from a conservative approach, where no metric is provided without a credible assumption that it reflects some meaningful project or product attribute. For example, you will find a way to define a new metric as a linear combination of existing ones, but not a way to compute arbitrary arithmetic operations, since it isn't clear that -- say -- multiplying two metrics ever makes sense.
+
+==Metric terminology==
+
+The following terms are used in the presentation of EiffelStudio metric mechanisms.
+
+A '''metric''' -- not to be confused with a measure -- is a quantitative property of software products or processes whose possible values are numbers. A '''measure''' is the value of a metric for a certain product or process.
+
+For example, we can evaluate the metric "number of classes in the system", called just Classes, by counting the classes in our system. This yields a measure.
+
+We may distinguish between '''product''' ''' metrics''', which measure properties of the elements being turned out (code, designs, documentation, bug reports...) and '''process''' ''' metrics''', which measure properties of the process used to turn them out (salaries, expenses, time spent, delays...). The current metric facilities of EiffelStudio are primarily product-oriented but include a process metric: "number of compilations".
+
+Any metric should be relevant: related to some interesting property of the processes or products being measured, such as cost, estimated number of bugs, ease of maintenance...A '''metric theory''' is a set of metric definitions accompanied with a set of convincing arguments to show that the metrics are relevant. Neither EiffelStudio nor this manual provide a metric theory.
+
+The numbers yielded by measures are meaningless unless we describe what they refer to. Every metric is relative to a certain '''unit''', specified as part of its definition. For example the unit for a metric that counts classes, such as Classes, is called class.
+
+EiffelStudio provides a set of predefined units. Some simply serve to count occurrences of certain construct specimens in the software; examples include group, class, feature, line, ... The metric ratio describes metrics whose values are divisions, for example "average number of classes per cluster", obtained by dividing the number of classes by the number of classes.
+
+A metric can be computed over a scope. This scope is defined using a '''domain'''. A domain is a set of program elements. You build up a domain by adding development objects to a list. These development objects are things like application targets, clusters, libraries, classes, and features.
+
+
+==Metric tool interface==
+
+The following links will take you out of the Guided Tour and into the EiffelStudio Reference:
+
+* EiffelStudio reference: [[Metric Evaluation Panel|Metric Evaluation panel]]
+* EiffelStudio reference: [[Detailed Result Panel|Detailed Result panel]]
+* EiffelStudio reference: [[Metric Definition Panel|Metric Definition panel]]
+* EiffelStudio reference: [[Metric History Panel|Metric History panel]]
+* EiffelStudio reference: [[Metric Archive Panel|Metric Archive panel]]
+
+
+{{SeeAlso| The EiffelStudio Reference section on the [[Metrics Tool]] for more comprehensive discussion and precise definitions of terminology.}}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/copying-example-files.wiki b/documentation/18.11/eiffelstudio/Tutorials/copying-example-files.wiki
new file mode 100644
index 00000000..2e7bd8a8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/copying-example-files.wiki
@@ -0,0 +1,19 @@
+[[Property:title|Copying the Example Files]]
+[[Property:weight|-14]]
+[[Property:uuid|bb8ff7d7-2e93-d150-339c-d9afb967bc98]]
+{{note|If you are using Eiffel on a personal computer, you have the option of working directly in the installation directory and would not necessarily need to make copies of files as per the present section. If you choose to work directly in the installation directory, skip this section and go on to the next section, [[Starting EiffelStudio and Opening a Project]]. If you work under Unix or OpenVMS, or may have to share the Eiffel installation with other users, do not have write permissions on the installation, or want to keep the installation unchanged, then please do read the present section and apply its instructions.}}
+
+If you are going to work on a copy, choose or create a directory of your own; let's call it YOURDIR for the rest of the discussion.
+
+To copy all the files of the example to YOURDIR:
+* On Windows, open a Windows Explorer, go to $ISE_EIFFEL\examples\studio\tour , select all the files in that directory, and drag-and-drop them to YOURDIR .
+* On Unix execute the shell command
+
+cp $ISE_EIFFEL/examples/studio/tour/* YOURDIR
+
+* On OpenVMS execute the command
+
+copy $ISE_EIFFEL:[examples.studio.tour]*.* YOURDIR
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/customizing-tools-layout-and-toolbars.wiki b/documentation/18.11/eiffelstudio/Tutorials/customizing-tools-layout-and-toolbars.wiki
new file mode 100644
index 00000000..4c361a7d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/customizing-tools-layout-and-toolbars.wiki
@@ -0,0 +1,267 @@
+[[Property:modification_date|Tue, 21 Aug 2018 18:55:21 GMT]]
+[[Property:publication_date|Tue, 21 Aug 2018 18:55:21 GMT]]
+[[Property:title|Customizing the tools layout and toolbars]]
+[[Property:weight|-8]]
+[[Property:uuid|eb75573e-c653-9290-376a-063cb5fa32d4]]
+==Overview==
+
+We saw in [[Viewing Classes]] how EiffelStudio panes could be resized and how the Auto Hide feature works for a pane.
+
+Now let's look at some other ways in which you can customize the layout the EiffelStudio tools.
+
+The first time you use EiffelStudio, it will display a '''default''' tools layout that reflects the preferences of a majority of users. Typical user preferences change, so don't be too surprised if things look just a little different after installing a new version.
+
+As you gain more experience with EiffelStudio, you may want to adapt the layout to your personal preferences. For example, you may always want to have certain tools visible which were not visible by default. Once you make a change like this, EiffelStudio generally remembers that change and it will be in force the next time you open EiffelStudio. But you can also save a complete tools layout and recall it at a later time. For example, you might have two or three different development '''modes''' that you work in, and have a saved tools layout for each.
+
+The ways in which the EiffelStudio tools can be arranged are nearly endless. You can make tools visible or hide them. You can make almost any tool a tab in almost any pane. You can re-order the tabs for a pane. You can pull tools completely out of EiffelStudio as free-floating windows. You can create additional panes as needed. Almost any pane can be "pinned" open or "auto hidden".
+
+
+==Reverting to the default layout==
+
+If you changed the layout and are not pleased with the result, you can revert to the default. Use the menu path:
+
+View --> Tools Layout --> Reset Tools Layout
+
+to reset EiffelStudio to the default tools layout.
+
+[[Image:es gt reset tools layout 01|Reset Tools Layout]]
+
+Figure 1
+
+
+So at the end of the section [[Viewing Classes]] we manually reversed the changes that we had made to the layout to make additional space. We could have just selected Reset Tools Layout to restore the default layout.
+
+You can try this now and see the effect. Your tools layout will probably not change very much.
+
+You can see in the image above that you would also follow that menu path in order to save a tools layout or to activate one that you had previously saved.
+
+
+==Minimizing, maximizing, restoring, and closing tools==
+
+At the right end of the top bar for each tool you will see buttons that help you control the way the tool and its containing pane are displayed. Here are the icons and what they mean:
+
+* [[Image:minimize-icon]] Minimize this pane.
+* [[Image:maximize-icon]] Maximize this pane.
+* [[Image:restore-icon]] Restore this pane to its previous size.
+* [[Image:auto-hide-icon]] Set this pane to Auto Hide.
+* [[Image:close-icon]] Close this tool.
+
+There are a few subtleties you should understand when using these:
+
+The pane in which the Editing tool resides is special. It is the only pane that supports '''minimize'''. And it does not support Auto Hide, nor Close. We'll learn a little more about this in the section on [[#Docking|Docking]].
+
+When you maximize a pane it fills all available space. At the same time, its maximize icon changes to the Restore icon. When you click Restore, the pane relinquishes the extra space it annexed when you maximized it, and then returns to its original size and location.
+
+The Close button will close only the current tool. So, that tool goes away, but any other tools in the same pane remain. However, when you close the last tool in a pane, the pane itself disappears and the space is absorbed by other panes. Remember that you can re-display closed tools through the menu path:
+
+View --> Tools --> tool name
+
+
+{{note|EiffelStudio supports a number of [[EiffelStudio: Key shortcuts|'''key shortcuts''']] (sometimes called '''accelerators''', some of which can be useful for changing aspects of the Development Window. For example, CTRL+M will toggle the Editing pane between Maximize and Restore, and CTRL+N will create a fresh Development Window. Keyboard shortcuts themselves are tailorable in the [[Keyboard shortcuts preferences|EiffelStudio Preferences]].}}
+
+
+==Re-ordering tabs==
+
+Within a particular pane, it is possible to have many tools visible. Each will be represented as a tab at the bottom of the pane. For example, the pane that contains the Class and Feature tools has the following tabs by default in the version that is current at the time of this writing:
+
+
+[[Image:es gt default pane tabs|A default set of tool tabs]]
+
+Figure 2
+
+
+One easy way to customize your tool layout is to change the order of these tabs if you prefer. Just drag a tab horizontally to a new position to the right or left of where it originally was located and release it. As you drag the tab, you'll see it relocate itself, so you'll know just were it will end up when you release it.
+
+So suppose that you felt that it would be more convenient to your style of work to have the Outputs tool be the left most tool, versus the Class tool. Just drag it over there ... and now your tabs should reflect the new order:
+
+
+[[Image:es gt reordered pane tabs|Tool tabs after moving Outputs tool to the left end]]
+
+Figure 3
+
+
+Try this now, if you'd like but be careful to move the tab '''only''' horizontally along the row of other tabs. If you move it off the row of tabs, you may inadvertently enter the extraordinary, but more complex realm of '''docking''', our next topic. Just in case you do get off the row of tabs and you see strange icons appearing on the Development Window, don't release the mouse button, just press the ESC key to cancel the dragging action.
+
+
+==Docking==
+
+The docking ability within EiffelStudio is arguably the most powerful tool at your disposal for tailoring the tools layout to your liking. Docking can be a little daunting at first, but once you understand a few concepts, you will likely find it both easy to use and helpful.
+
+Maybe the first thing to know about docking is that EiffelStudio gives you the option of locking elements of the interface against inadvertent changes in docking. Following the menu path:
+
+View --> Docking Lock
+
+you can choose to lock (or leave docking enabled) on toolbars, tool panes, and/or editing panes. So, if you get things just the way you want them, in addition to save your tool layout, you may want to lock the elements against additional docking changes.
+
+Perhaps the second thing to understand, if you haven't already guessed, is that, for docking purposes, the EiffelStudio interface supports toolbars and two different types of panes. One type of pane is the one in which the Editing tools reside, which we'll call an '''editing pane'''. The other is the type of pane is the '''tools pane''' where other tools can be docked.
+
+So, with this in mind, we can take another look at the EiffelStudio layout.
+
+
+[[Image:es gt a development window 02|Default tools layout]]
+
+Figure 4
+
+
+Here we see the editing pane with one editing tool targeted to the class LIST.
+
+There are two tools panes. Docked in one are the Class, Feature, Outputs, and Error List tools. In the other are the Groups, Features, and AutoTest tools ... and to the right of the AutoTest tab we see the icon ([[Image:continued-icon]]) and a number indicating that there are more tabs, but no room to display them. In this case there is only one more tab; it is for the Favorites tool. Of course, if the that tools pane were a little wider, we would see the tab for the Favorites tool and the "continued" icon and the number would disappear.
+
+It turns out that there are actually two more tools panes in this layout. One contains the Diagrams tool and the other contains the Dependency, Metrics, and Info tools. These two panes are Auto Hidden so we only see the minimum evidence that they exist ... just their tabs. You can tell that these are two different panes by how the tabs are distributed. Diagram is somewhat "off by itself" whereas Dependency, Metrics and Info are grouped closely together.
+
+As we learned in [[Viewing Classes]] you can make one of these tool panes visible by moving your cursor over it, or clicking on one its tabs. The pane will expose itself for the length of time that the cursor remains over it, then recede into hiding again when the cursor is moved away.
+
+Try this now with the Diagram tool. The pane housing the diagram tool appears from the bottom of the screen. Notice also that it has occluded the pane containing Class, Feature, Outputs, and Error List tools, and about half of the pane containing the Groups, Features, AutoTest, and Favorites tools.
+
+
+[[Image:es gt development window diagram tool unhidden|Diagram tool unhidden]]
+
+Figure 5
+
+
+So, Auto Hide works well to keep panes that we might not use very often out of the way ... but still pretty handy.
+
+===Floating a pane===
+
+Let's dive into our first docking (or maybe undocking) experience. Suppose, though, that you were in the analysis and design phase of a project and you wanted the Diagram tool to be open and available at all times. Of course, you could move your cursor over it to "un-hide" it, then pin it open. But then it would be covering the other tool panes which we use often.
+
+One great capability of the docking mechanisms in EiffelStudio is that you can disconnect, or '''float''', a pane away from the rest of the EiffelStudio development window. Let's float the hidden pane that now contains just the Diagram tool out to the right of the entire Development Window.
+
+In order to float this tool pane, we first have to set Auto Hide off.
+
+
+{{note|In versions of EiffelStudio starting with version 6.6, it will no longer be necessary to set Auto Hide off before moving a pane. }}
+
+
+So move your cursor over the Diagram tab and the pane should expand (if it does not make it self visible, then click on the tab). Then move to the upper right and click the horizontal pushpin icon ([[Image:auto-hide-off-icon]]) to turn off Auto Hide and pin the pane open.
+
+
+[[Image:es gt diagram tool pane pinned 01|With Auto Hide off, occluded panes become visible.]]
+
+Figure 6
+
+
+You may notice that a pane that is auto hidden may, when it expands, occlude other panes. However, when you turn of Auto Hide by pinning the pane open, any panes that it had occluded will become at least minimally visible. In the case of this example, the pane containing the Class tool was temporarily covered by the expanded Diagram pane, as was the row of tabs on the pane containing Groups. When you pin the Diagram pane open, the title bar for the pane with the Class tool becomes visible, and the pane with the Groups tool gets shortened to fit above the Diagram tool's pane.
+
+It is at this point that new EiffelStudio sometimes have problems understanding what's happening. So read the following description of what's going on before you actually try to move the pane ... and don't forget that you can always reset the tools layout if things don't go the way you intended.
+
+Now that we've turned off Auto Hide for Diagram's pane, we can move the pane and either re-dock it somewhere else in the development window or, as is our intention, "float" it as a window separate from the Development Window.
+
+To undock and re-dock or float a pane, you drag the pane by its title bar (but don't do this quite yet). As soon as you begin to drag the pane, you will see the look of the Development window change:
+
+
+[[Image:es gt docking in progress 01|Dragging a pane to dock]]
+
+Figure 7
+
+
+In the figure you can see the cursor arrow on the title bar of the pane. The pane has been dragged very slightly and EiffelStudio has sensed that we want to move the pane from its current position. In response, EiffelStudio has overlaid the Development Window with a set of icons that represent valid docking targets for the pane being moved. We'll look closer at those in a moment.
+
+But for now, notice the large dark, semi-transparent '''docking feedback''' area at the bottom left of the image above. This represents what will happen to your pane if you release the mouse button at the current time. So in the case of the figure above, releasing the mouse button immediately will '''float''' the pane on top of the Development Window. This is nearly our intent, although we want to move the floating pane out to the right of the Development Window. So, without releasing we drag the pane off the top and to the right of the Development Window, then release it.
+
+
+[[Image:es gt diagram tool pane floating 01|800px|Diagram tool floating]]
+
+Figure 8
+
+
+So go ahead and try it now. If you've pinned the pane with the Diagram tool open, then drag the pane by its title bar out to the right and off the Development Window and release it.
+
+===Docking a pane===
+
+The problem that some users have when first trying to adjust the tool layout using docking (without the benefit of this Guided Tour) is that once they move a pane, it's not obvious to them what to do next to get the effect that they want. As a consequence, they attempt to put things back the way that they were when they first dragged the pane ... and usually they aren't successful. Remember that you can always press the ESC key to cancel the drag while still holding the mouse button down.
+
+Now let's take a look at the target graphics and what they mean, and we'll do an exercise in which we put the pane with the Diagram tool back where it was originally.
+
+In Figure 7 above, you can see the docking target graphics. You see this figure:
+
+
+[[Image:docking-target|Docking target]]
+
+Figure 9
+
+
+in two places, and four smaller figures:
+
+[[Image:docking-target-top|Top]] [[Image:docking-target-left|Left]] [[Image:docking-target-right|Right]] [[Image:docking-target-bottom|Bottom]]
+
+Figure 10
+
+
+one near each border of the Development Window.
+
+The graphic in Figure 9, shaped like a "plus" sign or cross, will appear in any pane which is a valid docking target for the pane you are moving. So, in Figure 7, those panes are the pane housing the Groups tool and the one housing the Class tool.
+
+The center of the graphic represents the target pane itself. So, if you drag your pane over the center of the graphic and release it, your pane will now become a new tab in the target pane. You can see the docking feedback area hinting to this effect. In the figure below, the pane with the Diagram tool was dragged over the center of the target graphic on the tool with the Class pane. Notice that the whole pane is covered with the docking feedback area, which even shows the hint of a new tab.
+
+
+[[Image:es gt add tab to pane|Hovering over center target will add a pane as a new tab]]
+
+Figure 11
+
+
+If we were to release the pane at this point, it would dock as a new tab along side Class, Feature, Outputs, and Error List. In this case, the pane we are moving contains only one tool, Diagram, but if it contained multiple tools, each of those tools would become a new tab in the target pane.
+
+But remember that our goal in this exercise is to restore the pane holding the Diagram tool back to its original position. So, making it a tab in the pane with Class, won't achieve that goal. Let's look at some other possibilities.
+
+What happens if we drag our pane over one of the tips of the cross shaped target graphic? These targets will allow us to split the target pane into two panes, one containing the original content and the other containing the content of the pane we are moving. The original pane will be split according to which tip of the cross you drop your pane onto. For example dropping on the right tip will split the target pane into left and right panes an put your pane on the right. Again you can see this depicted in a preview when you hover over one of these, as shown below.
+
+
+[[Image:es gt split pane right|Hovering over the tip of a cross causes the target pane to be split and the new pane added adjacent]]
+
+Figure 12
+
+
+It's pretty obvious that this will not get Diagram back to its original location. The only options left unexplained are the four graphics shown in Figure 10. These each look like a detached version of one of the tips of the cross shaped graphic, but they are located along the four edges of the Development Window. If you drop your pane on one of these it will add it as a new pane along the corresponding margin of the Development Window.
+
+We know that originally our pane with Diagram was in Auto Hide mode at the bottom of the Development Window.
+
+So, drag the pane from its floating position and drop it at the bottom of the Development window on this graphic:
+
+[[Image:docking-target-bottom|Bottom]]
+
+
+The effect is that now your pane has been docked back into the Development Window at the bottom. The only thing left to do now is turn Auto Hide back on by clicking the push-pin icon. Now the pane that houses the Diagram tool is back in its original place in the layout.
+
+
+===Docking and the Editing pane===
+
+As we learned earlier in [[#Minimizing, maximizing, restoring, and closing tools|Minimizing, maximizing, restoring, and closing tools]], the pane in which the Editing tools reside has special properties and restrictions not present for panes housing other tools. It's the same for docking. Just as you can't close the Editing pane, you can't re-dock it in any other location. You can't dock other tools, the Feature tool for example, in the Editing pane (notice that you don't get a targeting cross in the Editing pane when you drag a pane).
+
+Although the Editing pane can house only Editing tools, you ''can'' re-order the tabs for Editing tools and you ''can'' re-dock Editing tools by splitting the Editing pane. For example you might want to look at two classes side by side in two different panes. In the image below, after opening tabs for classes LIST and CHAIN, we dragged the tab for CHAIN and dropped over the right tip of the cross shaped graphic that appeared in the Editing pane. Then we put the pane Groups and the one with Class in Auto Hide to enlarge the size of the Editing tools. This allows us to view LIST and CHAIN side by side.
+
+
+[[Image:es gt side by side editing|Viewing two classes side by side in the Editing pane]]
+
+Figure 13
+
+
+===Docking and toolbars===
+
+You can drag toolbars and re-dock them in different places. You can float toolbars in the same way you would do a tool pane. In the figure below, the Project toolbar has been dragged away from its default home to the right of the Standard Buttons toolbar. Now it's over undockable space, so if released here it will float, just as we saw with tool panes.
+
+
+[[Image:es gt redocking project toolbar|Dragging the Project toolbar around]]
+
+Figure 14
+
+
+When you move a toolbar, drag it by its "head". The head is indicated by an icon ([[Image:toolbar-head-icon]]) that looks like a vertical row of dots at the left end of each toolbar.
+
+The figure above shows that there are two "rows" available for placing toolbars. This is the way it is in the default layout. But the number of rows can be expanded if needed. So, if you drag a toolbar toward the bottom of the toolbar area, you will see that a new row will become available in which you can dock the toolbar that you are moving.
+
+
+[[Image:es gt redocking project toolbar new row|Dragging a toolbar to a new toolbar row]]
+
+Figure 15
+
+
+In the figure above, the Project toolbar has been dragged near the bottom of the toolbar area, and a new toolbar row has opened up to allow the Project toolbar to be docked there.
+
+
+==Customizing toolbars==
+
+In addition to using the docking facilities to move toolbars around to suit your work style, you can also customize each toolbar by adding, removing, or re-ordering the buttons on that toolbar. See more about this on the page [[Toolbar customization]].
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/debugging-and-run-time-monitoring.wiki b/documentation/18.11/eiffelstudio/Tutorials/debugging-and-run-time-monitoring.wiki
new file mode 100644
index 00000000..12877521
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/debugging-and-run-time-monitoring.wiki
@@ -0,0 +1,127 @@
+[[Property:title|Debugging and Run-time Monitoring]]
+[[Property:weight|-2]]
+[[Property:uuid|a53f6a74-7145-35ab-ed5e-2905aeb88774]]
+
+The next set of EiffelStudio capabilities enables you to control and monitor the execution of your systems. The obvious immediate application is to debugging; but the more general goal is to let you follow the execution of your systems, explore the object structures, and gain a better understanding of the software.
+
+
+==A reminder about debugging in Eiffel==
+
+Before looking at debugging facilities don't forget that debugging in Eiffel is different. The presence of Design by Contract mechanisms gives the debugging process a clear sense of direction. The speed of the recompilation process makes it easy to recompile after a change; after getting rid of syntax and validity errors, you run the system again, and remaining errors are often caught as violations of contract clauses -- routine preconditions, routine postconditions, class invariants.
+
+The facilities to be described now are also useful when you find such an error, as they will help you study its execution context. In fact, one of the characteristics of the debugging mechanism is that there is no "debugger" proper, no more than there is a "browser"; you have instead a set of facilities supporting controlled execution and debugging. This means for example that:
+* While debugging, you can access all the browsing capabilities to explore the features and classes surrounding the cause of an error.
+* While browsing, you can launch or resume execution, and follow its progress through the debugging facilities.
+* If execution stops on an exception -- for example, an assertion violation or arithmetic overflow -- you have all the environment's facilities at your disposal to understand what happened.
+
+
+==Setting breakpoints==
+
+To control the execution you will set breakpoints, indicating places where you want to interrupt the execution. You may set a breakpoint on an individual instruction of a routine, on the routine's precondition or postcondition, or on the routine as a whole, meaning its first operation (precondition or instruction).
+
+A group of icons on the Project Toolbar help control breakpoints. They are known in EiffelStudio terminology as "''buttonholes''", meaning that they can serve both as buttons (you can click them to get some functions) and holes (you can pick-and-drop into them to get some other functions).
+
+[[Image:es gt debug buttons|Run and debug buttons]]
+
+The labels correspond to the icons' use as buttons: enable all set breakpoints ([[Image:16x16--breakpoints-enable-icon]]), disable them all ([[Image:16x16--breakpoints-disable-icon]]), remove them all ([[Image:breakpoints-delete-icon]]), and display information on current breakpoints using the Breakpoints tool ([[Image:debug-show-breakpoints-tool]]). The difference between "disabling" and "removing" is that disabling turns off breakpoints until further notice but remembers them, so that you can later re-enable them, whereas "removing" clears them for good.
+
+Here you also see icons for controlling execution: '''run''' ([[Image:debug-run-icon]]), '''step-by-step''' ([[Image:debug-step-over-icon]]), '''step into routine''' ([[Image:debug-step-into-icon]]), '''step out of routine''' ([[Image:debug-step-out-icon]]).
+
+Target a Development Window to the class TESTROOT and pick-and-drop the name of the procedure make (the first routine, after the declaration of the two attributes o1 and o2) to the '''Enable all''' icon, used here as a hole. This sets and enables a breakpoint on the routine. Click the button labeled '''Show information about breakpoints''' ([[Image:debug-show-breakpoints-tool]]). This will invoke the '''Breakpoints tool''', as shown in the next figure.
+
+[[Image:es gt breakpoints tool 01|The Breakpoints tool]]
+
+This shows that so far you have enabled only one breakpoint. For a finer degree of control, let's look at the feature's flat form. Close the Breakpoints tool, then pick-and-drop make from the Editing Tool to the Feature tool (anywhere in the lower left pane should do; this sets the pane's context to the Feature Tool. Select the '''Flat''' view if that wasn't the last one used:
+
+[[Image:es gt development window breakpoints 01|Breakpoint set in "make"]]
+
+The small circles on the left side of the Flat form indicate breakpoint positions. Empty ones are not set; enabled breakpoints are marked by a circle filled with red. At the moment only one is enabled, corresponding to the first instruction of the routine since, as noted, setting a breakpoint on a routine as a whole means setting it on its first operation.
+
+By (left) clicking on a breakpoint mark, you toggle it between enabled and not set. You can also right-click on a mark to get a [[Breakpoint menu|menu]] of possibilities:
+
+[[Image:es gt breakpoint context menu 01|Breakpoint context menu]]
+
+Try enabling and unsetting a few of these marks; you might get something like this:
+
+[[Image:es gt development window breakpoints 02|Multiple breakpoints: not set; enabled; set but disabled]]
+
+The breakpoint mark for the routine's third instruction, create o2, is filled but not red ([[Image:bp-disabled-icon]]); this means it is set but not enabled. You can obtain this by right-clicking on the mark and choosing '''Disable breakpoint''' on the menu that comes up. Any potential breakpoint will be in one of three states: '''not set''' ([[Image:bp-slot-icon]]); '''set and enabled''' ([[Image:bp-enabled-icon]]); '''set but not enabled''' ([[Image:bp-disabled-icon]]).
+
+Remember, you can see the complete list of enabled and disabled breakpoints by making the Breakpoints tool visible ... which you do by clicking the '''Show information about breakpoints''' ([[Image:debug-show-breakpoints-tool]]) button in the Project Toolbar.
+
+For the remainder of this chapter it doesn't matter which exact breakpoints of make you've set, as long as the one on its first instruction is set and enabled (red-filled circle) as above. Please make sure this is the case before proceeding.
+
+
+==Executing with breakpoints==
+
+To execute, you will use the following Run buttons in the Project toolbar, or the corresponding entries in the '''Execution menu''':
+
+[[Image:es gt debug buttons|Run and debug buttons]]
+
+Most of the buttons shown here are enabled, but at different times some of them will be disabled (grayed out.)
+
+The '''Execution menu''' entries will also remind you of shortcuts: F10 for '''Step-by-step''', F11 for '''Step into routine''', Shift-F11 for '''Step out of routine''', CTRL-F5 for '''Run ignoring breakpoints''', F5 for '''Run with breakpoints''', CTRL-Shift-F5 for '''Interrupt execution''', Shift-F5 for '''Stop execution'''.
+
+[[Image:es gt execution menu 01|Execution menu]]
+
+Start execution of the compiled system by clicking the '''Run''' button ([[Image:debug-run-icon]]). Run actually means "Run and stop at enabled breakpoints." EiffelStudio automatically switches to '''Execution mode''' to accommodate supplementary tools providing debugging information. Execution stops on the breakpoint that you have enabled on the first instruction of procedure make:
+
+[[Image:es gt debug breakpoint reached 01|Stopped at first breakpoint in "make"]]
+
+By default, in Execution mode, EiffelStudio looks a little different. Specifically, the Feature tool now occupies the space that was previously held by the Editing tool. The '''Call Stack''' is in the tall pane on the right, and the '''Object tool''' and '''Watch tool''' are on the bottom, under the Feature tool.
+
+The Call Stack indicates that execution has stopped in make. The Feature tool shows the flat form of that routine, with an icon ([[Image:debug-stopped-on-breakpoint-icon|Stopped on enabled breakpoint]]) to indicate the stop point which execution has reached. The Object tool, which shows the content of current object and (later) related objects. At the moment you can see that:
+* The current object is an instance of class TESTROOT.
+* The class (as you could also see from its text in a Development Window) has two attributes o1 and o2, both declared as type PARENT, for which the corresponding fields in the current object are both void; this is as expected since you haven't yet executed the two creation instructions create {HEIR} o1 and create o2, as they come after the breakpoint.
+* Along with attributes, an Eiffel class may have '''once functions''', executed at most once -- the first time they are called -- in a given session, and from then on always returning the same value. You can see the status of these by expanding the entry "Once routines" in the Object tool. Here the once function io has not yet been called, but after it has it will return an object of type STD_FILES.
+
+The execution-time objects that you may display in the Object tool are our latest kind of EiffelStudio "development object", along with classes, features, explanations, clusters; notice the distinctive icon ([[Image:debugger-object-eiffel-icon]]), a rectangular mesh shape suggestive of an object's division into fields. It appears colored for actual objects and gray ([[Image:debugger-object-void-icon]]) for Void references such as operating_environment.
+
+
+==Monitoring progress==
+
+Click twice on '''Step-by-step''' ([[Image:debug-step-over-icon]]), or press the function key F10 twice. Monitor, in the flat form of make, the marker that shows execution progress; note that the marker always points to the ''next'' operation to be executed. After the two steps, the Feature and Object tools look like this:
+
+[[Image:es gt debug step by step 01]]
+
+The last instruction that you executed is create {HEIR} o1, meaning create an object and attach it to o1, but instead of using the declared type PARENT of o1 use its proper descendant HEIR. As a result, the entry for o1 in the Object tool no longer shows Void but an object of type HEIR. Note that all objects are identified by their addresses in hexadecimal; such an address is by itself meaningless, but enables you to see quickly whether two object references are attached to the same object. The addresses you see as you run the Guided Tour will -- except for some unlikely coincidence -- be different from the ones appearing here.
+
+Note that since the garbage collector compacts memory and hence may move objects around, the address of a given object is not guaranteed to remain the same throughout a session.
+
+To see the details of the object, expand its entry in the Object tool.
+
+
+==From the instance to the class==
+
+Now notice what happens if you pick the type name (HEIR) from the entry for object o1 in the Object tool, and then drop it in the Feature tool above. The context changes from the Feature tool to the Class tool and is retargeted on HEIR. The Class tool has switched to the default format for classes, '''Ancestors''', and is showing the ancestors of HEIR. Click the Feature tab to get back to feature information for the continuation of our debugging session.
+
+
+==Stepping into and out of a routine==
+
+Click '''Step-by-step''' once more to advance just before the call o1.display.
+
+Choosing '''Step-by-step''' again would execute the next step in the current routine, the call o1.display, treating the entire execution of display from class HEIR as a single operation. Assume instead that you want to go ''into'' that routine and follow the details of its execution. For one thing, you might not know that it's a routine of class HEIR, since o1 is declared of type PARENT and it's only through polymorphism, that is, o1 being dynamically of type HEIR at this point, and through dynamic binding, that the execution ends up calling a routine from HEIR. Of course here it's obvious because of the wording of the create a few lines up, but in many cases, especially all those for which polymorphism and dynamic binding are ''really'' interesting, the exact type won't be immediately clear from the neighboring software text.
+
+Click the '''Step into routine''' button (or press F11). This brings execution to the beginning of the appropriate display routine in class HEIR.
+
+[[Image:es gt debug step into 01]]
+
+While you're here notice the Call Stack tool. It shows that we are currently executing feature display of class HEIR, which, as can be seen on the second line of the stack, was called from feature make of class TESTROOT.
+
+Now click '''Step out of routine''' ([[Image:debug-step-out-icon]]), or press Shift-F11 to finish the execution of display. This brings you back to the next instruction of the calling routine, make of TESTROOT.
+
+
+==Terminating==
+
+You may now click the '''Stop execution''' button ([[Image:debug-stop-icon]]), or press Shift-F5, to end execution. The execution-specific tools go away and the display returns to what it was before execution.
+
+
+==Other debugging capabilities==
+
+In this little application nothing runs long enough to give you the time to interrupt it. In a longer-running application you may want to interrupt execution, without necessarily terminating it, while it's running (not stopped on a breakpoint). This is the purpose of the '''Interrupt execution''' button ([[Image:debug-pause-icon]]), which can also be triggered by pressing CTRL-Shift-F5. It will interrupt execution at the closest potential breakpoint position, letting you -- as when execution stops because of an exception -- take advantage of all the debugging and browsing facilities to see what's going on inside your running system. You may then restart execution -- with or without breakpoints, single-stepping, out of the current routine, into the next routine -- by choosing the appropriate Run button
+
+In debugging sessions for more advanced applications, you will also find self-explanatory mechanisms enabling you, in addition to what we have seen, to examine all the objects on the "call stack": arguments and local entities of the current routine, its caller, caller's caller and so on.
+
+The combination of these facilities provides you with a level of ''dynamic'' information on the execution of your system that matches the ''static'' information that the browsing mechanisms studied in preceding sections provide about the system's structure.
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/executing-system-within-and-without-eiffelstudio.wiki b/documentation/18.11/eiffelstudio/Tutorials/executing-system-within-and-without-eiffelstudio.wiki
new file mode 100644
index 00000000..0ecb71f8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/executing-system-within-and-without-eiffelstudio.wiki
@@ -0,0 +1,37 @@
+[[Property:title|Executing a System Within and Without EiffelStudio]]
+[[Property:weight|5]]
+[[Property:uuid|8256398e-d1a9-0471-664a-3225c7dfb306]]
+To complete this study of the compilation process let's see a few more properties of how you can execute an Eiffel system, both in EiffelStudio and as a compiled system that you deliver to its users, who may need to run it without EiffelStudio.
+
+==Arguments==
+
+Our example system is very simple and has no need for execution arguments. In more advanced cases you may want to pass values to the execution, such as a numeric parameter or a file name, so that you can have different executions without changing and recompiling the software.
+
+In the Eiffel text, you can access such run-time arguments through the Kernel Library class ARGUMENTS. There is another technique -- using the arguments to the root creation procedure -- but using ARGUMENTS is the most general way. Any class of your system can inherit from ARGUMENTS and use queries argument_count to know the number of arguments passed to the execution, and argument (i), for i between 1 and argument_count to access the i-th element. Class ARGUMENTS has more features; since you have Eiffelstudio up, you can check the details if you wish (use the contract form).
+
+There are 2 ways to specify execution arguments from within EiffelStudio. The first is through the menu path Execution --> Execution Parameters .
+The second is through the argument dialog which can be opened by right-clicking on any of the debugging or program execution buttons on the main toolbar. The latter is more convenient for quick and easy access to execution arguments.
+
+==Executing from EiffelStudio==
+
+We have seen how to execute a compiled system from within EiffelStudio: choose one of the appropriate execution buttons, with or without breakpoints.
+
+==Executing a finalized system outside of EiffelStudio==
+
+A finalized system can be executed on any computer of the appropriate platform; it doesn't need EiffelStudio. The executable version is in the directory `project_directory/EIFGENs/target_name/F_code` where `project_directory` is the project's directory and `target_name` is the name of the target. The name of the executable file is `system_name` (or `system_name.exe` on Windows) where `system_name` is the name that you have assigned to your system in the project settings (reflected in the ECF file).
+
+The target of the Guided Tour system is `classic` and the name is `simple`, so you can locate `simple.exe` (or `simple.exe` on Windows) in `EIFGENs/classic/F_code` for your project, and run it stand-alone if you like.
+
+If you run the system from a command line, and it requires arguments (`simple` doesn't), you will provide the appropriate arguments after the command name: `system_name ... arg ...` .
+
+Because various platforms have different conventions, "relative paths" referenced in your system will mean something different under Unix/Linux, where they relate to the directory from which the command is launched, and under Windows, where they relate to the application's directory.
+
+==Executing a frozen or melted system outside of EiffelStudio==
+
+A system compiled in "Workbench mode" -- frozen or melted -- is normally meant for execution within EiffelStudio, not for outside delivery, since it is not optimized. If you need to execute it outside of EiffelStudio, make sure that you have access to the system_name.melted file in project_directory /EIFGENs/target_name/W_code.
+
+==Moving on==
+
+With this discussion of compilation and execution we have finished our review of the key capabilities of EiffelStudio. Not everything has been covered, but you are now familiar with the essentials and ready to discover the rest by yourself, both by trying out various capabilities -- most of which should be self-explanatory -- and examining the extensive online documentation that accompanies the product.
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/graphics-based-design.wiki b/documentation/18.11/eiffelstudio/Tutorials/graphics-based-design.wiki
new file mode 100644
index 00000000..ac2d1afd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/graphics-based-design.wiki
@@ -0,0 +1,298 @@
+[[Property:title|Graphics-based Design]]
+[[Property:weight|1]]
+[[Property:uuid|78239225-67a7-8718-857d-f2c8fb70ef18]]
+So far the project modifications that we have made used the text editor in the Editing Tool. Now let's look at EiffelStudio's ability to provide a graphical depiction of our software system.
+
+In line with the principles of seamlessness and reversibility recalled at the beginning of this Tour, EiffelStudio's interaction between text and diagram access to software is bi-directional. When you make a textual modification, the next incremental recompilation will update the diagram; but you can also work directly from the diagram, and the text will be generated or updated after each graphical operation.
+
+Many people like to use the graphical mechanisms at the beginning of a project, to draft the overall structure of a system in "bubbles-and-arrows" style, then concentrate on text as they get closer to implementation. But there is really no such obligation. At any point in the development, just use the form that is more suited to your taste and to your needs of the moment.
+
+
+==Displaying a cluster view==
+
+We are going to play with the root cluster. So, we can work from EiffelStudio's default tools layout. Remember that you can reset the tools layout to the default by following the menu path:
+
+View --> Tools Layout --> Reset Tools Layout
+
+Now target an Editing tool to the class TESTROOT. So to start out, your Development window should look about like this:
+
+
+[[Image:es gt graphics based design starting point|A starting point]]
+
+
+Before getting started, another thing we want to do is to make sure that the the [[Making the context tool independent from the editor|tools are in "Unlinked" mode]]; you can see this by going to the View menu you will see either a menu item '''Unlink Context Tool''' (if tools are currently "Linked") or an item '''Link Context Tool''' (if tools are currently "Unlinked"). So if you see '''Link Context Tool''', you don't have to do anything. But if you see '''Unlink Context Tool''', then select that item to unlink the tools.
+
+Let's start working with '''cluster views''', showing the content of a cluster. Make the Diagram tool visible: move your cursor over (or click on) [[Image:diagram-tool-tab|Diagram tool]] at the bottom of the Development Window. You may want to float the tool away from the Development Window or "pin" it open (as we learned in the section on [[Customizing the tools layout and toolbars#Docking|docking]], and then maybe enlarge the tool some. You should see a graphical rendition of the root_cluster in the Diagram tool, something like the figure below. In the case that root_cluster is not visible, click the '''Target to class or cluster''' button ([[Image:diagram-target-cluster-or-class-icon]]) on the Diagram tool's toolbar.
+
+
+[[Image:es gt testroot cluster diagram|root_cluster diagram]]
+
+
+
+
+==Hiding a class==
+
+First we might decide that we don't want to be bothered with class INVALID. We could delete it altogether from the system by a pick-and-drop of its bubble to the Delete ([[Image:16x16--general-delete-icon|Delete]]) hole. This is not what we want, but try this now to see the confirmation request:
+
+
+[[Image:es gt diagram delete confirmation]]
+
+
+Make sure to answer '''No''' to that confirmation request (you want to keep the class even though it wouldn't be a catastrophe to lose it). Instead pick-and-drop the INVALID bubble into the Hide figure ([[Image:general-reset-icon|Hide figure]]) hole. This time there is no confirmation request, since the operation is reversible -- it just affects what's displayed in the cluster view -- and the class is removed from the display:
+
+
+[[Image:es gt class invalid is hidden|Class INVALID is hidden]]
+
+
+You can try '''undoing''' this change ([[Image:general-undo-icon]]), then '''redoing''' it ([[Image:general-redo-icon]]).
+
+You can also click the '''History''' icon ([[Image:general-undo-history-icon]]) which, during the rest of the session, will display the list of executed operations, and let you undo or redo many operations at once by clicking the oldest to be kept or the youngest to be redone.
+
+For the rest of this discussion we assume INVALID is hidden.
+
+
+==Adding a class==
+
+We are now going to add a class graphically to our system. This means you don't have to worry about creating and initializing a file; EiffelStudio will take care of the details.
+
+The useful button here is '''Create new class''':
+
+[[Image:es gt create new class button|Create a new class]]
+
+When you click this button you'll see the '''Add New Class''' dialog box:
+
+
+[[Image:es gt new class dialog]]
+
+
+Overwrite the default class name being proposed by the name HEIR2, as we are going to create a new heir of PARENT. Now click the button labeled '''Create'''.
+
+The new class is created and added to the diagram as part of root_cluster:
+
+
+[[Image:es gt class heir2 created|Class HEIR2 created]]
+
+
+Using conventional drag-and-drop (not pick-and-drop), move the class bubbles for HEIR2, TESTROOT and PARENT so that the display looks approximately like the following. The double circle around TESTROOT is the [[Notation|BON]] (Business Object Notation) convention to identify a system's root class.
+
+
+[[Image:es gt class heir2 relocated|Classes rearranged]]
+
+
+==Adding an inheritance link==
+
+Now we are going to make HEIR2 an heir of PARENT. To create relationship links between classes you pick-and-drop from the source class, but don't do that yet. First we have to specify that we want an inheritance relationship.
+
+By default, the new relationship '''Creation Mode''' will be client/supplier ([[Image:diagram-new-supplier-link-icon]]). To change the creation mode to inheritance, click on the selection triangle next to the new client/supplier link icon, and choose '''Conforming inheritance Creation Mode ...''' from the drop-down menu, as shown below.
+
+
+[[Image:es gt select conforming inheritance link creation mode|Selecting Conforming Inheritance Creation Mode]]
+
+
+Notice that the current Creation Mode icon has changed to indicate conforming inheritance ([[Image:diagram-new-conforming-inheritance-link-icon]]).
+
+Now pick-and-drop from the HEIR2 bubble to the PARENT bubble. (Now you see why conventional drag-and-drop is used to move bubbles: pick-and-drop on the diagram serves to add links between classes).
+
+[[Image:es gt class heir2 inheriting parent|HEIR2 now inherits from PARENT]]
+
+To convince yourself that the new class has been made an heir of PARENT, not just in the diagram, but in its text as well, you can look at the class in an Editing tool. Unless you are so fortunate as to have plenty of monitor space, you may have to un-pin the Diagram tool to be able to see the Editing pane. Pick-and-drop HEIR2 bubble to the Editing tool to see its text.
+
+
+[[Image:es gt class heir2 text|Class HEIR2 in an Editing tool]]
+
+
+The code for a minimal class HEIR2 has been generated from your graphical operations: creating the class produced a class template, and the creation of the new inheritance link made HEIR2 inherit from PARENT.
+
+In a moment we'll use this Editing Tool to see how, conversely, EiffelStudio will automatically reflect in the diagram a change made to the text.
+
+For now, make sure the Diagram tool is visible again.
+
+
+==Adding a client link==
+
+Next let's make TESTROOT a client of HEIR2.
+
+First, re-select ''Client-Supplier''' as the Creation Mode for new links.
+
+Pick-and-drop from the TESTROOT bubble to the HEIR2 bubble. This causes the '''New Feature''' dialog box to appear:
+
+
+[[Image:es gt new feature dialog|The New Feature dialog box]]
+
+
+This technique gives you many option and in fact is a convenient way to build your classes, whether at the analysis, design or implementation level. Here, fill the fields as follows. For the top choice, keep the default, Attribute; we'll give class TESTROOT an attribute of type HEIR2. For its feature category, keep the choice currently displayed, Access. For its name, replace the default, by the name o3. In the '''invariant''' box, choose
+
+ o3_not_void: o3 /= Void
+
+
+from the list to specify the invariant property that this attribute should never be void. Finally, to see how EiffelStudio can generate the full accompaniment to an attribute, in the box '''Setter?''' choose
+
+ set_o3
+
+
+This will create a routine with this name which clients can use to set the value of o3.
+
+You may have noticed that the checkbox labeled '''Assigner?''' became enabled when you chose a name for the '''Setter'''. This will make the setter routine be called if a client uses an assignment of the form:
+
+ my_testroot.o3 := some_value
+
+
+The assigner makes this is a syntactical shortcut for writing:
+
+ my_testroot.set_o3 (some_value)
+
+
+Without the assigner, the direct assignment by a client would result in a syntax error, because in Eiffel clients are prohibited from assigning directly to their suppliers' attributes.
+
+So, check the '''Assigner?''' box.
+
+Now, click '''OK'''.
+
+The diagram now shows that TESTROOT is a client of HEIR2.
+
+
+[[Image:es gt testroot is client of heir2|TESTROOT is now a client of HEIR2]]
+
+
+Now, if you'd like, you can check the text of TESTROOT as we did earlier with HEIR2, but here are the highlights:
+
+You'll notice that the attribute o3 has been added under the feature category "Access":
+
+
+feature -- Access
+
+ o3: HEIR2 assign set_o3
+ -- `o3'
+ attribute Result := ({like o3}).default end --| Remove line when attached attribute is correctly assigned
+
+
+After the attribute declaration the keyword assign declares that the feature set_o3 is to be called when assignments are made to o3 by clients.
+
+You see that the header comment is trivial ( -- `o3' ), simply echoing the feature name. This is because we failed in our duty to fill in a reasonable header comment in the New Feature dialog. Every feature should have a meaningful header comment.
+
+Now notice the last line, beginning with the keyword attribute. This line is intended to be temporary. It makes your new attribute o3 a [[Void-safety: Background, definition, and tools#Self-initializing attributes|self-initializing attribute]], which just allows you to avoid certain errors until you insert code to initialize o3 properly.
+
+The "setter" routine for o3 is generated and categorized as "Element change":
+
+
+feature -- Element change
+
+ set_o3 (an_o3: like o3)
+ -- Assign `o3' with `an_o3'.
+ require
+ an_o3_not_void: an_o3 /= Void
+ do
+ o3 := an_o3
+ ensure
+ o3_assigned: o3 = an_o3
+ end
+
+
+Notice that EiffelStudio has included both a precondition and postcondition for set_o3.
+
+Also, a clause has been added to the class invariant to ensure that set_o3 is not void:
+
+
+ o3_not_void: o3 /= Void
+
+
+The situation here is different from what we saw earlier with HEIR2, which had been generated from scratch by the diagram. Here TESTROOT existed before, in text form; so the diagram mechanisms have had to preserve the existing feature and feature clauses, and add the elements corresponding to what you have specified through the diagram mechanisms. The unlabeled Feature clause of the existing class has been kept; the new features have been entered into clauses labeled Access and Element change, observing the Eiffel standard for common feature clauses in libraries.
+
+
+==Updating the diagram from the text==
+
+In this tour of the diagram facilities we have, so far, worked on the diagram and seen the text updated immediately. Of course we want full reversibility. So let's make a change in the text and check the diagram.
+
+The change will be very simple. We'll make TESTROOT a client of HEIR. In the Editing tool, add an attribute declaration
+
+ other: HEIR
+
+
+Now save the file by clicking the [[Image:16x16--general-save-icon|save]] icon.
+
+Nothing happens yet to the diagram. This is normal: EiffelStudio doesn't update the diagram every time you type some text (which, for one thing, might be syntactically incorrect, or invalid). You need to recompile first. Click the [[Image:compile-button]] button. Then the new relation appears:
+
+
+[[Image:es gt testroot is client of heir|Now TESTROOT is a client of HEIR]]
+
+
+If the label other of that relation doesn't appear in the exact place shown here, try moving it using conventional drag-and-drop. You can only move such a link label within a small area on either side of the link.
+
+
+==Creating a cluster==
+
+Earlier on, we saw how to create a class from the EiffelStudio diagram, letting EiffelStudio take care of creating and initializing the file. Similarly, you can create a new cluster graphically, and let EiffelStudio create the corresponding directory.
+
+To create a cluster, you can go through [[EiffelStudio: Project settings window|Project settings]], or you can do so directly from the Groups tool. Let's use the Groups tool. On the title bar of the Groups tool, you'll find the '''Add a cluster''' button ([[Image:new-cluster-icon]]). (You may have to expand the titlebar menu through its double chevron placeholder >>).
+
+The resulting dialog asks you for the cluster name, and the existing cluster (non-precompiled) of which you want to make it a subcluster, here leaving only one choice:
+
+[[Image:es gt add cluster dialog]]
+
+Instead of the default name, type my_cluster; select the only possible supercluster, root_cluster, and click '''Create''' at the bottom of the dialog.
+
+Now the diagram shows the new subcluster:
+
+
+[[Image:es gt new cluster added|A new cluster has been added]]
+
+
+Try to make your display look approximately like the above; you will probably have to move (drag from the center) and/or resize (drag from a corner) either or both clusters.
+
+
+==Moving a class to a different cluster==
+
+Among the many operations you can do graphically is to move a class from one cluster to another. Pick-and-drop the HEIR2 class bubble to the rounded rectangle for MY_CLUSTER.
+
+This graphical manipulation has caused a structural change: class HEIR2 is now part of MY_CLUSTER. Check this by expanding the Cluster Tree on the left:
+
+[[Image:es gt class HEIR2 moved to new cluster|Class HEIR2 has been moved to my_cluster.]]
+
+If you like, you can also look into the project directory -- using the Windows Explorer, or cd and ls on Unix/Linux -- and check that it now has a subdirectory my_cluster with a file heir2.e containing the text of class HEIR2.
+
+Clearly, it's much more convenient to use EiffelStudio for such manipulations than to move files around manually.
+
+
+==Adjusting the display==
+
+A number of buttons enable you to customize the display. So far all class bubbles had the same default color. Try pick-and-dropping a bubble into the '''Color hole''' ([[Image:diagram-choose-color-icon]]) to get a color palette that enables you to select a different color. This is useful if you want to highlight classes possessing certain properties, for example classes that are part of a certain Design Pattern.
+
+'''Relation depth''' ([[Image:diagram-depth-of-relations-icon]]) enables you to select the depth at which inter-class relations will be displayed. (Don't change this setting now.) '''Include all classes of cluster''' ([[Image:diagram-fill-cluster-icon]]) is more useful for class diagrams than for the cluster diagram we have now, which by default included all classes of the cluster; if you click it here it will add the class INVALID that you removed earlier. There is no need to do this now.
+
+
+==Views==
+
+So far the top-right '''View''' field has always shown '''DEFAULT:BON'''. You can define any number of views in your project, and apply them to various class and cluster diagrams.
+
+For example, using the buttons to show and hide links of various kinds you can produce diagrams that only show the inheritance links, and others that only show the client links. If you want to keep both kinds of diagram, simply define views by typing view names -- such as '''Inheritance''', '''Client''', '''All_links''' -- into the '''View''' field.
+
+You can also use views to retain some of the choices seen just before, such as different colors and depths.
+
+To load a previously defined view, just use the menu associated with the '''View''' field.
+
+You may remember that when we generated HTML documentation, the dialog asked you to select a view among the available ones. You can choose a different view for each cluster.
+
+You may have guessed that the '''BON''' in '''DEFAULT:BON''' means that the diagram view is in Business Object Notation. You can also view diagrams in UML-style notation. To do this you would click the '''Show UML''' button ([[Image:diagram-view-uml-icon]]). Click it again to return to the BON view.
+
+
+==Class diagrams, cluster diagrams==
+
+In the present discussion we have used cluster diagrams. Both are interesting. To obtain a class diagram, you will target a Class tool to a class, and select the Diagram tool. By default, this shows the parents of the class. Do this now for TESTROOT.
+
+{{note|Because at the beginning of this page, we put the EiffelStudio context tools in "unlinked" mode, it may be necessary to synchronize the context to see the class diagram. You can do this by clicking '''Synchronize context''' ([[Image:context-sync-icon]]) in the main toolbar. }}
+
+
+[[Image:es gt testroot class diagram]]
+
+
+It's for class diagrams that the '''Relation depth''' ([[Image:diagram-depth-of-relations-icon]]) button is most interesting. It will let you select the exact depth that you wish displayed for each relation type:
+
+
+[[Image:es gt relation depth dialog]]
+
+
+
+This will conclude our review of the Diagram facilities of EiffelStudio, although you'll surely discover some further riches by yourself and through the rest of the documentation. We hope the complete seamlessness between text and pictures will enable you to increase the effectiveness of your analysis work, or your design work, or your programming -- whatever level of system development you need to tackle.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/handling-syntax-and-validity-errors.wiki b/documentation/18.11/eiffelstudio/Tutorials/handling-syntax-and-validity-errors.wiki
new file mode 100644
index 00000000..61a3dcd6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/handling-syntax-and-validity-errors.wiki
@@ -0,0 +1,81 @@
+[[Property:title|Handling Syntax and Validity Errors]]
+[[Property:weight|-3]]
+[[Property:uuid|c2be8123-b793-f8ce-e082-d4fdacc6bbe6]]
+So far we have tried to make sure that everything went smoothly. But in actual software development you may encounter error situations, and it is useful to know what can happen then.
+
+
+==Levels of language description==
+
+Let's remind ourselves first of how the language is specified. The [[ECMA Standard 367|ISO/ECMA Eiffel standard]] and the book [[Eiffel: The Language]] carefully distinguish between three levels of description: '''syntax''', '''validity''' and '''semantics'''. Their roles are clearly distinct:
+* Syntax defines the structure of software texts. A typical syntax rule states that an assignment starts with a Writable entity, continues with the symbol :=, and ends with an Expression. This is a purely structural specification, saying nothing for example about the types of the Writable and the Expression.
+* Validity, applicable only to syntactically legal texts, defines required consistency conditions. A typical validity rule states that in an assignment the right-hand-side Expression must conform -- a property of its type, defined rigorously on the basis of inheritance -- to the left-hand-side Writable. Eiffel has about 75 validity rules; part of the language's originality is that these rules are of the "if and only if" form, not only telling you individual error cases ("this is valid only if ... ") but also reassuring you that your text will in fact be valid if it satisfies the conditions listed exhaustively.
+* Semantics, applicable only to valid texts, defines the software's expected run-time behavior. A typical semantic rule states that an assignment replaces the value of its left-hand-side Writable by the value of the right-hand-side Expression at the time the assignment is executed, with precise rules on the different possible cases involving references, objects and simple values.
+
+You may make an error at any of these levels:
+* Writing = instead of := for the assignment symbol is a syntax error.
+* Writing your_integer := your_real, with the types suggested by the names, is a validity error.
+* Violating a precondition, causing a division by zero, are semantic errors.
+
+Syntax and validity errors will be detected by the compilation process. For semantic errors, you will rely on contract checking and on the debugging tools described later. Let's look now at examples of the first two cases.
+
+
+==A syntax error==
+
+To see what happens for a syntax error, replace the keyword do by dont in the routine display of class PARENT (click the position immediately after the o and type nt.). Save the file by clicking the Save button or using CTRL-S and then compile the system.
+
+[[Image:es gt development window syntax error 01|Purposely injected syntax error]]
+
+The error shows up in the [[Error List Tool|Error List tool]]. You can expand the entry to show the point at which the error was recognized by the compiler.
+
+To correct the error, just bring the mouse back to its location, remove the spurious nt, and click Save again; also click Compile to make sure that the project is recompiled up-to-date.
+
+You may wonder why the syntax error messages are not a little more verbose than just Syntax error. The reason is merely that Eiffel's syntax, being simple and regular, does not require sophisticated error messages; syntax errors usually result from trivial oversights. If you make a syntax error and the reason is not immediately clear, check the syntax summary in the [[Quick reference to the Eiffel programming language]] or the [[ECMA Standard 367|ISO/ECMA Eiffel Standard]].
+
+
+==A validity error==
+
+A validity error is a violation of one of the validity constraints given in [[ECMA Standard 367|ISO/ECMA Eiffel Standard]]. Every such constraint is identified by a four-letter code of the form VXXX (the first letter is always V).
+
+A validity error will produce a precise error message, which includes the validity code. Although short, the error message is usually sufficient to find out what the error is. If not, you can get the complete rule, straight from the book.
+
+To see this mechanism at work, let us introduce a validity error. There is in fact one ready for you in class TESTROOT. Target a Development Window to this class; at the end of its text, just before the final end, you will find the following comment line:
+
+-- inv: INVALID;
+
+If uncommented, this is a declaration of a feature of type INVALID. A class called INVALID indeed exists in file invalid.e of the root cluster, but it contains a validity error. To see what it is, remove the initial double-hyphen -- in the above line from class TESTROOT so that it is not a comment any more.
+
+[[Image:es gt development window validity error 01|inv: INVALID uncommented]]
+
+Click Save, then Compile. Compilation starts but after a few degrees it stops with an error message that appears in the Error List tool. Expand the entry and perhaps do some resizing to see it in its entirety:
+
+[[Image:es gt development window validity error 02|Validity error]]
+
+As the error message indicates, you have (shame on you) violated the validity rule VUAR, which requires the number and types of actual arguments in a routine call to match the number and types of formal arguments declared in the routine.
+
+One of the interesting properties of the error message is that everything in color is '''clickable''': class name, feature name, but also the error code. This means that you can start a Pick-and-Drop on any of these elements to find out more.
+
+For example, to see the exact context of the error, pick-and-drop the name of the affected feature, display -- appearing in green on the fifth non-blank line -- and pick-and-drop it to the Editing tool. This displays the erroneous feature:
+
+[[Image:es gt development window validity error 03|Validity error exposed]]
+
+Note on this display a special property of Pick-and-Drop when its source is a feature name appearing in a validity error message: the instruction that causes the error is highlighted.
+
+In the error message in the Error List tool, the error code itself, VUAR, is also clickable. Assuming the message was not sufficient to understand the error, you can use it to start a Pick-and-Drop. Do this now, by picking that code and starting to move the mouse, but not dropping yet. The pebble shape for such information elements is a question mark ? enclosed in a small gold talk bubble ([[Image:error-cursor]]). Like other picked objects, when it is not over a droppable target, the pebble will be crossed in red ([[Image:error-cursor-disabled]]). The place to drop is the Explanation hole ([[Image:error-info]]) in the Error List toolbar:
+
+[[Image:es gt error list tool pnd validity error|Dropping a validity error pebble]]
+
+When you drop the pebble, you'll see the Compilation Error Wizard appear:
+
+[[Image:es gt compilation error wizard 01]]
+
+The wizard displays the complete text of the violated rule. Depending upon the particular violation, the rule will come straight from the pages of either [[Eiffel: The Language]] or the [[ECMA Standard 367|ISO/ECMA Eiffel standard]]. In this case, the VUAR rule definition used comes from Chapter 22, page 369 of [[Eiffel: The Language]]. An rule cited from the ISO/ECMA Eiffel standard will be state as such and will include the specific edition of the standard and the section number, for example:
+
+VEVI, ECMA-367, 2nd edition, section 8.19.17
+
+
+The VUAR rule that we violated has two clauses, numbered. Since the error message showed the error code as VUAR(1), the violated clause is the first; this convention of showing the clause number in parentheses applies to all multi-clause validity constraints.
+
+To correct the error the easiest is to go back to class TESTROOT and reinstate the comment symbol -- (two consecutive hyphens) on the erroneous line. Save and compile to continue with a valid system.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/how-eiffelstudio-compiles.wiki b/documentation/18.11/eiffelstudio/Tutorials/how-eiffelstudio-compiles.wiki
new file mode 100644
index 00000000..91b4543e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/how-eiffelstudio-compiles.wiki
@@ -0,0 +1,214 @@
+[[Property:title|How EiffelStudio Compiles]]
+[[Property:weight|3]]
+[[Property:uuid|6fc86303-8afe-78af-6ca7-2853e8bfcbc3]]
+So far we have relied on the compiling capabilities of EiffelStudio without exploring them in any detail. We must now understand the principles behind EiffelStudio's compiling strategy, in particular how it reconciles fast turnaround, efficient generated code, and strong typing.
+
+
+==Compilation is automatic==
+
+Any speed issue aside, the most important property of the compilation process is that it is entirely automatic.
+
+You've seen it from the beginning of this Tour: all the information the compiler has -- obtained from a configuration file, as here, or generated automatically by the other options -- is the name of the root class and the list of directories holding Eiffel clusters. In fact it only needs these directories for non-precompiled clusters; here, because we are using precompiled EiffelBase, and because we've started EiffelStudio from the Tour's own root cluster directory, EiffelStudio has all the information it needs.
+
+The compiler takes care of finding all the classes that must be compiled.
+
+There is never any need, when compiling Eiffel systems, to supply "Make files", "include files", or other manual descriptions of inter-module dependencies.
+
+
+==Compilation modes==
+
+EiffelStudio offers several forms of compilation, which you can see in the entries of the Compile menu (don't trigger any of them right now) as well as keyboard shortcuts and, in some cases, buttons:
+* '''Melt''': quick incremental recompilation, doesn't optimize code for changed parts.
+* '''Freeze''': incremental recompilation, not as fast as Melt, but generates more efficient code for changed parts.
+* '''Finalize''': recompile entire system, generating highly optimized code.
+* '''Precompile''' (available both in the Project menu and through Tools --> Precompilation wizard), to process an entire library, on which many systems can then rely without having to compile it.
+
+You'll quickly learn to use each of these modes to suit your needs.
+
+
+==Criteria==
+
+EiffelStudio's '''Melting Ice Technology''' reconciles the following goals:
+* ''Security and efficiency of the generated code'': compiling techniques for the strongly typed Eiffel programming language ensure that compilers can catch many errors before it is too late, and generate more efficient code. The "validity constraints" of the language, whose violations are caught as compilation errors, are particularly useful here, playing the role of enforceable design rules.
+* ''Quick turnaround '': you should experience an almost immediate transition from the time you write or (more commonly) modify software to the time you can execute it.
+* ''C code generation'': for portability, it is useful to take advantage of C in its proper role, that of a portable assembly language. C's closeness to machine concepts -- one of the very properties making it less suitable for human programming except in the case of short routines to access low-level mechanisms --, its almost universal availability, and its good level of standardization, make it an excellent target language for a code generator. This also enables the environment to benefit from the often extensive optimizations performed by good C compilers, and facilitates interfacing new software with the large body of existing C-based systems, tools and libraries. As the final output of Eiffel compilation, you can obtain a complete C package that you can either C-compile on the same machine or port to other platforms, making EiffelStudio a tool of choice for '''cross-platform development''': develop on one platform, deploy on one or more others.
+
+
+==The Melting Ice Principle==
+
+The idea of the melting ice is based on the observation that, for the practicing software developer, the crucial day-to-day compilation problem is not how to process an entire system but how best to process a '''changed system''', of which an earlier state had previously been processed.
+
+The change may be big or small; the system may be big or small. ("Small system" here means up to a few tens of thousands of lines.) This gives four possible cases, of which only one is really critical:
+
+
+{| border="1"
+|-
+|
+| '''Small System'''
+| '''Large System'''
+|-
+| Small Change
+|
+| xxx
+|-
+| Big Change
+|
+|
+|}
+
+
+If the system is small, as in both of the left column entries, speed of recompilation with a good compiler will be acceptable.
+
+In the bottom-right box, the developers have spent days or weeks changing many classes in a large system, so they will not resent having to wait a little to see the results of the recompilation, as long as the time remains reasonable. In EiffelStudio this corresponds, as we'll see shortly, to ''finalization'', which is in fact fairly fast anyway, but not as fast as the incremental modes.
+
+In the day-to-day, minute-by-minute practice of building and modifying software, the case that recurs by far the most often -- and can cause most frustration -- is the one marked xxx: you change only a small share of a big system. Then the result should come quickly enough. More precisely:
+
+{{definition|Melting Ice Principle|The time to re-process a system after a change should be a function of the logical size of the change, not of the size of the system. }}
+
+''The "logical size" of a change may be different from its physical size because a small physical change in a class may have consequences in many others. Imagine for example that you add a feature to class '' ANY'', although this is an extreme case and won't normally happen. Since every class is a descendant of '' ANY'', the logical change may affect the entire system.''
+
+''In practice, however, most small physical changes will also be small logical changes and will only cause minimal recompilation. In particular, EiffelStudio will detect that a change does not affect the interface of a class -- for example if it's only a change to non-exported features -- avoiding the need to re-process its clients.''
+
+Processing such incremental changes, in time proportional to the logical size of the changes, is known in EiffelStudio as '''melting'''. The reason for this terminology is the metaphor illustrated on the following figure. Think of a compiled system as a block of ice; it may have taken some time to "freeze" -- compile. Now you start working on it again; the changes are like melted drops of water, dripping from the ice as a result of the heat generated by your work.
+
+[[Image:index-140]]
+
+The Melting Ice Technology ensures that incremental compilation will only process the "melted" part, usually small, leaving alone the "frozen" part, which may be large. This is crucial to the incrementality of the mechanism.
+
+The roles of the four compilation modes follow from this analysis:
+* '''Melting''' is the fastest mode: it processes the melted part without affecting the frozen part. With EiffelStudio, the melted elements will be ''interpreted'' while the rest is compiled.
+* '''Freezing''' is the process of putting back the melted parts into the "freezer": bringing them to the same compiled state as the parts that have not been modified.
+* '''Finalizing''' is the non-incremental process of producing a stand-alone C package and the resulting executable, extensively optimized, from the current system.
+* '''Precompiling''' is the process of compiling an entire set of reusable classes, once and for all, so that it can be shared by many systems and many users without duplicating the code or compiling it again for each project.
+
+
+==Properties of the compilation modes==
+
+The following table summarizes the differences between the four compilation modes:
+
+
+{| border="1"
+|-
+|
+| '''Regenerate C Code?'''
+| '''Incremental?'''
+| '''Compilation result shared between projects?'''
+|-
+| '''Melt'''
+| No
+| Yes (fast)
+| No
+|-
+| '''Freeze'''
+| Yes
+| Yes (but requires C compilation of changes and linking)
+| No
+|-
+| '''Finalize'''
+| Yes
+| No
+| No
+|-
+
+
+| '''Precompile'''
+
+
+| Yes
+| No
+| Yes
+|}
+
+
+During the production and modification of your software, you will usually alternate between melting and freezing, since both of these modes are incremental. Most of the time, you will simply '''melt''', since melting satisfies the Melting Ice Principle: the time to get back to a working system is very short -- proportional to the size of the changes. Note in particular that the unit of melting is the smallest possible one: each feature of a class -- attribute or routine -- may be melted separately.
+
+The main difference between melting and '''freezing''' is that freezing implies re-generating C code for the changed elements, and hence relinking the system as well. In contrast, when you melt changes, you do not change any C code: it remains frozen.
+
+As a consequence, melting can only process changes to Eiffel code. If you add new external code (in C, C++ or other languages whose modules will require linking), you must freeze. This is also true if you add new Eiffel agents. If you ask for a Melt in such cases, the operation will trigger a freeze anyway. More generally, the Compile button, which you have used a number of times to recompile the system in this Tour, triggers a Melt by default, and a Freeze when it has to.
+
+EiffelStudio knows how to hide the differences and present you with a uniform view of the frozen parts (the C code) and the melted parts. Here indeed is the full view of the picture that was previously given in part:
+
+[[Image:index-141]]
+
+When you examine a component of the system -- to edit a class, produce a view such as Contract or Interface, enable a breakpoint on a routine, run the system, inspect a run-time object -- EiffelStudio automatically knows where to look for the corresponding information: melted or frozen part. If one of your actions requires melting or freezing more elements, EiffelStudio will also handle this automatically.
+
+As suggested by the lower red arrow, successive melting operations "pour water into the bowl", corresponding to the elements that you have changed since the last freeze. Freezing, represented by the top red arrow, updates the C code so that it integrates all the latest changes, emptying the bowl in the process.
+
+Because the difference between melted and frozen code is largely invisible to users of the environment, the term '''workbench code''' will cover both kinds; workbench code is code resulting from a succession of freezing and melting operations. As long as you are working within EiffelStudio, you are using workbench code.
+
+When you are happy with the results of your development, you will normally finalize the system, thereby generating '''final code'''. Although not strictly required, this step is in most cases appropriate since final code is significantly more efficient than workbench code in both time and space: finalization performs a number of optimizations -- dead code removal, replacement of dynamic by static binding -- that wouldn't be justified in incremental development where, for example, some code element that is "dead" one minute may be resurrected the next moment through the addition of just one line of text. In addition, because finalized code is more efficient than frozen code, it is the natural choice if, using EiffelStudio for cross-platform development, you wish to port the resulting C-package to other architectures.
+
+If you have a set of reusable classes that may be useful to many applications, you can '''precompile them''' into a library. This set of classes must be ''self-contained'' in the sense that all the classes needed by any of them must be either in the library itself or in another library that you will include in the precompilation.
+
+
+==Bytecode==
+
+The result of melting operations -- the contents of the "bowl" -- is an internal software representation known as melted code or (for no particularly good reason) as ''bytecode''. EiffelStudio generated bytecode serves two complementary purposes:
+* It can be executed directly. This is what happens during melting: while the rest of your system, the frozen part, is executed in the form produced by Eiffel compilation generation and C-compilation of the result, the melted part is interpreted "as is" without further translation.
+* It can be compiled into C for further processing.
+
+Internally, the melted code is in a file simple.melted (where simple is our project's name) in the subdirectory EIFGENs/simple/W_CODE of the project directory. The file is not human-readable, but as you add elements to your software and melt you watch its size grow. Whenever you freeze, it's emptied.
+
+{{note|For systems targeted to Microsoft .Net, bytecode is replaced by that platform's own internal code, MSIL.}}
+
+
+==Degrees==
+
+You can now see the reason behind the terminology used to describe compilation steps, called '''degrees''' on the messages that flash on the screen when you do a compilation. The names are inspired by the international temperature scale -- Celsius, also known as centigrade -- where water freezes at 0 (and boils at 100, but Eiffel software never reaches that). For EiffelStudio:
+* Compilation starts at degree 6, which examines the clusters of your system to determine what classes may have changed. In many cases the compilation can safely skip part of this degree.
+* Degree 5 parses modified classes. It's executed not only when you explicitly request a compilation, but also when you save a class from the EiffelStudio editor, or exit from an external editor, so that you can see and fix syntax errors without delay.
+* Degrees 4 down to 1 take care of melting.
+* Negative degrees only take place when you freeze or finalize.
+* After negative degrees comes C-compilation if needed.
+
+
+==Using melting and freezing==
+
+When should you melt, freeze, finalize or precompile? The answers are simple and follow directly from the preceding overview; they provide the key to getting the environment to work for you in the most effective way possible.
+
+Melting is the bread and butter of the Eiffel developer. As you build your software, either from scratch or by modifying an existing system, you will regularly melt to benefit from the various checks that compilation performs and, of course, to generate executable code that you can test and debug immediately. During this process, there is no need to refreeze, since this operation (although still incremental) takes significantly more time than melting.
+
+Only two operations, noted above, ''require'' freezing: the addition of external (non-Eiffel) routines, such as C functions or C++ classes, and the addition of agents. The reason is easy to understand: the EiffelStudio compiler knows how to melt Eiffel software, but not software written in C or other languages; agents similarly require special code generation.
+
+''For the first compilation of a system that does not use precompiled EiffelBase, a Freeze is needed since class '' ANY'', from which all other classes inherit, uses some external routines. In this case the environment automatically starts a freeze even if you just click Melt. This does not apply if you have access to precompiled EiffelBase.''
+
+Except for the addition of external routines or agents, freezing is never strictly necessary. It is indeed possible to use melting throughout a development, never requesting a freeze after the first compilation. But as the melted-to-frozen ratio grows, you may detect a certain degradation in the performance of the system (determined by how big a share of your system is melted, not how many times you melt it). After a while, then, you may want to refreeze. Like melting, freezing is incremental: only those parts of a system that have been logically changed will be recompiled; as with melting, the determination of what needs to be recompiled is entirely performed by the environment, without any manual intervention on the developer's part.
+
+The principal difference is that freezing takes longer than melting. Because of this you are requested to confirm the first time you freeze. Freeze the example system by choosing the menu entry
+
+Project --> Freeze
+You get the following dialog:
+
+[[Image:es gt freeze warning|Freezing requires external compilation]]
+
+Note the No option: by default, freezing will start a C compilation, but you can stop after C generation if you wish. This is useful for example if you want to generate a C package for cross-development, C-compiling the result on a different platform.
+
+Click Yes to confirm freeze and C-compilation. Once the Eiffel compilation is complete, a message in the Development Window ( C compilation launched in background) tells you when that C-compilation has started. C-compilation does not block EiffelStudio: at this point you can continue working with the environment. Any messages from C compiler will appear in the [[External compilation pane]] of the [[Outputs Tool|Outputs tool]].
+
+You will be able to execute the frozen system as soon as the C compilation finishes.
+
+You will note that freezing, although it takes more time than melting, is actually quite fast, both due to the speed of Eiffel compilation and to the structure of the generated C code, designed to optimize the operation of the C compiler.
+
+{{note|When you freeze a system targeted to Microsoft .NET, the external compilation of your system is not necessary. The intermediate language generated by EiffelStudio and other .Net compatible compilers will be converted to machine code at runtime by .Net's just-in-time (JIT) translator.}}
+
+
+==Using finalizing==
+
+The main reason for finalizing a system is run-time performance of the generated system. Finalization enables you to generate the high-performance executables that are among the hallmarks of ISE Eiffel. As a consequence, finalized code is the best vehicle for cross-development: you can port the resulting C package to various target platforms and C-compile them on these platforms.
+
+The '''optimizations''' performed by finalization affect both space and time:
+* ''Dead code removal'' strips the executable module of all the routines in the system that are not actually called, directly or indirectly, by the root's creation procedure. In a large system relying on many general-purpose classes, dead code removal can easily reduce an executable's size by one third or more.
+* Finalization also applies ''static binding'' to non-polymorphic calls, and ''inlines'' some routine calls.
+
+As long as you continue changing, melting and freezing your system, the workbench compiling mechanisms cannot perform such optimizations: if a routine is "dead" today you may resurrect it tomorrow by adding a new call to it somewhere; and if a call is non-polymorphic a single additional assignment may require dynamic binding. Compilation can only generate optimal code by working on a full, stable system. This is the task of finalization.
+
+'''Cross-development''', the second reason for finalizing, is important if you are taking advantage of the portability of ISE Eiffel to develop your system on a certain platform and then run the result on target computers with possibly different architectures. A target machine may lack an ISE Eiffel compiler (unmistakably signaling its owner's backwardness) but include a C compiler. If the development and target platforms are of different architectures you will need to obtain a copy of the run-time system for the target architecture. The run-time system is also ANSI-C-based, so porting it is usually a straightforward matter.
+
+Note that cross-development does not ''require'' finalization, since you can cross-compile a frozen version. In practice, however, the finalized version is usually the preferred form for porting a C package because of the performance advantage.
+
+Finalize the example system now by selecting the menu entry
+
+Project --> Finalize
+Here too you will be asked to confirm, although the dialog enables you to suppress that confirmation for later attempts, and you may skip C compilation. You will note that finalization is longer than freezing, but still remains quite reasonable thanks to the extensive optimization of the Eiffel compilation process and the structure of the generated C code.
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/index.wiki b/documentation/18.11/eiffelstudio/Tutorials/index.wiki
new file mode 100644
index 00000000..19f06edf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|EiffelStudio tutorials]]
+[[Property:link_title|Tutorials]]
+[[Property:weight|2]]
+[[Property:uuid|4d68a136-f7c2-ddd3-d30d-e16ee7692302]]
+This is a guided tour of Eiffel Software's EiffelStudio interactive software development environment.
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/look-project-directory.wiki b/documentation/18.11/eiffelstudio/Tutorials/look-project-directory.wiki
new file mode 100644
index 00000000..03217f3d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/look-project-directory.wiki
@@ -0,0 +1,31 @@
+[[Property:title|A Look at the Project Directory]]
+[[Property:weight|-11]]
+[[Property:uuid|d82eae3f-fe0d-3e27-008e-61afd05f8cb0]]
+Before we proceed with the facilities of the environment, let's take a look at the way EiffelStudio organizes project files.
+
+With EiffelStudio, you build projects. Most projects yield an executable system, although you can also build a project just to define a library for use by such systems.
+
+Every session is relative to a project; you can start a new project from within EiffelStudio by following the menu path:
+
+File --> New Project
+
+... but please '''don't select that menu entry now''' as we have many more things to do with our current project first.
+
+Every project has a '''project directory''' which will contain the files generated and managed by EiffelStudio. The project directory may also host some of the source files containing your Eiffel classes, the ECF (eiffel configurationl file), and external software written in other languages. However, it is not required that everything be stored together; the source files and ecf may reside anywhere. Some users, in fact, like to put nothing other than the EiffelStudio-generated files in the project directory; this separates user-managed and system-managed files, and can facilitate configuration management, backups and porting.
+
+In this simple Tour, things have been set up so that all the files of interest, source texts as well as generated ones, will appear in the project directory YOURDIR (either $ISE_EIFFEL\examples\studio\tour or the copy that you have made). Go to that project directory using the Windows explorer or a cd command, and look at its contents (using ls on Unix/Linux):
+
+[[Image:es gt project directory 01]]
+
+The contents of this YOURDIR directory includes the following:
+* First you see a number of files with the extension .e , for "Eiffel": heir.e , invalid.e and others. These are the Eiffel source files, each containing one class. The recommended convention is to store a class of name CLASS_NAME into a file of name class_name.e , where class_name is the lower-case version of CLASS_NAME ; here, file heir.e contains the class HEIR and so on. As you may remember, Eiffel is case-insensitive, but the standard convention for class names is to write them in all upper case. Calling the file class_name.e is only a recommendation, not an obligation; but you are required to store one class per file. This keeps things simple and facilitates project and configuration management.
+* You also notice a file with an ecf extension. This is the configuration file that specifies this project. As you remember, the ECF file for this example was available as part of the delivery; we used it to compile the project. In most practical cases, however, you won't need to build an ECF; if you use the "Create project" option of EiffelStudio, EiffelStudio will build the ECF for you; if you change the Project Settings during a session, EiffelStudio will update the ECF. ECF files are written in a XML notation.
+* You will notice a subdirectory called EIFGENs, for "EIF''fel'' GEN''eration''s". EIFGENs is created and maintained by the compiler to store information about your project, including generated code for execution. EiffelStudio manages your project in such a way that EIFGENs can always be re-generated if need be; this means in particular that if things go wrong for any reason and you want to make a fresh start you can always delete this directory and recompile your system. This also means that you should not add any files into this directory, or modify any of its files, since a later compilation is free to change or regenerate whatever it chooses in EIFGENs.
+* Because the demonstration system for the Tour is a Microsoft Windows system, there is a file named simple.rc in the folder. This is a Windows resource file that was created automatically by EiffelStudio.
+
+Later on, we will see that EiffelStudio may generate three more subdirectories of the project directory: Diagrams, if you produce graphical system diagrams; Documentation, if you request system documentation, for example HTML; and Metrics, if you perform measurements on your system. Other than these directories, EIFGENs EiffelStudio will not touch anything in the project directory, so you may safely add and change whatever files and subdirectories you like.
+
+You seldom need to look into EIFGENs, although you should know that it's there. Right now if you check the contents of the project directory YOURDIR (using the Windows Explorer on Windows, the ls command on Unix, or some equivalent mechanism), you will see that EIFGENs has been created, itself with a subdirectory called classic which is the name of the target and which has some subdirectories, including W_Code which contains the generated code ( W for "Workbench" -- we'll see the reason later). Feel free to browse through it if you like, but don't change anything.
+
+By the way, we are now done with any platform-specific instructions. Everything in the rest of this Tour, other than the graphical look-and-feel, will work the same across all EiffelStudio platforms.
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/manual-identification-and-copyright.wiki b/documentation/18.11/eiffelstudio/Tutorials/manual-identification-and-copyright.wiki
new file mode 100644
index 00000000..2e3ac457
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/manual-identification-and-copyright.wiki
@@ -0,0 +1,73 @@
+[[Property:title|Manual identification and copyright]]
+[[Property:weight|7]]
+[[Property:uuid|c581a81b-fc9b-99bd-e73a-f290f6051a45]]
+Title: ''EiffelStudio: A Guided Tour'', Eiffel Software Technical Report TR-EI-68/GT. (Replaces TR-EI-38/EB.)
+
+===Publication history===
+
+First published 1993 as ''First Steps with EiffelBench'' (TR-EI-38/EB) and revised as a chapter of ''Eiffel: The Environment'' [http://www.eiffel.com/doc/ (TR-EI-39/IE), also available as] An Object-Oriented Environment (Prentice Hall, 1994, ISBN 0-13-245-507-2.
+
+Version 3.3.8, 1995.
+
+Version 4.1, 1997
+
+This version: July 2001. Corresponds to release 5.0 of the EiffelStudio environment.
+
+===Author===
+''Bertrand Meyer''
+===Software credits===
+
+Emmanuel Stapf, Arnaud Pichery, Xavier Rousselot, Raphael Simon; Etienne Amodeo, Jrome Bou Aziz, Vincent Brendel, Gauthier Brillaud, Paul Colin de Verdiere, Jocelyn Fiat, Pascal Freund, Savrak Sar, Patrick Schonbach, Zoran Simic, Jacques Sireude, Tanit Talbi, Emmanuel Texier, Guillaume Wong-So; EiffelVision 2: Leila Ait-Kaci, Sylvain Baron, Sami Kallio, Ian King, Sam O'Connor, Julian Rogers. See also acknowledgments for earlier versions in ''Eiffel: The Environment''(TR-EI-39/IE)
+
+Non-Eiffel Software: special thanks to Thomas Beale, Eric Bezault, Paul Cohen, Paul-Georges Crismer, Michael Gacsaly, Dave Hollenberg, Mark Howard, Randy John, Eirik Mangseth, Glenn Maughan, Jacques Silberstein.
+
+===Cover design===
+
+Rich Ayling.
+
+===Copyright notice and proprietary information===
+
+Copyright Interactive Software Engineering Inc. (Eiffel Software), 2001. May not be reproduced in any form (including electronic storage) without the written permission of Eiffel Software. "Eiffel Power" and the Eiffel Power logo are trademarks of Eiffel Software.
+
+All uses of the product documented here are subject to the terms and conditions of the Eiffel Software user license. Any other use or duplication is a violation of the applicable laws on copyright, trade secrets and intellectual property.
+
+Any third-party products mentioned in this document are hereby acknowledged as trademarks of their respective owners.
+
+===Special duplication permission for educational institutions===
+
+Degree-granting educational institutions using EiffelStudio teaching purposes as part of the [http://www.eiffel.com/educators/resources.html Eiffel University Partnership Program] may be permitted under certain conditions to copy specific parts of this book. Contact Eiffel Software for details.
+{|
+|-
+| Cancel if you are happy with the pre-generated version. But let's get started anyway to understand the principles and possibilities.
+
+Click the following menu entry, used to generate documentation:
+
+ Project --> Generate documentation...
+
+
+This is the next-to-last entry in the Project menu. The last one, by the way, XMI Export ..., is directly relevant too: it will make it possible to export information in the standard XML representation for UML, for consumption by third-party products such as Rational Rose. But for the moment we choose the Documentation entry to start the Eiffel Documentation Wizard.
+
+The Wizard starts with a list of available output formats, also called filters:
+
+[[Image:index-37]]
+
+The filter names correspond to major documentation formats which EiffelStudio supports by default. Among the most important, listed here in rough order of appearance in the list:
+* ASCII : plain text, no formatting codes.
+* eiffel : essentially the same as ASCII; useful if you want EiffelStudio to pretty-print your class texts and replace the originals, as explained below.
+* MML : internal format for Adobe FrameMaker.
+* Postscript : to generate Adobe Postscript output, suitable for printing on a Postscript printer, display on a Postscript previewer such as Ghostscript, or distilling to Adobe PDF.
+* COM : to generate class specifications in the form of an Interface Description Language (IDL) interface for Microsoft's COM component model.
+* RTF : Microsoft's Rich Text Format, used in particular for Windows "Help" files.
+* TeX1, TeX2 : two variants for Donald Knuth's TEX processing format.
+* troff : if you already know what this is, congratulations (or condolences), you've been around the industry for a while. This is a traditional text-processing format available on Unix systems. Also works for the gtroff variant.
+* html-classic : HTML, no style sheets. The next variant, with style sheets, is strongly recommended unless your colleagues will be reading your documentation with Mosaic 1, vintage 1993, or Netscape 2, Vintage 1995.
+* html-stylesheet : HTML with style sheets. This is particularly attractive for Web publishing not only because the output makes full use of style sheet capabilities (fonts, colors, layout, formatting) but also because it becomes trivial to change the look-and-feel to support any style you or your users like, even after generation, simply by editing the style sheet file.
+
+Not only do these predefined filters provide support for a number of important industry formats; better yet, if you want another format not represented on the list, or would like to adapt an existing format to your own style preferences, it's easy to define a new filter. The list that EiffelStudio displays comes from the files with a .fil extension that it finds in a subdirectory of the installation:
+$ISE_EIFFEL/studio/filters
+
+To define a new filter, simply add a file to this directory. Filters are expressed in a simple notation called EFF ( Eiffel Filter Format ), general enough to support a wide variety of tools for text processing, project management, Web publishing etc. The best way to define a new filter is usually to start from an existing one and adapt it. You will find the specification of EFF at the end of this manual, [[APPENDIX: WRITING DOCUMENTATION FILTERS WITH EFF, THE EIFFEL FILTER FORMAT|here]] .
+
+==Generating an HTML record of your project==
+
+Let's select the most obviously attractive of the predefined filters: HTML with stylesheets. Click the line html-stylesheet in the list to make it active, then click Next at the bottom of the Documentation Wizard window. The next window appears:
+
+[[Image:index-38]]
+
+In this pane you select which parts of your system you want to be included in the documentation. By default, all library and cluster names are checked. You should uncheck any that you do not want included.
+
+Note that each library or cluster name must be checked or unchecked individually. For example, unchecking "base" will not automatically deselect "elks" and "ise" which appear under "base".
+
+For this Tour we'll want to generate everything, including EiffelBase, so make sure that in the end all library and cluster names are checked, as in the figure. Then click Next.
+
+==Generating Metatags from Note entries==
+
+The next step of the documentation wizard asks you to select Note entries:
+
+[[Image:index-39]]
+
+Eiffel classes, as you know, may start with an note entry that enables class authors to include documentary information in any category they like. It is standard (and part of the official style guidelines) to include at the very least an entry of the form description: Descriptive text in every class. The earlier displays of class LIST showed that entry, which read " Sequential lists, without commitment to a particular representation".
+
+You may have noted that the purpose of Eiffel's note clauses is, conceptually, similar to that of '''metatags''' in HTML. Metatags carry information which Web page visitors do not normally see in the browser; this information is available, however, to search engines and other tools that explore and classify Web pages. So it seems quite appropriate to generate metatags from note entries.
+
+The dialog illustrated in the last figure lets you select the entries you wish to transform into metatags. It appears only if you have selected an HTML filter. It lists all the note tags found anywhere in the system; those that are checked will be retained for metatags. Initially unchecked are three tags ("date", "revision", and "status") conventionally used -- at Eiffel Software and other Eiffel sites -- for interfacing with configuration management tools, and hence of internal interest only.
+
+There is no need to change the default selection, so just click Next.
+
+==Choosing a level of detail==
+
+The next step of the Documentation Wizard lets you specify what kinds of documents you want to generate:
+
+[[Image:index-40]]
+
+This is a very important facility since it gives you control over how much you want to publish about the properties of the software:
+* You may want to publish everything, source included, for example on your Intranet for a group of developers working closely together on the same classes, or on the Internet for open-source software.
+* You may want to publish only the interfaces (Contract or Flat-Contract views). This is not necessarily to protect proprietary information; even if you don't care about showing your source code, it is usually too detailed for client programmers, especially in the case of libraries. If various teams work on separate parts of a project, what each releases to the other should usually be the specification, not the implementation.
+* You may of course want to publish both the text and the interface, and let the recipients use the version that best suits their needs for each use.
+* You may want to publish the diagrams, showing the structure in graphical form. Note the warning -- which we are about to ignore -- telling us this may take a while.
+* The class list, cluster list, cluster hierarchy view, cluster chart (following the conventions of BON) are also optional.
+
+The dialog shown on the last figure lets you specify the exact combination you wish. The figure indicates the default options.
+
+This time, if we generate anything, we'll generate everything. Please check '''all''' the boxes (the generation won't occur until the last step) and click Next to move to the next dialog of the Documentation Wizard.
+
+==Specifying cluster views==
+
+The next dialog only appears when you have asked to generate diagrams:
+
+[[Image:index-41]]
+
+Although we didn't use this possibility yet, the Diagram view lets you define different subviews of any cluster. One view might show inheritance only, the other client links only; one might include all classes, the other hide some library classes. The last dialog shown will allow you, for any cluster, to select a subview other than the default for the generated diagram.
+
+Here we only have the default view, so just click Next.
+
+==Generating==
+
+The last dialog simply asks you where you want to generate the result:
+
+[[Image:index-42]]
+
+By default, as shown, EiffelStudio will produce the documentation in a subdirectory -- created for the occasion, if it doesn't exist yet -- of the project directory:
+
+.../your_project_directory/Documentation
+
+You may, however, select any other location you like. In the case of HTML generation, as here, EiffelStudio takes great care to use only '''relative hyperlinks''' so that you can move the Documentation directory around, for use either on a file system or on your Web site, with the guarantee that the hyperlinks will work -- as long as you move the entire directory together.
+
+To continue the Guided Tour, you do '''not''' need to complete the generation now unless you want to. If you are happy to continue without generating the documentation at the moment then click Cancel on the last dialog.
+
+{{note|If you do prefer to produce your own local version of the full documentation for the guided tour system, click "Finish". The process takes 7 minutes on the Thinkpad configuration mentioned earlier, and generates a documentation directory of about 220 megabytes. }}
+
+==Browsing generated documentation==
+
+Let's take a look at the generated documentation. We start with the root of the generated documentation, Documentation/index.html :
+
+[[Image:index-43]]
+
+This root page shows overall information about the system. The top set of links, repeated at the bottom, enables you to browse the system from its list of classes, its list of clusters, or the cluster hierarchy; note the box labeled to Go, which provides a built-in search engine, enabling you to type any class list and go directly to the corresponding page. Let's look at the class list: click the box Classes at the top left.
+
+[[Image:index-44]]
+
+This shows the beginning of the list of classes, alphabetically sorted. You could click any class to get the corresponding information, but wait; we'll look at individual classes in a moment. Instead, click Cluster hierarchy to see the overall organization of the system into clusters:
+
+[[Image:index-45]]
+
+Click BASE to see details of the EiffelBase library where (under EiffelStudio) we had found the class LIST used as example in the preceding sections:
+
+[[Image:index-46]]
+
+This indicates the relations of the cluster to others in the hierarchy, and its list of classes. Again you could click any class name but instead note the link (diagram) next to the cluster name near the top. Remember that when generating the documentation we elected to generate everything, diagrams included. Hadn't we checked the corresponding check box, the (diagram) link wouldn't be there. Click it now to get the diagram that has been generated for BASE:
+
+[[Image:index-47]]
+
+The output is a diagram showing graphically the classes of the cluster and their inheritance relations. All EiffelStudio-generated HTML diagrams use the PNG graphics format ( Portable Network Graphics ), supported by all recent browsers.
+
+The class bubbles in a diagram are all hyperlinks. To see the HTML documentation for our old friend the class LIST you could just click its bubble. But because this diagram includes the whole library and is automatically generated, you'd have to look around a bit for the LIST bubble. Go ahead and do that if you wish, or just type the class name LIST into the Go to field and press return:
+
+[[Image:index-48]]
+
+The display shows key information on the class, in a form called the "Chart format" listing the ancestors and then the features, divided into Queries (shown in part on the figure) and Commands. Note that all class names and feature names are hyperlinks, which would lead you to the appropriate place in a class text.
+
+The top row of hyperlinks now includes class formats corresponding to those we discovered in [[Viewing Classes]] in EiffelStudio: Relations (covering ancestors, descendants, clients, suppliers, ), full Text, Contracts, Flat contracts. Click Flat contracts to see the full interface of the class:
+
+[[Image:index-49]]
+
+We'll stop this brief review here but you may continue browsing through the HTML pages if you like. Note how closely the appearance of the class texts, flat forms, contract forms, diagrams and other forms of documentation matches the corresponding formats under EiffelStudio.
+
+Although we suggest staying with the standard, you can easily change any convention that doesn't match your own preferences:
+* For the EiffelStudio appearance, use Tools --> Preferences.
+* For the HTML appearance, if you know about Cascading Style Sheets (CSS) for HTML, edit the style sheet default.css. You will find this file in the generated documentation directory; alternatively, to ensure the changes are applicable to the generated documentation of all future projects, edit defaults.css in the directory after backing it up. For more profound changes in the structure of the generated HTML, you may also backup and edit the Eiffel Filter Format file html-stylesheet.fil in the same directory. EFF is described in the [[APPENDIX: WRITING DOCUMENTATION FILTERS WITH EFF, THE EIFFEL FILTER FORMAT|Appendix]] .
+
+ $ISE_EIFFEL/studio/filters
+
+
+The documentation generation mechanisms, using HTML or other formats, let you publish your designs, at the level of detail you desire, on an Intranet, the Internet, or as part of documents you release. They are an important part of the power of EiffelStudio for quality software development.
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/recompiling-and-editing.wiki b/documentation/18.11/eiffelstudio/Tutorials/recompiling-and-editing.wiki
new file mode 100644
index 00000000..4a9df320
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/recompiling-and-editing.wiki
@@ -0,0 +1,173 @@
+[[Property:title|Recompiling and Editing]]
+[[Property:weight|-4]]
+[[Property:uuid|6574a573-48b9-6088-aa98-53d7119d7c5c]]
+
+So far we have relied on existing class texts. Fascinating as it may be to explore excellent software such as EiffelBase, you probably want to write your own too (with the help of the reusable components in the Eiffel libraries). EiffelStudio provides a built-in editor -- as well as the ability to use some other editor if you prefer -- and sophisticated compilation mechanisms.
+
+==Recompiling==
+
+When we started, we compiled the example system. Let's recompile it, just to see. We'll see compilation entries in the Project menu, but the easiest for the moment is to use the compilation button ([[Image:compile-button]]) in the Project toolbar. Click this button. You haven't changed anything in the project since it was compiled (at least you were not supposed to!), so EiffelStudio will very quickly detect this and finish compilation. On our test platform this takes less than a second. Now of course we should see what happens if you do change something.
+
+
+==Editing==
+
+We don't want to touch EiffelBase classes (and in fact can't, since it is used in precompiled form), so let's focus on classes of our small root cluster. In the Groups tool, expand cluster root_cluster and click class PARENT to retarget the Development Window to it.
+
+Make sure that the Editing Tool is big enough to display the text of the class:
+
+[[Image:es gt development window targeted to parent 01|Class PARENT in Editing tool]]
+
+The Editing Tool hosts a text editor which you can use to change the class text. Here the routine display starts by outputting a simple message; let's precede it by another line of display to check that we affected the outcome. We'll want to add the following two lines just after the do, before the first two instructions of the routine:
+
+ io.put_string ("THIS IS SOME ADDED TEXT")
+ io.new_line
+
+
+You can just use copy-paste from the example above: select the two lines with the mouse, copy them using CTRL-C (or Copy from the Edit menu), then paste them just after the do using CTRL-V (or Paste from the Edit menu). Add or remove tabs to align with the rest of the routine, so that the result will look like what's shown on the next figure. Please check the result and be careful not to introduce any mistakes; in the next section we'll study how EiffelStudio will report syntax and other errors, but right now we want to see what happens when everything is right!
+
+[[Image:es gt development window targeted to parent 02|Class PARENT with changes]]
+
+Now save your changes; you may indifferently use CTRL-S, the Save entry from the Edit menu, or the Save button ([[Image:save-button]]), at the cursor location on the figure. (If you forget to save, the next compilation will tell you so, and ask you if from now on you want all non-saved class edits to be saved automatically.)
+
+
+==Recompiling and executing after a change==
+
+Next compile again, using the Compilation button. Some "degree" messages appear quickly; EiffelStudio has found out what class has changed and deduced what exactly to recompile -- only a subset of the whole system. So this again will proceed very quickly.
+
+Execute the system again now, using one of the execution buttons, with or without breakpoints, on the right in the bottom Project toolbar. You will see that the message output by the execution has changed to include the added string.
+
+
+==Views in the Editing Tool==
+
+In studying the Class tool we discovered a number of views of a class text. For convenience, you can also display a number of these views in the Editing Tool, although only the basic Text view is editable. A row of buttons next to the Class and Feature fields lets you choose between them.
+
+[[Image:view-buttons]]
+
+You can try some of these view now, although there is nothing exciting to show about class PARENT. Make sure to come back to the Text view -- through the leftmost of these buttons -- so that we can continue exploring the editing facilities.
+
+
+==Basic editing facilities==
+
+The editing facilities in the Editing Tool are provided by the EiffelStudio Editor, a specialized tool supporting the development and update of Eiffel texts. As we'll see next, if you have a preferred editor you can use it instead, but the EiffelStudio Editor is worth knowing.
+
+The [[EiffelStudio Editor|EiffelStudio Reference section]] on the Editor provides many more details about editing functions. Here are the essentials.
+
+First, the key property of any interactive system: '''Undo'''. You can cancel the latest editing command, or any earlier one performed during the current session, by choosing Undo from the Edit menu, or typing CTRL-Z. To cancel more than one command, apply Undo repetitively; there is no limit to the number of undoable commands within a session. (When you exit EiffelStudio, however, the editing history is lost.) To redo an undone command, use Redo from the Edit menu or CTRL-Y.
+
+{{note|Since right now we don't need to do any actual editing to continue this Guided Tour, we suggest that you don't change the text of class PARENT but simply look up the menu entries described next, without actually selecting them. If you do make a change, voluntary or not, you should at the end of this editor discussion perform enough Undo commands to get the text of class PARENT back to its original state. }}
+
+To '''copy''', '''cut''' and '''paste''' use the corresponding entries in the Edit menu or the familiar keyboard shortcuts CTRL-C, CTRL-X and CTRL-V.
+
+When you edit text, it will be automatically '''indented''' according to standard Eiffel style rules. If you prefer to remain in charge of your own indenting, you can disable this facility through
+
+Tools --> Preferences --> Editor
+
+To indent a sequence of lines, select the lines, then use
+
+Edit --> Advanced --> Indent selection
+You can also use the Tab key, but only if the selection consists of one or more entire lines; otherwise typing Tab will simply replace the selected text with a Tab character. Shift-Tab will similarly decrease indentation by one step.
+
+To '''comment out''' a sequence of lines, select them and use
+
+Edit --> Advanced --> Comment
+or CTRL-K. Conversely, CTRL-Shift-K will uncomment. Also in the Edit --> Advanced menu are "set to upper case", with the keyboard shortcut CTRL-U, and to lower case, CTRL-Shift-U.
+
+Other useful facilities of the Edit --> Advanced menu are:
+* Embed in "if", or CTRL-I, which will create a conditional instruction and include the selected instructions in it.
+* Embed in "debug", CTRL-D, which will include the selected instructions in a debug ... end instruction, so that their execution becomes conditional on a Debug compilation option.
+
+
+== Search and replace ==
+
+The editor lets you search for text and replace occurrences, individually or globally. We assume you have seen a text search facility before, so we'll just emphasize some of the less obvious features.
+
+To start a search, make sure the [[Search Tool]] is active by clicking the Search button in the top toolbar (this one we'll let you find) or using the
+
+Edit --> Find
+
+menu entry.
+
+{{note|If you press CTRL-F in a tool you will get a quick search bar that quickly allows you to search for something in the current text.}}
+
+The [[Search Tool]] presents a number of self-explanatory options:
+
+
+
+[[Image:search-tool]]
+
+You can enter a term to replace your search term in the Replace with box.
+
+Having filled the two fields, you can elect to replace the last found occurrence, or all occurrences at once.
+
+The Search for field has an associated drop-down list, so that you can reuse a recently entered search string without retyping it.
+
+
+==Let the editor do the typing==
+
+Particularly interesting are the editor's '''automatic completion''' facilities (often, we shorten the name to '''auto-completion'''). Well, particularly interesting for ''most'' people: maybe you like your editor to do the grunt work for you, or maybe you don't. In the latter case -- if you prefer to be in control of all the details -- don't worry: through
+
+Tools --> Preferences --> Editor
+you can easily disable any facility that you don't like. The behavior described here is the default.
+
+The EiffelStudio Editor knows about Eiffel syntax and will recognize syntactic elements as you type them. It will color them according to standard conventions: basic elements in black, keywords in blue, comments in dark red. You can change these conventions through Preferences.
+
+If you start typing a control structure through its opening keyword, such as if, or from for a loop, the editor will automatically display the structure of the whole construct. Here for example is the result if you type the from followed by Return/Enter at the beginning of our example routine:
+
+[[Image:es gt auto complete from 01]]
+
+This has produced the structure of an Eiffel loop: from ... until ... loop ... end. You can then fill in the blanks with the appropriate expression and instructions. The generated lines start with the appropriate number of Tab characters to support the standard Eiffel indenting conventions. If you want a more compact style, follow the from with a space rather than Return. Typing if followed by Return or a space will similarly produce the outline of a conditional instruction.
+
+Also interesting is '''feature completion'''. Feature completion is activated by default, and it works at two levels:
+* You can type the beginning of the name of a feature of the current class, then CTRL-SPACE to get possible completions.
+* Once you have typed the name of a query (attribute or function), either all by yourself or aided by the previous completion technique, you can type a period to get the list of possible features to be applied, deduced from the list of features in the corresponding class (the type of the query).
+
+In both cases, if more than one completion is possible, you will get a menu of the possibilities. You can scroll through it with the up and down arrow keys, or the mouse, and select one through Enter or double-click. You can also or give up through the Escape key.
+
+Here for example is the menu you will see in the body of our example routine if you type io. , where io is the feature, coming from class ANY, that provides access to standard input and output facilities:
+
+[[Image:es gt auto complete feature 01|Feature auto-completion]]
+
+If only one completion is possible, no menu appears; the completion is selected.
+
+When a menu of possible completions is displayed, you can use the arrow keys to traverse the list.
+
+If you select a routine with arguments, auto-complete will show the arguments and their types, allowing you to provide your value for each argument. The figure below shows auto-completion of a routine with only one argument.
+
+[[Image:es gt auto complete argument 01|Auto-completion of arguments]]
+
+You can see that the argument is pre-selected and is of type STRING_8. As soon as you begin to type your substitution for the argument, the pre-selected argument definition is replaced with what you type. When you complete an argument, the Tab key will either pre-select the next argument (in the case of routines with multiple arguments), or place the cursor to the right of the right parenthesis that terminates the routine call (in the case of the last argument).
+
+Auto-completion will only work for queries that were present at the time of the last successful compilation. So if you add an attribute, say attr, to the current class, and do not recompile, typing a then CTRL-SPACE will not display attr. To make sure that it's included in completion proposals, save and recompile. (Remember, incremental compilation is fast in EiffelStudio, so there is nothing wrong in compiling early and often.) The same rule holds for features of ''other'' classes, those that will appear in proposed completions after a period.
+
+The features proposed for auto-completion include all features of the class: those declared in the class itself, or ''immediate'' features, and those ''inherited'' from proper ancestors, direct or indirect, with one exception: by default the list will not include features from the universal class ANY, which serves as ancestor to all classes and provides many features for comparison, copying, input-output, reflection etc. Including ANY's features would clutter all menus with too many features. So for example typing i followed by CTRL-SPACE will not suggest io among the possible completions. You can change this policy through Preferences. The policy does not apply to remote feature completion for an entity x declared of type ANY. In the case that you type x., auto-completion will produce the list of ANY's features.
+
+
+==Using your own editor==
+
+You may have a favorite editor and prefer to use it, at least in some cases. The EiffelStudio incremental compilation mechanism, to be studied shortly, recognizes that files have been modified outside of EiffelStudio (by checking their time stamps) and will without any fuss take their modified versions into account.
+
+You can also call an outside editor on a class from within EiffelStudio. Just use
+
+File --> External editor
+or the corresponding button in the top toolbar.
+
+This will call the editor of your choice. The default is Notepad on Windows and Vi on Unix and Linux. You can easily change this to any editor by entering the desired editor command in
+
+Tools --> Preferences --> General --> External editor command
+
+
+In this command text you can use the two special notations $target and $line ; when EiffelStudio calls the selected command, it will replace any occurrence of $target by the name of the file where the current class resides, and $line by the line number at which the Editing Tool is currently scrolled. If you include one or both of these markers at the appropriate argument positions for the command, this will enable you -- assuming the editor supports the appropriate options -- to make sure it starts at exactly the right place. For example the default editor command under Unix is
+
+vi +$line $target
+
+meaning: start the Vi editor on the $target file, initially positioned at line $line (the + line_number command-line option of Vi directs it to start at line line_number ).
+
+If you start an external editor on a class, then exit the editor after possibly making changes, EiffelStudio will immediately update the class text in the Editing Tool. More generally, note that EiffelStudio will detect changes made separately on the same class, and warn you of possible conflicts.
+
+Several important text editors from various providers have '''Eiffel modes''', which support the syntax-directed editing of Eiffel texts. They include:
+* '''Vim''', for Vi iMproved, an extension of Vi available on both Unix/Linux and Windows -- see www.vim.org
+* '''Emacs''' -- see www.emacs.org.
+* '''Editeur''', a Windows syntax highlighting editor -- see www.studioware.com.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/retargeting-through-pick-and-drop.wiki b/documentation/18.11/eiffelstudio/Tutorials/retargeting-through-pick-and-drop.wiki
new file mode 100644
index 00000000..aa048315
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/retargeting-through-pick-and-drop.wiki
@@ -0,0 +1,164 @@
+[[Property:title|Retargeting Through Pick-and-Drop]]
+[[Property:weight|-5]]
+[[Property:uuid|a3789781-153b-7f4d-bb94-4bdf8923fb56]]
+
+You now know quite a few ways of re-targeting a Development Window to a "development object" -- a class or a feature -- but haven't yet seen one of the most important: "Pick-and-Drop", which lets you pick a development object that you have spotted anywhere in the display, and retarget the current tool, or another, to it.
+
+
+==Trying Pick-and-Drop==
+
+We restart from the last state, with a Development Window target to feature forth of class LIST. The next figure shows the whole window; it should look like what you see as a result of the last operations. We'll use the Descendant versions view of the Feature Tab.
+
+If for some reason the window doesn't look like the next figure, it's easy to reconstruct it: make sure both the Cluster tree and the Feature tree are visible (if not, make visible using the instructions given in [[Viewing Classes#Making some room|Viewing Classes]]); target the tool to class LIST; target further to its feature forth by clicking that feature name in the Features tool's roll of the features of LIST; make sure both the top-left Editing tool and the bottom-left Feature tool are visible; in the Feature tool, select the Descendant versions format.
+
+[[Image:es gt development window feature descendants 01|Descendant versions of forth]]
+
+In the Feature tool near the bottom, there is an entry that reads
+
+ MULTI_ARRAY_LIST [G] forth
+
+
+referring to the version of feature forth in class MULTI_ARRAY_LIST. Let's assume you want to see what that version actually is. It suffices to retarget the tool to it. Of course you could type or copy-paste the class name MULTI_ARRAY_LIST in the Class field at the top of the window, and the feature name forth in the adjacent Feature field. But there is an easier way; after all, you have just seen a reference to the feature, through its name as it appears in the Descendant version format, so it's natural to use it directly from the graphical interface.
+
+As we've seen before, you could control-right-click on the feature name at the place where it appears; this would create a new tab and retarget the Development Window to forth from MULTI_ARRAY_LIST. But you might not necessarily want a new tab. Instead you can use Pick-and-Drop to retarget the current window.
+
+Here is how it works. Position the cursor on the desired feature reference: the word forth in the line forth MULTI_ARRAY_LIST. Right-click, that is to say click the rightmost mouse button and then release it. You will see a context menu that looks like the figure below.
+
+
+[[Image:es gt pnd context menu 01]]
+
+
+The item we want to choose from this menu is "Pick Feature 'forth'". So do that now, by left-clicking over the item.
+
+Now move the mouse around some, but ''without pressing any button'':
+
+
+[[Image:es gt picked forth 01]]
+
+
+The cursor has changed into a new shape, a cross representing the type of development object that you have picked, a feature. For a class, as you may have guessed, it would be a small ellipse ("bubble"). Each kind of development object that you may create and manipulate during your work with EiffelStudio has its distinctive icon. When you '''pick''' an item, you'll notice that the item's icon stays connected to its origin by a dotted line that stretches or shrinks as you move the icon around.
+
+So, now you have '''picked''' the feature forth. You can '''drop''' it at any appropriate place to retarget the corresponding tool. Move your cursor (and the feature icon for forth) over the Editing tool now.
+
+To '''drop''', just '''right-click''' again. (That is to say, as before, press the rightmost mouse button and release it immediately.) Drop the icon representing {MULTI_ARRAY_LIST}.forth in the Editing tool.
+
+This retargets the Development Window to the chosen feature, forth from the class MULTI_ARRAY_LIST. The Feature tool (assuming the Link Context tool option is selected), keeps its current view ( Descendant versions in the Feature tool) and now shows descendants of {MULTI_ARRAY_LIST}.forth.
+
+
+[[Image:es gt development window multi array list forth 01|Retargeted to {MULTI_ARRAY_LIST}.forth]]
+
+
+==Bypassing the context menu==
+
+In the example above, when you right-clicked over an item, you were presented with a "context" menu, containing choices applicable for the item you clicked. We chose to pick the item. It's possible that if you use pick-and-drop quite a bit that you might rather not see the context menu each time you right click. You can make this happen in a couple of ways. First, if you use the context menu most of the time, but you want to pick directly at other times, you can '''shift-right-click''' to bypass the context menu and pick the item immediately.
+
+The other option is used if you want a right-click to pick by default, and only use the context menu occasionally. To make this happen, you need to change the '''Pick and drop (pnd) mode''' [[EiffelStudio Preferences|EiffelStudio preference]]. You can change this preference by following the menu path:
+
+Tools --> Preferences...
+
+When the preferences window opens, expand the '''General''' preferences folder. You'll see '''Pick and drop (pnd) mode''' is set to '''False''' by default. If you wish to change the behavior, then check the box and the value will change to '''True'''. Then you can exit the preferences window.
+
+With '''Pick and drop (pnd) mode''' set to '''True''', you will always get a pick when you right-click over an development object. If you occasionally wish to use the context menu, then you would shift-right-click, which would cause the context menu to appear.
+
+
+==How Pick-and-Drop works==
+
+
+The Pick-and-Drop mechanism is very simple. It consists of three steps:
+* '''Pick''' step: find the development object and pick it: either through the context menu, or by shift-right-click, or by right-click, depending upon EiffelStudio's Pick and Drop Mode.
+* '''Move''' step: move the mouse to the desired drop point, without pressing any button.
+* '''Drop''' step: right-click (again releasing the button immediately) at the drop position.
+
+During the Move step, you can at any time '''cancel the whole operation''' simply through a '''left-click'''.
+
+The Move step is actually optional: if the current position is a valid drop target, as explained next, you can drop immediately after the pick without moving the mouse.
+
+
+==Pebbles, holes, drop targets and type compatibility==
+
+The Pick-and-Drop mechanism relies on the metaphor of '''pebbles and holes'''. When you pick a development object, the cursor changes into a '''pebble''' whose shape represents the type of the development object: cluster, class, feature, run-time object ... You may then drop it into a '''hole''', which can be a window, a tree view entry, or a hole-shaped icon. This performs the appropriate action such as retargeting a tool.
+
+In the same way that Eiffel is a typed object-oriented language, the Pick-and-Drop mechanism is typed: you can only drop a pebble into a compatible hole. For example you may drop a class pebble into a Development Window, to retarget it to the chosen class. If you have picked a development object and have moved its pebble over an area which is an unacceptable place to drop it, you will notice that the pebble takes on its "disabled" form. An enabled class pebble ([[Image:context-class-cursor]]), for example, would become a disabled class pebble ([[Image:context-disabled-class-cursor]]) for the time that it's hovering over unfriendly territory.
+
+In Eiffel, type compatibility is not necessarily type identity, but is governed by ''conformance'', based on inheritance and polymorphism: to an entity of type POLYGON, you may assign not only an expression of that same type, but also one of type RECTANGLE, if class RECTANGLE inherits from -- conforms to -- class POLYGON. Similarly, EiffelStudio considers that the development type "feature" conforms to "class"; this means you may drop a feature into a Development Window targeted to a class; this will retarget the tool to the feature's class and the feature itself, with the text of the class scrolled to the position of the feature.
+
+
+==Clickable formats==
+
+A good deal of the power of Pick-and-Drop comes from its connection with the various views of the Class and Feature tools ... and the Diagram tool which we will see later. As was mentioned when we saw these views, all the feature and class names or other graphical representations that appear in these views are '''clickable''' ; this means that you can select any of them as the source of a Pick-and-Drop.
+
+As a result, you can quickly traverse a system and get to its essential properties by displaying the information of a class in any of the many available views -- the contract and flat contract of a class, its routines, its attributes, its clients, its ancestors, the ancestor and descendant versions of a feature, and so on -- then wherever you see a feature or class name follow the corresponding link. This '''proximity-based''' form of browsing, combined with the other techniques seen earlier, provides considerable help when you are dealing with a large, possibly complex system, and want to master its intricacies, be it for development, testing, debugging, maintenance or revision.
+
+Other places where you can pick development objects include the icons representing classes and features in the Groups tool, Feature tool, and Favorites tool.
+
+
+==Semantic consistency==
+
+An important property of the pick-and-drop mechanism, shared by its cousin the right-click mechanism, has already been mentioned in this chapter: semantic consistency, which guarantees that the operations you can perform on a class, such as pick-and-drop, only depend on the ''development object'' to which you are applying the operation. It doesn't matter where you picked the object -- in any development tool under any view -- and in what form: textual, as a class or feature name; graphical representation, as a class bubble in the Diagram tool; or an icon, for example in the Groups tool, Features tool, Favorites tool.
+
+The pebble that you see during the Move step of Pick-and-Drop represents the underlying development object -- such as a class or a feature -- regardless of how you got to it.
+
+
+==Behind the Pick-and-Drop conventions==
+
+Pick-and-Drop works differently from the usual Drag-and-Drop present on many computing platforms. The usual Drag-and-Drop retains a role within EiffelStudio (to move class bubbles around in the Diagram view) and you may of course have to use it for operating system functions such as copying files. But the key EiffelStudio operation is Pick-and-Drop. This technique is motivated by careful consideration of ergonomics and user comfort. In particular:
+* Pick-and-Drop is much less stressful. Drag-and-Drop requires you to maintain pressure throughout the move, being careful not to drop on the wrong place. With Pick-and-Drop there is no stress: you click and release; get a drop from your coffee cup if you like (optional step); move the cursor with no pressure from your fingers or on your mind; make sure, at your leisure, to find the right drop place; and right-click again on it. At the end of the day, after many such operations, the stress reduction can make a real difference.
+* With Drag-and-Drop, it's easy to lessen the pressure involuntarily and drop on the wrong place. The consequences can be damaging, especially since in such a case you may well not know where you dropped the element; after all, that wasn't intentional. It is possible, for example, to lose files that way. With Pick-and-Drop this is much less likely to happen.
+* Pick-and-Drop makes it easy to cancel the operation if you change your mind: just left-click anywhere. With Drag-and-Drop you have to find an invalid place to drop; this may be difficult, or even impossible! (Sometimes pressing the Escape key works, but this is not universal.)
+
+If you are new to EiffelStudio you may find Pick-and-Drop surprising at first. We trust you will join the ranks of EiffelStudio users who consistently rate it among the most convenient features of the environment.
+
+
+==Pick-and-Drop miscellany==
+
+When you start repeatedly retargeting the Class and Feature tools -- especially when set to "unlinked" behavior -- you will notice the following properties:
+* In most cases, pick-and-dropping a ''class'' into the lower pane where the Class and Feature tools are docked will switch the view to the Class tool, and pick-and-dropping a feature switches to the Feature tool. This is true even if the pane is currently set to the Outputs tool or another unrelated tool.
+* The view displayed in each case -- for example Ancestors for the ''Class'' tool and Flat for the ''Feature'' tool -- is default view for the corresponding tool.
+
+You know by now that if you pick an object and drop in into the Editing tool it will retarget the Development Window and will evict the previous occupant of the current Editing tool tab and display the dropped object in that tab. But, you can also use Pick-and-Drop to create new tabs in the Editing tool. Instead of dropping into a tab, drop the pebble instead in the tab bar of the Editing tool next to existing tabs, or on the "New Tab" icon ([[Image:new-document-icon]]) in the Standard buttons toolbar.
+
+
+==The many paths to retargeting==
+
+As a conclusion to this review of Pick-and-Drop let's recapitulate the various ways we've seen for retargeting a whole Development Window or a tool to a class:
+{| border="2"
+|-
+| '''How to retarget'''
+| '''Same window/tab/tool, or new?'''
+| '''Where described'''
+|-
+| Type class name, then Enter, in class field at top-left of tool
+| Same
+| [[Starting to Browse#Retargeting by name|"Retargeting by name" in the chapter "Starting To Browse".]]
+|-
+| Choose class in Cluster tree
+| Same
+| [[Starting to Browse#Retargeting from the Groups tool|"Retargeting from the Groups tool" in the chapter "Starting To Browse". ]]
+|-
+| Choose class in Favorites
+| Same
+| [[Starting to Browse#Adding to Favorites|"Adding to Favorites" in the chapter "Starting To Browse".]]
+|-
+| "Back" button
+| Same
+| [[Starting to Browse#Moving back and forth|"Moving back and forth" in the chapter "Starting To Browse".]]
+|-
+| "Forth" button
+| Same
+| [[Starting to Browse#Moving back and forth|"Moving back and forth" in the chapter "Starting To Browse".]]
+|-
+| Pick class from history list
+| Same
+| [[Starting to Browse#The Target History|"The Target History" in the chapter "Starting To Browse".]]
+|-
+| Pick-and-drop
+| Existing or new (depending upon drop target)
+| [[Retargeting Through Pick-and-Drop|Chapter "Retargeting Through Pick-and-Drop".]]
+|-
+| Control-right-click on class name or graphical representation found in any tool
+| New tab
+| [[Starting to Browse|"Starting a new tool" in the chapter "Starting To Browse".]]
+|}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/starting-browse.wiki b/documentation/18.11/eiffelstudio/Tutorials/starting-browse.wiki
new file mode 100644
index 00000000..f0088c4f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/starting-browse.wiki
@@ -0,0 +1,179 @@
+[[Property:title|Starting To Browse]]
+[[Property:weight|-10]]
+[[Property:uuid|cb6c2e52-d238-9b55-0b78-ab3af9568550]]
+It was important to take a look at how EiffelStudio stores your project, but unless your idea of fun is to poke around directories to look at compiler-generated files that's not really the exciting part yet. Among the most innovative aspects of EiffelStudio is a unique set of facilities to "browse" through a software system.
+
+
+==Browsing style==
+
+Browsing -- traversing the structure -- is particularly important in object-oriented development and especially in Eiffel because of the speed at which you can construct sophisticated class structures, making use of inheritance, genericity, the client relation and information hiding, and subjecting features to all kinds of adaptations -- renaming, redefinition, undefinition, effecting -- that are key to the expressive power of the software, but call for smart tools to keep track of what's going on. EiffelStudio's tools are second to none. Among their key properties:
+* You can choose many different ways of browsing: sometimes you know the ''name'' of a class or feature, and will get to it just by typing it; sometimes you want to traverse the system through its cluster-subcluster ''structure''; often, you see a reference to element (class or feature) in the text of another element, and just want to get to it by following that reference, like a ''hyperlink''. You'll be able to use all these techniques, and alternate freely between them.
+* The browsing facilities are always available. There is no "browser" in EiffelStudio; you just browse when you want to, by looking at the information you need. You can do this while editing, debugging, or performing any other of the analysis, design, implementation, extension and maintenance tasks of system construction.
+* Although classes are stored in files and clusters in directories, you can for the most part forget about the file system. Unlike most environments, which let you manipulate files containing software texts, EiffelStudio lets you concentrate on your development objects -- the units that make sense for you: features, classes, clusters, systems. You think in terms of those conceptual units, and don't have to worry about where they are stored. Most of the time, you'll just forget about files and directories.
+* You can produce many views of the development objects. For a class, you may see the full text, the interface only, the inheritance structure, the clients, the features, and many other views. You can even display graphical views along with textual ones. All these are fully browsable; you can go from one to the other as you please.
+
+
+==A Development Window==
+
+Let's see how this works. First, take a look at the EiffelStudio window:
+
+
+[[Image:es gt a development window 01]]
+
+
+{{note|If some parts are too small, just resize the window to arrive at something like what's on the figure. As soon as you have resized it, EiffelStudio will remember that size, and start up in the next session with the size you've set.}}
+
+You can see that the bulk of the Development Window is divided into three primary panes or areas. The [[EiffelStudio Editor|'''Editing''']] tool is the large pane on the top left. The Editing tool supports a tabbed display of the elements in your system ... usually that's class text, and it's in the Editing tool that you make changes to your software. In the image above, it is targeted to the root cluster of our example system. We'll target the Editing tool to a class in a moment. The other two areas support multiple tools, also using a tabbed display. In the area below the Editing tool you see the '''Outputs''' tool currently selected. As you can see there are other tools represented by the tabs at the bottom of the same area. Likewise, the area to the right of the Editing tool shows the '''Groups''' tool selected, but in that area are also tabs for other tools. You will find that the layout of the Development Window is very flexible. Different tools can be made visible or hidden, panes can be removed, new panes created, tools can be docked in these areas or viewed as standalone windows. The appearance of EiffelStudio can be tailored to your needs and preferences.
+
+So far we have talked about "the EiffelStudio window", but in fact that's not correct. What you see is one '''Development Window''', of which you can have as many as you wish. Some people prefer to use a single development tool, avoiding screen clutter; others don't think twice about having lots of windows, taking the "desktop metaphor" to its full conclusion (some non-computer desktops are quite cluttered). There are many ways to start a new Development Window; for example if you look at the entries in the File menu at the top left -- don't select any of these entries yet, just look -- you'll see, among others, New window, which would create a new Development Window.
+
+Whether you have one Development Window or many, each may have as its '''target''' an element of the system: system, cluster, class (the most common case), feature, run-time object. This simply means that the tool displays information about that element.
+
+
+==Retargeting by name==
+
+In our first look at the Development Window, the Editing tool was empty. To target it to a specific class, you can just type the class name -- if you know it -- into the '''Class field''' at the top left:
+
+
+[[Image:es gt class field 01]]
+
+
+Let's use one of the most basic classes, STRING_32 from the Kernel Library of EiffelBase. Bring the cursor to the Class Field, click to make it active, type string_32 (or STRING_32 ) and the Enter key. As shown on the next figure, this causes a new tab to be created in the Editing tool and retargets the Development Window to class STRING_32. Note that you didn't have to worry about where the class resides in the files of your computer. Also, it doesn't matter, when you enter the name into the field, whether you use lower or upper case, or some mix; EiffelStudio will show the name in all upper case because that is the standard Eiffel convention for class names.
+
+
+[[Image:es gt string 01]]
+
+
+Retargeting by name is only one way to retarget a Development Window. There are other ways of retargeting that are useful at different times. Let's look at some of them.
+
+
+==Retargeting from the Groups tool==
+
+Your first browsing action used a class of which you knew the name, STRING. What if you don't know what's in the system and want to explore it? Among other techniques, you can let the Groups tool, guide you through the classes that are available to your system.
+
+An Eiffel system, as you know, is organized into clusters and libraries (and assemblies on some .NET systems). Additionally, clusters can be structured hierarchically into subclusters. You can expand the clusters and libraries nodes in the Groups tool (by clicking the little + signs to the left of the node icons) in order to see the classes. Try it, and what you see should look about like the following figure:
+
+[[Image:es gt groups tool 01]]
+
+
+You'll see one cluster: root_cluster, containing the few classes specific to our Guided Tour system. Under libraries you'll see base which provides the classes of the EiffelBase library, and base_precompile which does not provide any classes directly (precompiles are present to speed up compilation time by precompiling classes, so base_precompile is just a precompiled version of the contents of the EiffelBase library). Let's go into base, Eiffel Software's open-source library of fundamental reusable mechanisms.
+
+The most extensive subcluster of the EiffelBase library is structures, which contains implementations of major data structures and algorithms of computing science. Expand structures to see its own subclusters:
+
+[[Image:es gt groups tool 02]]
+
+{{note|If you initially don't see as many details as shown on this figure, you may get them by resizing the window, moving the vertical pane boundary, and/or scrolling.}}
+
+The EiffelBase Data Structure library and its subclusters are described in the book [http://www.eiffel.com/services/training/books.html Reusable Software]. Let's go to one of the most frequently used subclusters, list, containing implementations of list structures. Expand the subcluster list. This time, since list is a terminal cluster, it's not subclusters you'll see, but '''classes''', identified by small ellipses ([[Image:class-normal-icon]]):
+
+[[Image:es gt groups tool 03]]
+
+The ellipse, or "bubble", is indeed throughout EiffelStudio, as in the Business Object Notation (BON, the underlying graphical convention), the distinctive symbol for classes. You will notice that instead of the bubble, some classes are represented by what we call the "expanded" icon ([[Image:expanded-normal-icon]] ). These are still Eiffel classes. They are represented this way to show that they are marked as [[I2E: Types|expanded]]. Still other classes have a modified bubble ( [[Image:class-deferred-icon]] ) indicating that they are marked as [[ET: Inheritance#Deferred features and classes|deferred]].
+
+Our second technique for retargeting a Development Window to a class (other than typing the class name as we did before) is to click the class in the Groups tool. Do this now: click LIST in the tree. It doesn't matter whether you click on the class name or the adjacent bubble. This retargets the tool to class LIST.
+
+[[Image:es gt Development Window targeted to list 01]]
+
+
+As the tool is now targeted to LIST, the Class Field at the top left now shows the name of that class, exactly as if we had typed that name, the way we did with STRING_32 in the previous method of retargeting.
+
+
+==Moving back and forth==
+
+Here now is a third way to retarget. Towards the top-left part of the Development Window there are Back and Forth buttons, which will enable you to revisit classes already seen during the current session:
+
+[[Image:es gt go back 01]]
+
+Click the Back button. This retargets the tool to the class you visited previously: STRING_32. The Forth button, immediately to the right of Back, becomes active. Click it to retarget back to LIST.
+
+Note that all buttons of the interface have a "tooltip" as shown in the figure above. if you move the cursor on a button, '''without clicking''', and wait a second or so, a small message comes up, explaining the purpose of the button. Also, if there is an associated keyboard shortcut, it will be displayed in the tooltip.
+
+
+==The Target History==
+
+As a fourth way to retarget -- there are more, and after this one we'll stop counting -- you can also use the Target History menu, which you can bring up through the little arrow to the right of the Class Field:
+
+[[Image:es gt target history 01]]
+
+If you click this arrow -- the little black triangle -- you will see a menu of all your recent targets. Doing this now will only show the two classes visited so far, STRING_32 and LIST, but later on there will be more entries. By default EiffelStudio remembers 20 history entries; this is one of the settings you can change later if you wish, through the menu path:
+
+Tools --> Preferences
+
+But, let's don't do that now.
+
+
+==Adding to Favorites==
+
+If you find yourself often needing to examine a particular class, you can add it to your [[Favorites tool|Favorites]], much like adding an interesting page's web link to the bookmarks of a Web browser.
+
+It's easy to add the current target -- currently, LIST -- to your Favorites. Do it now by following the menu path:
+
+Favorites --> Add to Favorites
+
+
+[[Image:es gt add to favorites 01]]
+
+Now display the favorites; one way is to go back to that same Favorites menu:
+
+Favorites --> Favorites
+
+The Favorites tool appears as a tab in the same area as the Groups tool:
+
+[[Image:es gt favorites 01]]
+
+This gives us one more way to retarget a Development Window: click a class in the Favorites tool. ''Two'' ways actually, because once you add a class to Favorites, it appears in the Favorites menu and you can select it by choosing its menu item.
+
+[[Image:es gt list added to favorites 01]]
+
+Right now we don't need the Favorites tool, so you can get rid of it by clicking the little Close icon at the top right of the Favorites pane:
+
+[[Image:es gt close favorites 01]]
+
+
+After you close the Favorites tool, you may see some tool other than the Groups tool that we had been using. If this is the case, click on the Groups tool's tab at the bottom of the pane to make the library classes visible again.
+
+
+==Using additional Editing tool tabs==
+
+So far, even though we've targeted to the Development Window to different classes, we've only used one Editor tab. But it is helpful sometimes to have views of several classes handy in multiple editor tabs. Its easy enough to create a new tab at the time that you target the Development Window to a new class. For example, you should see the class CHAIN in the Groups tool's view of the the list subcluster of structures (the same place we found class LIST. Instead of clicking on CHAIN the way we did LIST, this time '''control-right-click''' on CHAIN, that is to say, click with the rightmost button of the mouse while holding the CONTROL key on the keyboard. This creates a new tab for CHAIN and retargets the Development Window to that class, while sliding the existing tab for class LIST to the right a bit.
+
+
+[[Image:es gt development window multiple tabs 01]]
+
+
+You can click on any of the tabs and the Development Window will be retargeted to the class associated with the tab. Each tab has a "Close" button on it, so you can close tabs you no longer need.
+
+So, for now, close the tab with the class CHAIN and leave just the one tab with class LIST.
+
+==Using additional Development Windows==
+
+With all the techniques seen so far, you were able to retarget the current the Development Window to a new class. And that may be all you'll ever need. But, as noted earlier, you may also wish to have two or more Development Windows active simultaneously.
+
+To create a new Development Window, follow the menu path:
+
+File --> New Window
+
+This will create a new Development Window with a title bar that reads "Empty development tool #1" because the window is (as yet) untargeted. You can also create a new Development Window by using the keyboard accelerator: CTRL-N.
+
+You can close a Development Window either by clicking its close button in the corner of the window, or by following the menu path:
+
+File --> Close Window
+
+
+Be careful not to try to use:
+
+ File --> Exit
+
+to close a single window. This menu command will exit the entire EiffelStudio development environment, closing all windows.
+
+If, during a session, you end up with a number of windows active and want to see an active index to them, you can invoke the [[Windows tool|active windows tool]] by following the menu path:
+
+View--> Tools--> Active windows
+
+
+[[Image:es gt active windows tool 01]]
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/starting-eiffelstudio-and-opening-project.wiki b/documentation/18.11/eiffelstudio/Tutorials/starting-eiffelstudio-and-opening-project.wiki
new file mode 100644
index 00000000..3adf479f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/starting-eiffelstudio-and-opening-project.wiki
@@ -0,0 +1,29 @@
+[[Property:title|Starting EiffelStudio and Opening a Project]]
+[[Property:weight|-13]]
+[[Property:uuid|676cf329-5640-69c4-d10b-b56fcd3f2ff9]]
+In the rest of this Tour YOURDIR denotes the directory where the example resides (the original, $ISE_EIFFEL/examples/studio/tour , or a copy). Launching will use the operating system's mechanism for starting a program, so we look separately at Windows and at Unix/OpenVMS.
+
+
+==Launching EiffelStudio under Window==
+
+On Windows, you can launch EiffelStudio from the Start Menu by following the path:
+
+Start --> Programs --> EiffelStudio Version --> EiffelStudio
+
+
+where Version is the version number, e.g. 6.5. Alternatively, you can double-click the icon that the installation procedure will have added to your desktop (if you have selected that option during installation).
+
+If this is the first time you are using EiffelStudio, you may get a dialog asking for an unlock code or inviting you to register the product. See [[Software Installation for EiffelStudio|your platform installation instructions]] for registration information.
+
+
+==Launching EiffelStudio under Unix or OpenVMS==
+
+To launch EiffelStudio on Unix or OpenVMS, change directory to YOURDIR and, from the command line, type
+
+estudio
+
+
+In general you can start EiffelStudio from any directory, but to make things simple for this Tour '''please make sure''' indeed to execute the estudio command from YOURDIR. (This will allow us to use relative rather than absolute names for some of the files involved.)
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/using-automatic-class-licensing.wiki b/documentation/18.11/eiffelstudio/Tutorials/using-automatic-class-licensing.wiki
new file mode 100644
index 00000000..77b9b1a2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/using-automatic-class-licensing.wiki
@@ -0,0 +1,137 @@
+[[Property:title|Using automatic class licensing]]
+[[Property:weight|2]]
+[[Property:uuid|3abb5fc8-b5e5-2d25-fcac-72929abba0a7]]
+You can use EiffelStudio to include a license text in each of your classes automatically. The automatic class licensing facility is flexible so that you can use various strategies to retrieve the license text used.
+
+When you save the text of a class file in EiffelStudio, the automatic licensing facility searches for an appropriate license text file to use. If such a file is found, then EiffelStudio includes the contents of that file as an ending note part in your class. Here's the text of a class that includes an Eiffel Software license:
+
+
+class
+ APPLICATION
+
+inherit
+ ARGUMENTS
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make
+ -- Run application.
+ do
+ print ("Hello Eiffel World!%N")
+ end
+
+note
+ copyright: "Copyright (c) 1984-2010, Eiffel Software"
+ copying: "[
+ Duplication and distribution prohibited. May be used only with
+ Eiffel Software products, under terms of user license.
+ Contact Eiffel Software for any other use.
+ ]"
+ source: "[
+ Eiffel Software
+ 5949 Hollister Ave., Goleta, CA 93117 USA
+ Telephone 805-685-1006, Fax 805-685-6869
+ ]"
+end
+
+
+
+==License file format==
+
+License text should appear in a text file with the file type ".lic". The text should contain the note clause which includes the license text and nothing more. EiffelStudio will parse the text and invalid instances of license text will not be merged into the target class.
+
+The following text is the content of the license text file which was used to annotate the class shown above:
+
+
+${NOTE_KEYWORD}
+ copyright: "Copyright (c) 1984-${YEAR}, Eiffel Software"
+ copying: "[
+ Duplication and distribution prohibited. May be used only with
+ Eiffel Software products, under terms of user license.
+ Contact Eiffel Software for any other use.
+ ]"
+ source: "[
+ Eiffel Software
+ 5949 Hollister Ave., Goleta, CA 93117 USA
+ Telephone 805-685-1006, Fax 805-685-6869
+ ]"
+
+
+Notice that a variable is used for the note keyword (to support the language keyword change from indexing to note). Also a variable for the current year is used in the copyright notice.
+
+
+==Location of license text files==
+
+Where you keep your license text files depends upon which method you use to have EiffelStudio retrieve the license text from the files. Generally, license text is retrieved from files in one of three places:
+
+===Your project directory===
+This is the directory that contains your project configuration file, the ".ecf" file).
+
+[[Image:Automatic class license project directory]]
+
+===The Eiffel Software license template directory===
+This directory is located at: $ISE_EIFFEL/studio/templates/licenses
+
+[[Image:Automatic class license Eiffel Software directory]]
+
+===The Eiffel user files license template directory===
+This directory is located at: $ISE_USER_FILES/studio/templates/licenses
+
+[[Image:Automatic class license Eiffel user files directory]]
+
+
+==Methods of retrieval==
+
+===Designating a license in class source code===
+
+You can put a note in the source code of a class which will cause EiffelStudio to search for a corresponding license file and then include the license text from that file. Here's what such a note might look like:
+
+
+note
+ license_name: "OurLicense"
+
+
+The license_name term should be placed in the top note clause of the class. (If you include in the bottom note clause, the license_name term itself will be removed when the class license gets replaced.)
+
+In this case, EiffelStudio will search for the file `OurLicense.lic'. It will look first in the '''Eiffel user files license template directory''', then in the '''Eiffel Software license template directory'''.
+
+If you look in the '''Eiffel Software license template directory''' (or in the image of that directory shown above), you will see several standard license files that are used by Eiffel Software, for example, forum2.lic and eiffelsoftware. Also included is default.lic, which we'll examine [[#The default license|later]].
+
+You should create your customized license text files in the '''Eiffel user files license template directory''', or in a local project directory as described below.
+
+
+===Using a local project license file===
+
+If you use the same license for a particular project, or set of related projects, you can keep the license file in the project directory along with your project ( .ecf ) file. In this case EiffelStudio will include the license text from that license file in each class in the project.
+
+This method has the advantage that it is not necessary to put the license_name term in the source code of classes.
+
+The license text file should be named in one of two ways:
+
+:# The .lic file name corresponds to the project name (e.g., my_project.lic for my_project.ecf)
+:# The license text file is named license.lic
+
+The second option is convenient if you have a project, a library for instance, that has multiple .ecf files for different purposes.
+
+Even if the license text you want to use is in one of the license template directories, you can use this local method to retrieve that text without including a license_name term in the source code for each class. You do this by building a local license text file and include in it only a reference to the appropriate license name.
+
+For example, suppose that the our license text is in the file OurLicense.lic in the '''Eiffel user files license template directory'''. To include the license text in the classes of our_project, the our_project.lic (or license.lic) file would contain this reference:
+
+
+ reference:OurLicense
+
+
+
+===The default license===
+
+As mentioned earlier, the file default.lic exists in the '''Eiffel Software license template directory'''. This file is empty ... and you should probably leave it that way.
+
+The license text in default.lic is added to a class when no license_name term is found in the source code and no appropriate license text file exists in the project directory. So, because the default.lic file is empty, no license text is added to classes by default.
+
+However, if you would like to set up a different default license text behavior, you can do so. Just create a default.lic file in the '''Eiffel user files license template directory''', and whenever license text is not found by some other method, the text from your customized default.lic will be included.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/using-autotest/create-manual-test.wiki b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/create-manual-test.wiki
new file mode 100644
index 00000000..ff00d6bc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/create-manual-test.wiki
@@ -0,0 +1,323 @@
+[[Property:title|Create a manual test]]
+[[Property:weight|2]]
+[[Property:uuid|32273F6B-AA84-475F-86B8-143F212FB40E]]
+==A system to test==
+
+For developing our manual test, let's use a simple system that contains a class modeling bank accounts. Here are two classes that will make up our system. The first, APPLICATION will be the root class of our system. APPLICATION really only serves to declare an attribute of type BANK_ACCOUNT, which is the class we will write a test against. APPLICATION looks like this:
+
+
+class
+ APPLICATION
+
+inherit
+ ARGUMENTS
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make
+ -- Run application.
+ do
+ create my_account
+ end
+
+ my_account: BANK_ACCOUNT
+
+end
+
+
+
+And here's the class BANK_ACCOUNT:
+
+
+class
+ BANK_ACCOUNT
+inherit
+ ANY
+ redefine
+ default_create
+ end
+feature
+ default_create
+ do
+ balance := 0
+ end
+
+ balance: INTEGER
+
+ deposit (an_amount: INTEGER)
+ -- Deposit `an_amount'.
+ require
+ amount_large_enough: an_amount > 0
+ do
+ ensure
+ balance_increased: balance > old balance
+ deposited: balance = old balance + an_amount
+ end
+
+ withdraw (an_amount: INTEGER)
+ -- Withdraw `an_amount'.
+ require
+ amount_large_enough: an_amount > 0
+ amount_valid: balance >= an_amount
+ do
+ balance := balance - an_amount
+ ensure
+ balance_decreased: balance < old balance
+ withdrawn: balance = old balance + an_amount
+ end
+
+invariant
+ balance_not_negative: balance >= 0
+end
+
+
+You shouldn't let it worry you if you've noticed that the class BANK_ACCOUNT contains some flaws. We'll deal with these later.
+
+If you want to work along with this tutorial, you should be able to copy the text of each these classes from this page and paste it into the EiffelStudio editor pane. Build a system using these two classes, and {APPLICATION}.make as the root.
+
+
+{{note|If you are using EiffelStudio version 6.3, there two things you will need to do to prepare your system for use with AutoTest. Both of these are done from the [[EiffelStudio: Project settings window]].False for the Recursive attribute of your project cluster in [[Group options]].}}
+
+==Getting to the AutoTest interface==
+
+If the AutoTest interface is not on a tab next to Clusters, Features, and Favorites, you can invoke it by following the menu path:
+
+View --> Tools --> AutoTest
+
+Depending upon your version and platform, the AutoTest interface should look about like this:
+
+
+[[Image:AutoTest empty tool 01]]
+
+
+==Creating a new test==
+
+To begin the process of creating a new test, click the Create New Test button ( [[Image:create new tests]] ) on the interface's tool bar. When you click this button, by default AutoTest will set you up to create a new Manual test. To choose a different test type, click the small triangle to the right of the Create New Test button and you'll be presented with a drop-down menu of choices:
+
+
+[[Image:AutoTest create new test|Create new test drop-down menu]]
+
+
+For now, let's select Create Manual Test.
+
+If this is the first time you've used the testing tool for this project, it is likely that you will be presented with a dialog box asking if you want to add the testing library classes to your project and recompile:
+
+
+[[Image:AutoTest add testing libraries dialog]]
+
+You want EiffelStudio to do this before launching the wizard so, click "Yes". In a moment, your system will have recompiled with the testing library classes available. Remember that you won't need to interact much with the testing classes, but AutoTest uses them, so they need to be available. As long as the testing classes stay available, you should not see this dialog again for the current project.
+
+
+==The Manual Test Pane==
+
+After the compile completes, then the first pane of the New Eiffel Test Wizard appears. It's the Manual Test pane and should look like this:
+
+
+[[Image:AutoTest Manual Test pane]]
+
+
+Here we will name our test. Let's say that we plan to write this test against the feature {BANK_ACCOUNT}.deposit. We'll give this test the name test_deposit_01. The name uses an ad hoc naming convention for tests. You can use this, or develop your own. The prefix test_ comes before the feature name it will test, and the suffix _01 follows, so that we have a framework for adding more tests against deposit. Again, you can choose any naming scheme that makes sense to you. You may want to try to describe the test in its name. For example, test_deposit_very_large_amount.
+
+We're ready to click '''Next''', but before we do, let's look at the check boxes on this wizard pane. The two check boxes labeled '''Redefine `on_prepare`''' and '''Redefine `on_clean`''' have to do with the way that tests are run.
+
+AutoTest runs each test as a three step process:
+# Preparation
+# Execution
+# Clean up
+
+There are features in class EQA_TEST_SET named prepare and clean which accomplish steps 1 and 3 above. These features are frozen, therefore you cannot redefine them in a test class (i.e., a descendant of EQA_TEST_SET) However the class does provide features that can be redefined so that you can include custom behavior before and/or after the execution of a test. These features are on_prepare and on_clean. So if you check one of these boxes, then the test class that is built for you will include a redefined feature ready for you to implement. In this simple example, we'll leave both boxes unchecked.
+
+
+{{note|The check box labeled '''System level test''' is displayed here as not sensitive. This box is reserved for future system level testing capability in AutoTest, so for versions including 7.0, you can ignore it. }}
+
+
+Another thing to notice before we click '''Next''', is that at this point we could click '''Launch'''. '''Launch''' will immediately try to create the test with the information it has available. The idea is that if you are creating several similar tests, you can change the test routine name and leave the rest of the information as you had entered it on a previous test. This keeps you from having to traverse the wizard panes entering the same information repeatedly.
+
+But in our case, we need to use the subsequent wizard panes, so let's click '''Next''', to go to the next one.
+
+
+==The Tags Pane==
+
+
+[[Image:AutoTest Tags pane empty|Tags pane]]
+
+
+With this pane, you identify tags for your test that allow you to manage your test set more easily in the future. Read more in [[#About Tags|About Tags]] below.
+
+For this test, we will include only a tag that identifies the class and feature covered by the test. To do this we click '''Add tag for covered class/feature'''. When we do, we are presented with a dialog in which we can choose a class and feature.
+
+
+[[Image:Autotest test coverage tag dialog|Dialog for coverage tag]]
+
+
+We'll choose class BANK_ACCOUNT and feature deposit, click '''OK'''.
+
+Now you should see the coverage tag in the list of '''Tags used in new test'''.
+
+
+[[Image:AutoTest Tags pane|Tags pane]]
+
+
+That takes care of adding our coverage tag, so let's click '''Next''' to go to the next wizard pane, the '''General''' pane.
+
+
+==The General Pane==
+
+
+[[Image:AutoTest General pane empty|The General Pane]]
+
+
+We will use this wizard pane to name our test class and let AutoTest know where we want the test class to reside. You can give a test class any name you wish, as long as it doesn't conflict with another class name in your system. If you try to type in a class name that already exists, the wizard will let you know right away by changing the text color to red. There is a convention that has arisen around test class names. If possible, make the test class name the name of the target class, prefixed with TEST_. So in our case, we want to build a test against a feature of the BANK_ACCOUNT class, so we will name our test class TEST_BANK_ACCOUNT.
+
+Now, for the question of where the tests should be kept.
+
+By default, tests will be stored in a subdirectory of the EIGENs directory that is generated by the Eiffel compiler. Because it's the default, it's the quickest, easiest way to house tests. But it may not be the best for you in the long run. For example, if you manually delete the EIFGENs directory, which is occasionally necessary, you will lose your tests.
+
+You could include them in the same cluster as some of your application classes. But there are some advantages to keeping the test classes in a '''test cluster''' separate from your target classes. For example, it will be easier for you to deliver your application or library classes if the testing classes aren't mixed with your domain classes. A '''test cluster''' is just a cluster of classes that EiffelStudio and AutoTest expect to contain test classes. So, in our case, let's create a new testing cluster as a subcluster of the cluster in which the classes APPLICATION and BANK_ACCOUNT reside.
+
+First, uncheck the box labeled '''Use EIFGENs cluster'''.
+
+Notice the '''New cluster''' link on the General pane. We click that link to add a new test cluster. The '''Add Cluster''' dialog box appears:
+
+
+[[Image:AutoTest Add Cluster dialog]]
+
+
+We can name our test cluster tests, the default, and make it a subcluster to our root cluster accounts. Notice that there is a '''test cluster''' check box on the dialog. It is checked and disabled, so at this point in the wizard you would always create a test cluster. Let's also check the box labeled '''recursive'''. Once the test cluster is created, we're back to the General pane which now looks like this:
+
+
+[[Image:AutoTest General pane]]
+
+
+At this point we have provided all the information necessary for AutoTest to create the shell for a manual test on the deposit feature of the BANK_ACCOUNT class.
+
+So, now we click '''Launch''', and AutoTest creates our test set and test.
+
+
+
+==Writing a test==
+
+Let's look at the class TEST_BANK_ACCOUNT:
+
+
+note
+ description: "[
+ Eiffel tests that can be executed by testing tool.
+ ]"
+ author: "EiffelStudio test wizard"
+ date: "$Date$"
+ revision: "$Revision$"
+ testing: "type/manual"
+
+class
+ TEST_BANK_ACCOUNT
+
+inherit
+ EQA_TEST_SET
+
+feature -- Test routines
+
+ test_deposit_01
+ -- New test routine
+ note
+ testing: "covers/{BANK_ACCOUNT}.deposit"
+ do
+ assert ("not_implemented", False)
+ end
+
+end
+
+
+We can see that the feature test_deposit_01 exists, but doesn't really test anything. So, let's change that. We'll alter test_deposit_01 so that it creates an instance of BANK_ACCOUNT and then makes a deposit to that account.
+
+So, test_deposit_01 now looks like this:
+
+
+ test_deposit_01
+ -- New test routine
+ note
+ testing: "covers/{BANK_ACCOUNT}.deposit"
+ local
+ l_ba: BANK_ACCOUNT
+ do
+ create l_ba
+ l_ba.deposit (500)
+ end
+
+
+Now we have created and written a manual test using AutoTest.
+
+Next let's look into the notion of '''Tags''' in a little more detail, then see what it takes to execute a test.
+
+
+==About Tags==
+
+The '''Tags''' pane allows us to associate our test with any AutoTest '''tags''' that we feel are appropriate.
+
+'''Tags''' are simply names or otherwise meaningful strings of characters that are arranged hierarchically and can be associated with a test to help manage, maintain, execute, and monitor its results. Any one test can support many tags. It is quite likely that during the development process, your system may eventually accumulate a great number of tests. And you may want only to execute some selected portion of those tests at any particular time. '''Tags''' allow you do that with the help of AutoTest.
+
+One of the most common types of tags specifies what class and feature a test covers. In our example, we wrote our test against the deposit procedure of the class BANK_ACCOUNT. The tag that we added to express this is:
+
+covers/{BANK_ACCOUNT}.deposit
+
+When we look at a tag in this notation, each hierarchical level is delimited by the forward slash. So the tag above specifies a root "covers" and its child "{BANK_ACCOUNT}.deposit". If this same test tested both deposit and withdraw, then its list of tags would be:
+
+covers/{BANK_ACCOUNT}.deposit
+covers/{BANK_ACCOUNT}.withdraw
+
+So when ever you ask to view or run all the tests that covers either deposit or withdraw, this test would show up in that set.
+
+The "covers" tags, as you saw earlier, can be generated by AutoTest's New Eiffel Test Wizard when you create a new test. But you could enter the tag manually, as well. For example if you had written a high-level test that exercised all or most of the functionality of the class BANK_ACCOUNT, you could manually add a tag that expresses that, i.e., a "covers" tag for BANK_ACCOUNT that does not specify a particular routine:
+
+covers/{BANK_ACCOUNT}
+
+
+Tags can be completely arbitrary, too. So, for example if you were building software that you expected to run on multiple platforms, in the test suite, you might have a test with the following tags:
+
+platform/os/linux
+platform/architecture/i386
+
+So this test would be specifically for Linux running on Intel architecture. When you were testing on that platform combination, you could select the appropriate tests to run using tags.
+
+
+===Associating tags with a new test===
+
+Looking again at the '''Tags''' pane, you will see that there are two boxes under the label '''Tags used in new test'''. The first is just a display of the list of tags that you have added to the new test. The next box down allows you to add an arbitrary tag sequence like:
+
+platform/os/linux
+
+Below that box, there are links that allow you to add certain commonly used or predefined tag types. One of these, '''Add tag for covered class/feature''' is the link we used to add the "covers" tag for our test on {BANK_ACCOUNT}.deposit.
+
+
+===Other predefined tags===
+
+In addition to '''Add tag for covered class/feature''', choices for other predefined tags are shown as links. For example, '''Add tag to run test in private evaluator''' and '''Add tag to run test serially'''.
+
+Selecting '''Run test in private evaluator''' will insert the tag:
+
+execution/isolated
+
+
+When tests are executed, they do so within the context of '''evaluator processes'''. Normally, evaluator processes are reused for multiple test executions. But if you select '''Run in private evaluator''', the tag added to your test guarantees that this test will be run in a fresh evaluator process, that terminates when the test completes. This can be helpful, for example, when you don't want your test to enter or leave the evaluator process with the effects of "once" routines or any other action that might affect the efficacy of other tests. For example, if your test executes external routines which might have a damaging effect on memory, you should run the test in a private evaluator.
+
+If you select '''Run test serially''', the following tag will be inserted:
+
+execution/serial
+
+
+Tests tagged with this tag will not run concurrently with any other similarly tagged test is running.
+
+You can extend the serial execution tag with arbitrary terms that will differentiate groups of tagged tests. For example, if some of your tests are tagged like this:
+
+execution/serial/group_1
+
+and some are tagged:
+
+execution/serial/group_2
+
+then AutoTest will not run any group_1 tagged test concurrently with any other group_1 test, and likewise for tests tagged group_2.
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/using-autotest/execute-tests.wiki b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/execute-tests.wiki
new file mode 100644
index 00000000..4f08f0b0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/execute-tests.wiki
@@ -0,0 +1,110 @@
+[[Property:title|Execute tests]]
+[[Property:weight|3]]
+[[Property:uuid|d0515cb1-0792-3028-2a24-a71b56506959]]
+In the previous section we coded a manually created test. AutoTest will allow us to execute that test, or, in more practical terms, any set of tests that we select. But before we execute our test, let's take a look at what we will get out of such an execution.
+
+==About test results==
+
+It is important to understand that for AutoTest, test results are solely determined by whether an exception occurs during the execution of a test, and, in cases in which an exception does occur, what kind of exception it is. So, with AutoTest, it is not necessary for you to write anything special into a test that propagates the test's results.
+
+When AutoTest executes a test, the result will be one of only three possibilities:
+# The test is '''successful'''
+# The test is '''failing'''
+# The test result is '''unresolved'''
+
+These possibilities are defined as follows.
+
+{{definition|Successful test|A test which has executed without causing and exception to occur. }}
+
+
+{{definition|Failing test|A test which has caused an exception to occur during its execution, specifically during the execution of a target routine. }}
+
+
+{{definition|Unresolved test result|A test which has caused an exception to occur during its execution, but exclusive of the execution of a target routine. }}
+
+
+So, successful tests are easy enough to understand. The test executed with no exception.
+
+Failing tests and unresolved test results both mean that an exception occurred during the execution of the test. The distinction is made based on the location of the feature that causes the exception.
+
+When we execute our test {TEST_BANK_ACCOUNT}.test_deposit_01, we know that test_deposit_01 will make a call to {BANK_ACCOUNT}.deposit. If the exception occurs during the execution of a target routine (i.e., in {BANK_ACCOUNT}.deposit), then the test is considered failing. If the exception occurs anywhere else in the execution of {TEST_BANK_ACCOUNT}.test_deposit_01, then the test is considered to have an unresolved result.
+
+
+{{note|Be aware that some early versions of AutoTest reported some unresolved test results as failing tests. }}
+
+This behavior can be helpful to us as testers. A failing test indicates that there is something amiss in the target routine. The routine has not completed in a state that satisfies its postcondition and class invariant, or is dealing with an unresolved exception from some routine that it has called. An unresolved test result indicates that something is amiss in our test. Something went wrong in the setup or cleanup of the test or perhaps the test called a target routine from a state that did not satisfy the target routine's precondition.
+
+
+==The AutoTest tool==
+
+In the last section, we created a manual test. The AutoTest tool shows us the new test in the '''Tests''' column. So, now the tool should look something like this:
+
+
+[[Image:AutoTest tool with test]]
+
+
+==Test execution==
+
+You see under "Tests" the project cluster accounts, the test cluster tests, the test class TEST_BANK_ACCOUNT, and the test test_deposit_01. You might have to expand some of the elements to see everything as shown above.
+
+You see that the '''Status''' of test_deposit is "not tested", and that the '''Last executed''' date is empty.
+
+To execute tests we use the "Run" button ( [[Image:debug-run-icon]] ) on the interface toolbar. By default, the Run button will run all tests matching the tags in the '''Filter''' box. However, there is a list of run options that you can access by clicking the black triangle just to the right of Run. You can choose to run all tests, only those with failing status, a filtered set of tests, or only those tests that you have selected in the tree below. We'll cover filtering a little later. For now, life is simple, we have only one test so just selecting '''Run all''' should execute it.
+
+==Examining test results==
+
+The test runs in background and the AutoTest interface now looks like this:
+
+
+[[Image:AutoTest tool with failed test]]
+
+
+It's pretty clear that our test has failed. Its status is now marked with the Failing icon ( [[Image:general-error-icon]] ) and in the box below the '''Execution''' tab we see that the status also includes a tag: balance_increased. More detail is provided in the Testing pane of the Outputs tool, as shown below.
+
+
+[[Image:AutoTest Outputs tool after run 01]]
+
+
+We see that balance_increased is a postcondition tag on the target routine {BANK_ACCOUNT}.deposit. Upon examination of the code:
+
+
+ deposit (an_amount: INTEGER)
+ -- Deposit `an_amount'.
+ require
+ amount_large_enough: an_amount > 0
+ do
+ ensure
+ balance_increased: balance > old balance
+ deposited: balance = old balance + an_amount
+ end
+
+
+we realize that there is no implementation here. So we add the code to implement deposit:
+
+
+ ...
+ do
+ balance := balance + an_amount
+ ensure
+ ...
+
+
+After compiling, we can execute the test again. We could do this by selecting '''Run all''' as we did last time, or by selecting '''Run failing'''. Once the test executes we see now that it was successful:
+
+
+[[Image:AutoTest tool with passed test]]
+
+
+This time we see that the test is successful, as indicated by the Success icon ( [[Image:general-tick-icon]] ) in the Status column.
+
+==The beginnings of a test suite==
+
+Of course we would not have had to use AutoTest to find that bug in {BANK_ACCOUNT}.deposit. We could have just written a simple class to exercise instances of BANK_ACCOUNT and truth would have come out.
+
+The advantage of using AutoTest is that the test that we wrote to cover {BANK_ACCOUNT}.deposit can stay with us throughout the lifecycle of class BANK_ACCOUNT. We can expand the TEST_BANK_ACCOUNT with additional manual tests and run them after every development increment to ensure that all tests that were once successful are still successful.
+
+==Manual test summary==
+
+We have seen how to create and execute a manual test. You will find that manual tests form the backbone of your test suite. But there are two other types of tests available in AutoTest. Next let's take a look at these test types and in what ways they can be used.
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/using-autotest/index.wiki b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/index.wiki
new file mode 100644
index 00000000..e248bd75
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/index.wiki
@@ -0,0 +1,30 @@
+[[Property:title|Using AutoTest]]
+[[Property:weight|-1]]
+[[Property:uuid|6b900a65-85c6-9cd6-ef57-ccd4b8decbef]]
+{{note|The following few pages contain the AutoTest tutorial. This tutorial uses a different software example than the bulk of the EiffelStudio Guided Tour. If this is your first time through, you may want to delay the AutoTest tutorial until you have completed the rest of the Guided Tour, then come back to it when you're feeling more familiar with EiffelStudio.}}
+
+
+{{note| '''To users of V6.6 and later:''' As of V6.6, the New Eiffel test wizard panes have changed somewhat from this documentation. V6.6 introduces the ability to store certain preferred values for creating tests. The advantage is that one need not enter this information on wizard panes each time a test is created. Because preferred values can be stored, the panes containing the values more likely to change between test creations are presented earlier than other panes. In previous versions, these panes were presented later, as shown in this documentation. The documentation will be updated in the future to reflect the newer wizard sequences and pane layouts. }}
+
+
+==Introduction==
+
+AutoTest is a tool that helps you to create, manage, and run tests against your software. AutoTest is accessible directly as a part of EiffelStudio, but works to a large extent behind the scenes so that it doesn't get in the way of your development activities. In other words, even though you may be accumulating a substantial collection of test software along with your project software, you can still run and deliver your project software without going to a lot of trouble to separate the two. Tests managed by AutoTest stay handy and can be run any time to help make sure everything always stands up to the scrutiny of testing.
+
+This tutorial will guide you through the use of AutoTest. A [[AutoTest|reference section]] for AutoTest is also available.
+
+
+{{Recommended|At least on your first viewing of this tutorial, take the sections in the order in which they are presented. There are three different types of tests supported by AutoTest. Each type of test is discussed on its own page. But to avoid repetition, the pages for the second and third types of tests omit some of the detail in the first and assume a familiarity with the example. }}
+
+
+{{Caution|note clause. When you use the View box to display a set of tests, you specify that set by the tags on the tests. Some of the tags are implicit, in the sense that AutoTest accounts for them, and they are not explicitly coded in note clauses. This should become clear when we look at some examples.
+
+When the filter text is cleared, the AutoTest interface will display tests accessible through all tag roots.
+
+As of version 6.5 of EiffelStudio, the tag root words used are:
+
+
+{| border="2"
+|-
+| class || Tests organized by test classes
+|-
+| covers || Tests organized by target classes/routines
+|-
+| result || Tests organized by the results of their most recent execution
+|-
+| user || Tests organized by type (manual, extracted, generated) and by user-added tag hierachies
+|}
+
+
+{{note|The tag roots will appear only if there are tests that can be categorized under them. For example, if you have not run any tests, then '''result''' will not appear. }}
+
+
+Notice that the Filter box has a drop-down with a list of options:
+
+
+[[Image:AutoTest filter drop down]]
+
+
+These options are shortcuts to the various tag roots listed above:
+
+#'''Test classes''' displays the sub-tree under the tag root '''class'''
+#'''Classes under test''' displays the sub-tree under the tag root '''covers'''
+#'''Results''' displays the sub-tree under the tag root '''result'''
+#'''User-defined tags''' displays the sub-tree under the tag root '''user'''
+
+
+Any tagging system that you devise will show up under the '''user''' tag root.
+
+For example, consider a manual test containing a '''testing:''' note name with a user-defined tag as in the following code.
+
+
+ test_deposit_01
+ -- New test routine
+ note
+ testing: "covers/{BANK_ACCOUNT}.deposit"
+ testing: "my_tag_root" -- My new tag root
+ local
+ l_ba: BANK_ACCOUNT
+ do
+ create l_ba
+ l_ba.deposit (500)
+ end
+
+
+This will cause the new user-defined tag and its associated tests to be visible in the AutoTest interface.
+
+[[Image:AutoTest user defined tag root]]
+
+
+{{seealso|The [[The AutoTest Interface#Filtering|Filtering]] section in [[The AutoTest interface]].}}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/using-autotest/testing-background-and-basics.wiki b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/testing-background-and-basics.wiki
new file mode 100644
index 00000000..20fe5719
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/testing-background-and-basics.wiki
@@ -0,0 +1,149 @@
+[[Property:modification_date|Tue, 30 Oct 2018 14:59:36 GMT]]
+[[Property:publication_date|Tue, 30 Oct 2018 14:59:36 GMT]]
+[[Property:title|Testing: Background and basics]]
+[[Property:weight|0]]
+[[Property:uuid|12c2a2d4-9bf2-ba73-6647-cb9900666de1]]
+==Background and motivation for testing tools==
+
+Developers test software in the hope that the testing process will expose faults in the software they've developed. Most developers also realize that no amount of testing will ever prove software to be bug free. So while testing is a virtuous activity that we dare not neglect, we are wise to temper our expectation of the practical value of testing.
+
+A test is designed to exercise a software element given certain inputs and execution state. The state is observed after the test execution to see if the software element has behaved in a manner that is consistent with its specification.
+
+As a body of software is developed and tested, a large number of tests may accumulate. This large suite of tests can be run at any time in order to ensure that a change or the addition of a new software element does not cause a previously successful test now to fail. Some software development processes call for running a whole suite of tests after every increment of development activity. This type of testing is often referred to as ''regression testing'', because it tends to expose software which had been satisfying its tests at one time, but because of some development activity has regressed to a failing state.
+
+Creating, managing and running a large number of tests manually can be time-consuming, messy, and error-prone, thus the motivation for automated testing tools. Testing tools help programmers to create, maintain, and execute a suite of tests by automating the activity. During the last few years, both testing methods and tools have become more sophisticated.
+
+
+==The Eiffel advantage in testing==
+
+Some of today's development methods require tests to be written before the software elements they test. Then the tests are included as a part of the software specification. But tests can only reflect a very small subset of the possible execution cases. Testing can never replace a comprehensive software specification.
+
+The great advantage you have with Eiffel, of course, is that the specification for a software element exists in its contract. Like the tests mentioned above, contracts for software are written prior to implementation. So, importantly, tests are ''not'' a part of a software specification in Eiffel.
+
+With contract checking enabled at run time, the running software's behavior is constantly monitored against the contract's expectations. In other words, for routines, the precondition defines an acceptable state in which the routine can execute, and the postcondition defines an acceptable state after successful execution. The class invariant defines the constraints necessary for instances of a class to be valid.
+
+A term commonly used in software testing is "oracle". Tests are generally looked at as having two parts, the first part is a mechanism that exercises (runs or calls) a particular software element in a given context. The second part is the "oracle" whose responsibility it is to determine whether the software element passes or fails the test. Not surprisingly, test oracles in other testing frameworks often look a lot like assertions in Eiffel. So the advantage for Eiffel is that the test oracles for all routines are already written as the postconditions on routines and class invariants.
+
+The presence of preconditions provides another advantage. Preconditions make it possible to automate testing in ways unavailable in other environments. Because of preconditions, we already have information about the limits of valid inputs to routines. So it's possible to generate a call to a routine we want to test automatically and with a context that meets the routine's precondition.
+
+
+==AutoTest==
+
+AutoTest attempts to capitalize on the testing advantages inherent in Eiffel due to Design by Contract. AutoTest consists of an interactive interface, and a library of classes which support testing activity.
+
+The testing support classes are distributed with EiffelStudio and exist in the ''testing'' subfolder of the ''libraries'' folder. With the exception of one class which we will discuss soon, the classes in "testing" are not intended to be used directly by developers. They exist to support the functionality of AutoTest.
+
+The interface for AutoTest is accessible through the EiffelStudio development environment. You may find it already resident as a tab in the right hand pane next to Clusters, Features, and Favorites. If it's not there, then you can bring it up by following the menu path:
+
+
+View --> Tools --> AutoTest
+
+
+==Test classes and tests==
+
+The AutoTest interface helps you to create and execute tests on the software you develop. The interface contains a wizard called the '''New Eiffel Test Wizard''' which helps you create or generate the types of tests you need. We'll learn more about the interface and the wizard as we go along. But first, let's look at what constitutes a ''test''. For AutoTest, we define the term ''test'' in the context of some other testing terminology:
+
+
+{{definition|Test class|An effective class that inherits from the class EQA_TEST_SET. }}
+
+
+{{definition|Test|Any procedure of a test class that satisfies all of the following conditions: ANY
+note
+ description: "[
+ Eiffel tests that can be executed by testing tool.
+
+ ]"
+ author: "EiffelStudio test wizard"
+ date: "$Date$"
+ revision: "$Revision$"
+ testing: "type/manual"
+
+class
+ MY_TEST_CLASS
+
+inherit
+ EQA_TEST_SET
+
+feature -- Test routines
+
+ my_test
+ -- New test routine
+ do
+ assert ("not_implemented", False)
+ end
+
+end
+
+
+This test class was created by AutoTest's New Eiffel Test Wizard. It is about as simple a test class as there can be. Its only value is to illustrate the basic form of AutoTest tests. So, let's look at that form.
+
+It is clear that MY_TEST_CLASS is an effective class that inherits from EQA_TEST_SET, so that makes it fit the definition of a test class. And, it's also clear the my_test is a feature of MY_TEST_CLASS, specifically a procedure, exported to ANY, requiring no arguments. That qualifies my_test as a test. If MY_TEST_CLASS is located in a test cluster of your project, then AutoTest will find it and be able to run it whenever you request.
+
+This test would always fail because of the assert that the wizard put in the implementation. So if you asked AutoTest to run your tests, it would tell you that my_test was a failed test, for the reason: "not_implemented". The assert is not a necessary part of a test. The wizard puts it there to remind you that the test has not been implemented. If you removed the assert line from the test, then the test would always succeed, which would be nice, but it would be succeeding at testing nothing! We'll see more later about what it means for tests to succeed and fail.
+
+But first let's get some exposure to the AutoTest interface, by building a manual test for a routine in a simple class.
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/using-autotest/using-extracted-tests.wiki b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/using-extracted-tests.wiki
new file mode 100644
index 00000000..696be15c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/using-extracted-tests.wiki
@@ -0,0 +1,146 @@
+[[Property:title|Using extracted tests]]
+[[Property:weight|5]]
+[[Property:uuid|bebd4f28-9818-80f0-a69a-e9ce867723f4]]
+==About extracted tests==
+
+At any time that you are running a system in EiffelStudio debugger and your system is paused, you can ask AutoTest to extract a new test class and test from the current executable context. Most often you would use this capability in the case in which you experienced an unexpected failure or exception in one of your routines. It is possible, though, to extract at any point at which the system is paused.
+
+The value of extracted tests is that they provide a kind of a snapshot in testing form that will reproduce the unexpected failure. An extracted test attempts to reproduce the context in which the offending routine executed. So, extracted tests supplement your manual tests. They serve to cover situations which you just may not have written manual tests to cover.
+
+Extracted tests are intended to supplement the suite of manual tests that you have created to do the bulk of your testing. So, usually when you create an extracted test, it happens as a result of your being surprised. You will notice that each time you create an extracted test, you get a new test class, too. This is in contrast to manual tests, in which you might use the wizard to create a new test class and one new test to cover a particular target class and target routine. Then you might manually create, in that same test class, many additional tests covering the routine behavior of the same or other target routines in the same target class.
+
+
+==Creating an extracted test==
+
+Let's use the same test system we used for manual tests to demonstrate the creation of an extracted test. The example will be slightly contrived because it will find a problem that certainly we would already have discovered had we written a comprehensive set of manual tests against the BANK_ACCOUNT class. Still, the simplicity should help keep things clear.
+
+If you remember, the root class for the example application was not very interesting, just a root procedure with a single instruction and a declaration my_account of type BANK_ACCOUNT:
+
+
+
+ make
+ -- Run application.
+ do
+ create my_account
+ end
+
+ my_account: BANK_ACCOUNT
+
+
+
+Now, let's add some code into the make procedure that will make use of my_account:
+
+
+ make
+ -- Run application.
+ do
+ create my_account
+ my_account.deposit (500)
+ my_account.withdraw (100)
+ end
+
+
+
+If we run the application from EiffelStudio, we see that it stops when it incurs a postcondition violation in {BANK_ACCOUNT}.withdraw:
+
+
+[[Image:AutoTest extracted 01]]
+
+
+When we look at the feature pane, it's pretty easy to see where the problem is:
+
+
+[[Image:AutoTest extracted 02]]
+
+
+There is an error in the specification for withdraw. In the postcondition tagged withdrawn, the plus sign should have been a minus sign. Therefore, the assertion should read like this:
+
+
+ withdrawn: balance = old balance - an_amount
+
+
+Certainly we will fix this, but AutoTest gives us the opportunity to extract a test based on this particular failure. So, let's do that.
+
+So, we go to the AutoTest tool and click triangle next to ''Create new tests'' button and select the '''Extract tests from debugger''' from the drop-down menu. Because we are paused in the debugger, the drop-down menu appears with the '''Extract tests from debugger''' choice enabled this time:
+
+
+[[Image:AutoTest create new test 02]]
+
+
+When we select '''Extract tests from debugger''', we are presented with the New Eiffel Test Wizard's '''Test Extraction''' pane. This wizard pane shows a depiction of the current call stack and asks us for which feature(s) on the stack we want to create the test:
+
+
+[[Image:AutoTest test extraction pane|Test extraction pane]]
+
+
+The choice for withdraw is the selection we want. We can deselect the stack frame for make if it is pre-selected. If we click '''Next''' at this point we would be taken to the '''Tags''' pane, and from there to the '''General''' pane. But we really don't need to do this. AutoTest will sense that we are extracting a test for {BANK_ACCOUNT}.withdraw and tag the test properly. It will use the same test class name from the '''General''' pane, but add a numerical suffix. So, all we need to do now is to click '''Launch''' from the '''Text Extraction''' pane.
+
+AutoTest creates the new test and returns us to the debugger, where our system is still on hold. We can stop execution and compile to include the new test.
+
+Now we see the new test class and test in the AutoTest tool windows.
+
+
+==Run the tests, fix a problem, run the tests==
+
+We run our tests using '''Run all''', and we see that the test on withdraw is still failing:
+
+
+[[Image:AutoTest tool after run]]
+
+
+If we fix the error in the postcondition in withdraw, recompile, and then re-execute the test, we find that it is successful.
+
+
+==A closer look at an extracted test==
+
+Look at the code that was generated for the extracted test after the assertion violation occurred:
+
+
+note
+ description: "Regression tests reproducing application state of a previous execution."
+ author: "Testing tool"
+
+class
+ TEST_BANK_ACCOUNT_EXTRACTED_WITHDRAW_01
+
+inherit
+ EQA_EXTRACTED_TEST_SET
+
+feature -- Test routines
+
+ test_withdraw
+ note
+ testing: "type/extracted"
+ testing: "covers/{BANK_ACCOUNT}.withdraw"
+ do
+ run_extracted_test (agent {BANK_ACCOUNT}.withdraw, ["#1", {INTEGER_32} 100])
+ end
+
+feature {NONE} -- Access
+
+ context: !ARRAY [!TUPLE [type: !TYPE [ANY]; attributes: !TUPLE; inv: BOOLEAN]]
+ --
+ do
+ Result := <<
+ [{BANK_ACCOUNT}, [
+ "balance", {INTEGER_32} 400
+ ], False]
+ >>
+ end
+
+end
+
+
+
+You probably noticed immediately that it doesn't look much like the code that we wrote for our manual test in the previous section.
+
+One reason for the difference is that the class does not inherit directly from EQA_TEST_SET as our manual test did. Instead, it inherits from EQA_EXTRACTED_TEST_SET which itself is a descendant of EQA_TEST_SET. EQA_EXTRACTED_TEST_SET provides additional functionality for extracted tests.
+
+Notice that the call to the target routine {BANK_ACCOUNT}.withdraw is effected in the routine test_withdraw which passes an agent representing {BANK_ACCOUNT}.withdraw to the procedure run_extracted_test. The second argument to run_extracted_test is a TUPLE with the argument values which were used in the call to withdraw which caused the original assertion violation.
+
+Another thing worth noting is the function context. This is how AutoTest recreates the state of the instance of BANK_ACCOUNT at the time of the assertion violation.
+
+{{caution|The extracted test recreates the state at the point at which execution has halted. So, in the case of a postcondition or invariant violation, the values of the attributes will reflect any changes that have been made during the execution of the routine. (In the example, the value of balance is set to 400, rather than 500 as it would have been when routine withdraw began execution.) This could make a difference in whether the test extracted after an exception is a valid recreation of the original failure. One way of dealing with this, at least in simple cases like this, is to change the test class code to reflect the proper value. A safer way would be rather than extracting the test after the exception, restart the system and stop execution as it enters the failing routine, then extract the test at that point. }}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/using-autotest/using-generated-tests.wiki b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/using-generated-tests.wiki
new file mode 100644
index 00000000..79d09660
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/using-autotest/using-generated-tests.wiki
@@ -0,0 +1,142 @@
+[[Property:title|Using generated tests]]
+[[Property:weight|7]]
+[[Property:uuid|c17ebddf-5d35-76c1-4912-d9f1ca3770a5]]
+==About generated tests==
+
+Generated tests fill a different role from either extracted or manual tests. The idea behind generated tests is that because we specify software through its contracts, and because compliance of the software to those contracts can be actively monitored at runtime, we can know two things necessary for building tests:
+#For any routine, what argument values are valid
+#For the execution of any routine, what resulting states are acceptable
+
+The first bit of knowledge comes from the ''preconditions'' of target routines. The second comes from ''postconditions'' of target routines and the ''invariants'' of target classes. Armed with this knowledge, we should be able to generate a series of invocations of target routines using random argument values, and evaluate the results. This is what is done by an internal facility of AutoTest that builds generated tests (this facility is often also referred to itself as AutoTest). After many of these randomly generated invocations, AutoTest attempts to synthesize the results of these feature calls into new test classes. The tests in these new test classes contain the calls leading up and including calls that fail. AutoTest will attempt to create only one test from each unique type of failure, so that your test directory doesn't get loaded with lots of duplicate tests.
+
+You may look at a generated test class and think that it seems to be very long and to contain lots of stuff that you doubt is relevant. This is a fair assessment. The processes that AutoTest uses to build and minimize generated tests are constantly being improved. But for now, generated tests, although useful, retain a certain amount of that randomness that was used in their creation.
+
+So for the time being, unlike manual and extracted tests, you should not make generated tests a part of your permanent test suite. Rather, you should consider them a disposable means to an end. Use each generated test as a guide for building an effective and readable manual test.
+
+
+==Creating generated tests==
+
+
+If you've been through the discussion of the creation of [[Create a manual test|manual]] and [[Using extracted tests|extracted]] tests, then it should come as no surprise to learn that you use the '''New Eiffel test wizard''' to create generated tests. And much of this process will seem familiar now.
+
+In the drop-down menu for the '''Create new test''' button, choose the item '''Generate tests for custom types'''.
+
+
+[[Image:AutoTest create new test]]
+
+
+At this point, you'll see the '''Test Generation''' wizard pane. This pane allows you to specify which classes you want to generate tests for. You can also adjust the values of certain parameters used in the test generation.
+
+Let's type the class name BANK_ACCOUNT into the box labeled '''Class or type name''' and click the "'''+'''" button to added it to the list. Of course you can remove an item from the list by selecting it and clicking "'''-'''".
+
+
+[[Image:AutoTest Test Generation pane]]
+
+
+The rest of the pane is used to configure certain options for the test generation process.
+
+'''Cutoff (minutes)''' lets you specify a number of minutes for AutoTest to run random invocations of the routines in your target class(es).
+
+'''Cutoff (invocations)''' lets you control how long AutoTest will run random invocations by declaring a specific number of invocations.
+
+'''Routine timeout''' sets an upper limit on how long AutoTest will wait for a random feature call to complete.
+
+'''Random number generation seed''' provides a way for you to control the seeding of the random number generator used by AutoTest. When the value is '''0''', as shown here, the seed is created from the system clock. This is adequate in most cases, but this option is provided because there might be some cases in which you would want to try to reproduce a previous test generation run. And to do that, you would have to set the seed to the same value for multiple runs.
+
+The two check boxes '''Slice minimization''' and '''DDmin for minimization''' allow you to select the approach that you want to use for minimizing the size of generated tests. Generally, the default value here is adequate. '''Slicing''' and '''ddmin''' are two different ways of doing minimization. Tests are generated after running many randomly generated calls to routines in your target class. Tests are generated for calls that fail. So, there may have been many randomized calls leading up to the failed call. Minimization helps to eliminate the majority of the unrelated randomly generated calls, leaving the test code as short as possible. You will notice that minimization processing is memory and processor intensive.
+
+The last check box, '''HTML statistics''' gives you the option of having AutoTest record the results of a test generation run in a set of files that you can review with a web browser.
+
+We can allow all these to remain their default values, with one exception. Let's check the '''HTML statistics''' box.
+
+
+
+During the test generation you can watch the random invocations of your class's routines being logged in the Testing pane of the Outputs tool. When the generation completes, AutoTest directs you to the location of the results:
+
+
+[[Image:AutoTest testing pane after generation]]
+
+
+The file statistics.txt contains a summary of the generation run. If you enabled '''Create HTML output''' you can open the file index.html with your browser and view formatted summary and detail information.
+
+
+{{note|The '''result''' directory includes files that summarize the whole generated testing process. Some of these are lengthy because they contain information on test cases used for each target routine. }}
+
+
+If we try to generate tests on the class BANK_ACCOUNT in which we have already fixed two bugs after the manual and extracted tests, we will see something about like the following results:
+
+
+[[Image:AutoTest generated results pass]]
+
+
+The important thing to notice here is the status: '''pass'''. There were no randomly generated cases that failed. So every valid invocation of a routine for class BANK_ACCOUNT completed satisfactorily. Therefore, no generated test class was created.
+
+If we re-introduce the bug into the deposit procedure of class BANK_ACCOUNT (i.e., Remove this line of code: balance := balance + an_amount), and then request generated tests again, we get different results:
+
+
+[[Image:AutoTest generated results fail]]
+
+
+This time, as we expected, failures were encountered. And a generated test class was created.
+
+
+==A look at a generated test==
+
+
+The generated test class looks like this:
+
+
+
+note
+ description: "Generated test created by AutoTest."
+ author: "Testing tool"
+
+class
+ TEST_BANK_ACCOUNT_GENERATED_001
+
+inherit
+ EQA_SYNTHESIZED_TEST_SET
+
+feature -- Test routines
+
+ generated_test_1
+ note
+ testing: "type/generated"
+ testing: "covers/{BANK_ACCOUNT}.deposit"
+ local
+ v_6: BANK_ACCOUNT
+ v_7: INTEGER_32
+ do
+ execute_safe (agent: BANK_ACCOUNT
+ do
+ create {BANK_ACCOUNT} Result
+ end)
+ if {l_ot1: BANK_ACCOUNT} last_object then
+ v_6 := l_ot1
+ end
+ v_7 := {INTEGER_32} 3
+
+ -- Final routine call
+ set_is_recovery_enabled (False)
+ execute_safe (agent v_6.deposit (v_7))
+ end
+
+end
+
+
+
+{{note|If you've been following along by the doing these examples in EiffelStudio, you may notice that your generated class looks slightly different. }}
+
+
+This test is written in a way that is a little different from both the manual test we wrote and the extracted test. But it's not too hard to figure out what's going on. An object of type BANK_ACCOUNT will be created (local v_6) and the deposit feature will be applied to it with an argument value of 3 (local v_7).
+
+You can see that this test, although it is implemented differently, is about the same as the manual test we wrote covering {BANK_ACCOUNT}.deposit. Because we have re-introduced the bug in BANK_ACCOUNT, if we run all tests, we see that both our manual test and the generated test are failing ... only the extracted test covering {BANK_ACCOUNT}.withdraw is successful:
+
+
+[[Image:AutoTest interface after run 05]]
+
+
+If we replace the implementation for {BANK_ACCOUNT}.deposit that we had removed, and then re-execute the tests, all are successful.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/Tutorials/viewing-classes.wiki b/documentation/18.11/eiffelstudio/Tutorials/viewing-classes.wiki
new file mode 100644
index 00000000..746479cf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/Tutorials/viewing-classes.wiki
@@ -0,0 +1,120 @@
+[[Property:title|Viewing Classes]]
+[[Property:weight|-9]]
+[[Property:uuid|78136af1-5d7a-f3d2-9619-17f4c0541f1e]]
+__FORCETOC__
+We haven't really looked at the text of a class yet. It's important anyway to see how EiffelStudio provides you with numerous, complementary '''views''' of your software. The Class tool and Feature tool are where the bulk of these views will be displayed, although the Editor tool does support some special views. For now we will concentrate on the views available in the Class tool.
+
+
+==Making some room==
+
+We'll need just one development window for the moment, the one that was targeted to LIST. You should still have that window available from the previous Tour topic, and it should look about like this:
+
+[[Image:es gt development window targeted to list 01]]
+
+{{note| If you don't see a development window targeted to LIST, just retarget one, as you know how to do this now, for example by typing the name followed by Enter in the Class Field at the top left. }}
+
+First let's give ourselves more space. Right now we don't need the Groups tool or any of the other tools sharing that pane. We could get rid of them by clicking the close buttons on the top right corner of the panes. Then we could get them back later by following the menu path:
+
+View --> Tools --> x
+
+where "x" is the name of a tool we want restored. But there is an easier way. Let's just hide them away until later.
+
+We do this by setting the pane containing the tools to '''Auto Hide'''. On the bar at the top of the pane, you'll see the Auto Hide icon ([[Image:auto-hide-icon]]) which looks like a pushpin.
+
+[[Image:es gt auto hide 01]]
+
+Click the icon and you'll see the pane shrink into a set of tabs on the right window margin and the remaining panes will expand to fill the abandoned space. The tools in the pane will temporarily expand back out if you move your mouse cursor over their tabs. Try it with one. When you want the pane back in its original place permanently, you just expand one of the tabs by mousing over it, then click the Disable Auto Hide icon, which is the pushpin again, just horizontal this time.
+
+Two panes remain, showing the Editor tool and the lower pane containing the Outputs tool and others. You can resize the panes by dragging the border between them. Make sure there's plenty of room in the lower pane.
+
+
+==The Class tool==
+
+Before we look at the Class tool, let's make sure that we set [[Change data share mode|linked data share mode]] which will always display information about the current target. Go to the main menu bar and expand the menu item View. If you see a choice marked with the link context icon ([[Image:context-link-icon]]) and labeled Link Context Tool, then select it. After it has been selected, or if it has already been selected, then the label will read: Unlink Context Tool.
+
+At the bottom of the lower pane you'll find a tab labeled '''Class'''. This gives you access to many forms of information about the current class -- the target of the development window. Click on the Class tab to bring up the Class tool. A set of buttons at the top enables you to display a number of '''views''' of the class. The currently highlighted button indicates the default view: Ancestors. You can see the others' names by moving your cursor over the various view icons, and reading the tooltips.
+
+The view currently displayed, Ancestors, shows the inheritance structure that leads to the current target, LIST :
+
+[[Image:es gt class tool 01]]
+
+This shows that LIST is an heir of CHAIN which itself, as an example of multiple inheritance, is an heir of CURSOR_STRUCTURE, INDEXABLE, and -- twice, as an example of repeated inheritance -- SEQUENCE. If, because of direct or indirect repeated inheritance, a class appears more than once, the display doesn't repeat its ancestry the second and subsequent times; the omitted repetition appears as just three dots, '''...''', as illustrated here for the second occurrences of BAG, ACTIVE and others.
+
+As you may have guessed, all the class names that appear on this display, by default in blue, can function as hyperlinks: you can use any one of them to retarget the Development Window to the corresponding class. This will be another major retargeting mechanism. But let's not pursue it for the moment and instead continue looking at the documentation views.
+
+Next to Ancestors button is Descendants, which will give you the descendants of a class in a similar format:
+
+[[Image:es gt class tool descendants 01]]
+
+The progeny of LIST, as you can see, is just as impressive as its ancestry.
+
+Let's now look at the other formats, starting from the left. The first button, Clickable, gives the class text. It's essentially the same information as appears in the top Editing Tool (whose pane was reduced to its bare minimum in the last few pictures, showing only the first three lines or so), but with some differences:
+* The Text view in the Editor is editable. In fact it's EiffelStudio's primary tool for entering software texts. The Class tool's Clickable view is just a view; you can't change it.
+* The Text view retains the formatting of the class text the way it was typed in; the Clickable view is automatically formatted -- "pretty-printed" -- according to the standard Eiffel layout rules.
+* The Clickable view does not include comments inside routine implementations ( do and once clauses), although it does retain features' header comments.
+* As part of the pretty-printing, the Clickable view uses colors and fonts to distinguish keywords, identifiers, comments and other syntactical elements. You can change the fonts and colors, like many other elements of the interface, through Tools --> Preferences. (Now is not the time.)
+
+This view is called "Clickable" because, as we'll see later, every syntactical element on it is a hyperlink, which you can use for browsing.
+
+After Clickable comes the Flat view button. The layout of the result is similar. The flat form of a class is the reconstructed class text including not only what's declared in the class itself but also everything that it inherits from its ancestors, direct or indirect. This applies to the flat form's features, which include ancestor features, but also to contracts: the flat form's invariant includes all clauses from ancestors' invariants, and the preconditions are expanded to take require else and ensure then clauses into consideration. (The [[An Eiffel Tutorial (ET)|Eiffel Tutorial]] explains these notions in detail.)
+
+
+[[Image:es gt class tool flat 01]]
+
+
+As a result, the Flat view shows the class text as it might have come out had inheritance (what a horrible thought even to contemplate!) ''not'' been available to write it.
+
+The first two features appearing in the above display, cursor and first, are indeed inherited from ancestors, rather than declared in LIST itself. Note how EiffelStudio, when producing the flat form, adds a line of the form
+
+ -- (from CLASS_OF_ORIGIN)
+
+
+to the header comments of inherited routines, to document where they come from.
+
+The flat form is an important notion of object technology, making it possible to understand a class by itself, regardless of the possibly rich inheritance structure that led to it. Looking at the Flat view of LIST, you may note how few of its properties come from the class itself; most of the interesting work has been done in ancestors, and LIST just adds a few details.
+
+{{note|If at any time you want to search for a certain pattern in the views displayed, you can type CTRL-F. A Find bar will come up at the bottom of the pane you are using. If you need more searching power, click the Search icon ([[Image:search-icon]]) in the development window's tool bar to invoke EiffelStudio's [[Search tool]]. }}
+
+Next come two essential documentation views: Contract and Interface. Based on Eiffel's principles of Design by Contract, they document the interface properties of a class. Unlike the previous two, they do not show actual Eiffel texts, but information useful for client classes.
+
+The contract form (also known as the '''short form''' of a class) is the class text deprived of any internal detail to retain interface information only. It discards any feature that's not exported (available to all clients); for the retained features, it discards the implementation -- do or once clause -- but retains the header (feature name, arguments, results), the header comment, and the contracts (precondition, postcondition, invariant) minus any contract clause that refers to a non-exported feature and hence would be useless to clients.
+
+As you will know, particularly if you have read the book [[Object-Oriented Software Construction, 2nd Edition]], the contract form is the preferred way of documenting software elements, especially reusable components, as it provides clients with just the right level of abstraction: precise enough thanks to the type signature and the contracts; clear enough thanks to the header comments; and general enough since it omits implementation details that are irrelevant to client programmers (and might lead them to write client code that won't work any more if the implementation changes).
+
+In practice you will often want to use, instead of the Contract view, the next one, Interface, also known as "flat-short form" and "flat contract form", which applies the same rules to the flat form rather than to the original class. This means it shows information on all the features of the class, immediate (defined in the class itself) as well as inherited, whereas the short form, non-flat, only considers immediate features. The Interface view provides the complete interface information for the class. Try it now on class LIST.
+
+The next two buttons are for the Ancestors and Descendants views, which we have already seen, showing classes connected with the target through one of the two inter-class relations, inheritance. After them come Clients and Suppliers, to list the classes connected through the other relation, client. Clicking the Clients button shows the list of clients of LIST.
+
+Now click the next button to see the Suppliers of LIST.
+
+The only two classes that LIST needs for its own algorithms are basic types from the Kernel Library, BOOLEAN and INTEGER_32. In Eiffel, as you may remember, all types are defined by classes, even those describing such elementary values as integers and booleans.
+
+
+==Feature information in the Class View==
+
+Let's resist the natural urge to go see now what the classes INTEGER_32 and BOOLEAN look like, and instead continue our survey of views. The remaining views will all display information about the '''features''' of the class. The first of them, Attributes, lists the attributes. It's not very interesting for LIST, a deferred class with only one attribute -- you can check this for yourself by clicking the Attributes button -- so let's look at the next one. Click the Routines button now to display information about the routines of class LIST :
+
+[[Image:es gt class tool routines 01]]
+
+The sections of this display group routines according to the ancestors of LIST -- including LIST itself -- that first introduced them; for example append originally comes from CHAIN and back from BILINEAR. Much of the benefit of this display comes from its support for browsing: all the colored elements, representing classes and features, will be "clickable" hyperlinks.
+
+The Invariants button shows the complete class invariant for LIST. This includes all invariant clauses that have been inherited from all ancestors.
+
+Other Class tool buttons display information in the same format as Attributes and Routines. Each selects a specific subset of the target class's features. You can now try any of the others by clicking the corresponding button:
+* Deferred features: abstract features which don't have an implementation in the current class, only in eventual descendants. Try this for LIST ; you'll see that this deferred class indeed has a number of deferred features.
+* Once and constants: constant attributes, "once functions" which provide shared objects (close to the "singleton" pattern), and once procedures which provide a convenient initialization mechanism. LIST has 'Operating_environment' and 'Io' inherited from the parent class ANY.
+* External features, implemented as calls to routines, macros or other elements implemented in other languages. LIST hasn't any.
+* Exported features: those available to all clients. LIST has quite a few.
+
+
+==Restoring the look of the development window==
+
+Once you're done looking at the different views, let's undo the changes that we made to the configuration of the development window at the beginning of this section in '''[[#Making some room|Making some room]]'''.
+
+Reduce the relative size of the lower pane.
+
+Then go to one of the tabs on the right margin of the development window, Groups, will work. Hold your cursor over it for a moment and it should expand. Then click the Disable Auto Hide icon, the horizontal pushpin, to restore the rightmost pane.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-disable-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-disable-icon.png
new file mode 100644
index 00000000..0ed72a33
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-disable-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-disable-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-disable-icon.png.data
new file mode 100644
index 00000000..b1d8c6e3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-disable-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--breakpoints-disable-icon
+author=admin
+path=content/16x16-breakpoints-disable-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-enable-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-enable-icon.png
new file mode 100644
index 00000000..86478fed
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-enable-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-enable-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-enable-icon.png.data
new file mode 100644
index 00000000..2495ee49
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--breakpoints-enable-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--breakpoints-enable-icon
+author=admin
+path=content/16x16-breakpoints-enable-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-add-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--general-add-icon.png
new file mode 100644
index 00000000..efa54325
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--general-add-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-add-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--general-add-icon.png.data
new file mode 100644
index 00000000..be124ec5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--general-add-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--general-add-icon
+author=admin
+path=content/16x16-general-add-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-copy-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--general-copy-icon.png
new file mode 100644
index 00000000..88355a90
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--general-copy-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-copy-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--general-copy-icon.png.data
new file mode 100644
index 00000000..f165d2f9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--general-copy-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--general-copy-icon
+author=admin
+path=content/16x16-general-copy-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-delete-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--general-delete-icon.png
new file mode 100644
index 00000000..fb0c022d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--general-delete-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-delete-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--general-delete-icon.png.data
new file mode 100644
index 00000000..4dcba811
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--general-delete-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--general-delete-icon
+author=admin
+path=content/16x16-general-delete-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-edit-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--general-edit-icon.png
new file mode 100644
index 00000000..0d10ac66
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--general-edit-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-edit-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--general-edit-icon.png.data
new file mode 100644
index 00000000..72553165
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--general-edit-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--general-edit-icon
+author=admin
+path=content/16x16-general-edit-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-save-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--general-save-icon.png
new file mode 100644
index 00000000..3f6a757c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--general-save-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--general-save-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--general-save-icon.png.data
new file mode 100644
index 00000000..d0bfc509
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--general-save-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--general-save-icon
+author=admin
+path=content/16x16-general-save-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--new-class-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--new-class-icon.png
new file mode 100644
index 00000000..535b36a4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--new-class-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--new-class-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--new-class-icon.png.data
new file mode 100644
index 00000000..3bf483d2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--new-class-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--new-class-icon
+author=admin
+path=content/16x16-new-class-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--new-cluster-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--new-cluster-icon.png
new file mode 100644
index 00000000..1816187d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--new-cluster-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--new-cluster-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--new-cluster-icon.png.data
new file mode 100644
index 00000000..c07a204c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--new-cluster-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--new-cluster-icon
+author=admin
+path=content/16x16-new-cluster-icon
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--new-feature-icon.png b/documentation/18.11/eiffelstudio/_images/16x16--new-feature-icon.png
new file mode 100644
index 00000000..e381be28
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/16x16--new-feature-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/16x16--new-feature-icon.png.data b/documentation/18.11/eiffelstudio/_images/16x16--new-feature-icon.png.data
new file mode 100644
index 00000000..c5f3e3e9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/16x16--new-feature-icon.png.data
@@ -0,0 +1,3 @@
+title=16x16--new-feature-icon
+author=admin
+path=content/16x16-new-feature-icon
diff --git a/documentation/18.11/eiffelstudio/_images/56--unix-registration-error.png b/documentation/18.11/eiffelstudio/_images/56--unix-registration-error.png
new file mode 100644
index 00000000..633517d8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/56--unix-registration-error.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/56--unix-registration-error.png.data b/documentation/18.11/eiffelstudio/_images/56--unix-registration-error.png.data
new file mode 100644
index 00000000..0663fd3e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/56--unix-registration-error.png.data
@@ -0,0 +1,3 @@
+title=56--unix-registration-error
+author=admin
+path=content/56-unix-registration-error
diff --git a/documentation/18.11/eiffelstudio/_images/56--unix-registration.png b/documentation/18.11/eiffelstudio/_images/56--unix-registration.png
new file mode 100644
index 00000000..c9f58cac
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/56--unix-registration.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/56--unix-registration.png.data b/documentation/18.11/eiffelstudio/_images/56--unix-registration.png.data
new file mode 100644
index 00000000..4fb7ac5c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/56--unix-registration.png.data
@@ -0,0 +1,3 @@
+title=56--unix-registration
+author=admin
+path=content/56-unix-registration
diff --git a/documentation/18.11/eiffelstudio/_images/56--unix-setup.png b/documentation/18.11/eiffelstudio/_images/56--unix-setup.png
new file mode 100644
index 00000000..9e67cae6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/56--unix-setup.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/56--unix-setup.png.data b/documentation/18.11/eiffelstudio/_images/56--unix-setup.png.data
new file mode 100644
index 00000000..2c582966
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/56--unix-setup.png.data
@@ -0,0 +1,3 @@
+title=56--unix-setup
+author=admin
+path=content/56-unix-setup
diff --git a/documentation/18.11/eiffelstudio/_images/56--windows-registration-error.png b/documentation/18.11/eiffelstudio/_images/56--windows-registration-error.png
new file mode 100644
index 00000000..adb6c4f1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/56--windows-registration-error.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/56--windows-registration-error.png.data b/documentation/18.11/eiffelstudio/_images/56--windows-registration-error.png.data
new file mode 100644
index 00000000..0cff57b9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/56--windows-registration-error.png.data
@@ -0,0 +1,3 @@
+title=56--windows-registration-error
+author=admin
+path=content/56-windows-registration-error
diff --git a/documentation/18.11/eiffelstudio/_images/56--windows-registration.png b/documentation/18.11/eiffelstudio/_images/56--windows-registration.png
new file mode 100644
index 00000000..3721b801
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/56--windows-registration.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/56--windows-registration.png.data b/documentation/18.11/eiffelstudio/_images/56--windows-registration.png.data
new file mode 100644
index 00000000..34286628
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/56--windows-registration.png.data
@@ -0,0 +1,3 @@
+title=56--windows-registration
+author=admin
+path=content/56-windows-registration
diff --git a/documentation/18.11/eiffelstudio/_images/Advanced_Options_main.png b/documentation/18.11/eiffelstudio/_images/Advanced_Options_main.png
new file mode 100644
index 00000000..7bd4ae4f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Advanced_Options_main.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Advanced_Options_main.png.data b/documentation/18.11/eiffelstudio/_images/Advanced_Options_main.png.data
new file mode 100644
index 00000000..347fe5b6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Advanced_Options_main.png.data
@@ -0,0 +1,3 @@
+title=advanced-options
+author=halw
+path=content/advanced-options
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane.png b/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane.png
new file mode 100644
index 00000000..ccd9a268
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane.png.data
new file mode 100644
index 00000000..51360963
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane.png.data
@@ -0,0 +1,3 @@
+title=AutoTest General pane
+author=halw
+path=content/autotest-general-pane
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane_empty.png b/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane_empty.png
new file mode 100644
index 00000000..36287dd1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane_empty.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane_empty.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane_empty.png.data
new file mode 100644
index 00000000..15199354
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_General_pane_empty.png.data
@@ -0,0 +1,3 @@
+title=AutoTest General pane empty
+author=halw
+path=content/autotest-general-pane-empty
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_after_run_06_0.png b/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_after_run_06_0.png
new file mode 100644
index 00000000..8145df7c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_after_run_06_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_after_run_06_0.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_after_run_06_0.png.data
new file mode 100644
index 00000000..cc50e305
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_after_run_06_0.png.data
@@ -0,0 +1,3 @@
+title=AutoTest interface after run 05
+author=halw
+path=content/autotest-interface-after-run-05
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_annotated_01.png b/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_annotated_01.png
new file mode 100644
index 00000000..0b5c77bb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_annotated_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_annotated_01.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_annotated_01.png.data
new file mode 100644
index 00000000..07338a43
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_Interface_annotated_01.png.data
@@ -0,0 +1,3 @@
+title=AutoTest interface annotated 01
+author=halw
+path=content/autotest-interface-annotated-01
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Outputs_tool_after_run_01.png b/documentation/18.11/eiffelstudio/_images/AutoTest_Outputs_tool_after_run_01.png
new file mode 100644
index 00000000..0d1b9b73
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_Outputs_tool_after_run_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Outputs_tool_after_run_01.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_Outputs_tool_after_run_01.png.data
new file mode 100644
index 00000000..d688af0e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_Outputs_tool_after_run_01.png.data
@@ -0,0 +1,3 @@
+title=AutoTest Outputs tool after run 01
+author=halw
+path=content/autotest-outputs-tool-after-run-01
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane.png b/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane.png
new file mode 100644
index 00000000..5a06444b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane.png.data
new file mode 100644
index 00000000..a8a05040
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane.png.data
@@ -0,0 +1,3 @@
+title=AutoTest Tags pane
+author=halw
+path=content/autotest-tags-pane
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane_empty.png b/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane_empty.png
new file mode 100644
index 00000000..50b9f347
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane_empty.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane_empty.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane_empty.png.data
new file mode 100644
index 00000000..6bb7127a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_Tags_pane_empty.png.data
@@ -0,0 +1,3 @@
+title=AutoTest tags pane empty
+author=halw
+path=content/autotest-tags-pane-empty
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Extraction_pane.png b/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Extraction_pane.png
new file mode 100644
index 00000000..d3bb2a21
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Extraction_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Extraction_pane.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Extraction_pane.png.data
new file mode 100644
index 00000000..021ecad3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Extraction_pane.png.data
@@ -0,0 +1,3 @@
+title=AutoTest Test Extraction pane
+author=halw
+path=content/autotest-test-extraction-pane
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Generation_pane.png b/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Generation_pane.png
new file mode 100644
index 00000000..291edbc8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Generation_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Generation_pane.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Generation_pane.png.data
new file mode 100644
index 00000000..a3d2fa31
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_Test_Generation_pane.png.data
@@ -0,0 +1,3 @@
+title=AutoTest Test Generation pane
+author=halw
+path=content/autotest-test-generation-pane
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_add_cluster_dialog.png b/documentation/18.11/eiffelstudio/_images/AutoTest_add_cluster_dialog.png
new file mode 100644
index 00000000..7ae45718
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_add_cluster_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_add_cluster_dialog.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_add_cluster_dialog.png.data
new file mode 100644
index 00000000..12d37d44
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_add_cluster_dialog.png.data
@@ -0,0 +1,3 @@
+title=AutoTest Add Cluster dialog
+author=halw
+path=content/autotest-add-cluster-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_add_testing_libraries_dialog.png b/documentation/18.11/eiffelstudio/_images/AutoTest_add_testing_libraries_dialog.png
new file mode 100644
index 00000000..bbee73a9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_add_testing_libraries_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_add_testing_libraries_dialog.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_add_testing_libraries_dialog.png.data
new file mode 100644
index 00000000..a0d2b5da
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_add_testing_libraries_dialog.png.data
@@ -0,0 +1,3 @@
+title=AutoTest add testing libraries dialog
+author=halw
+path=content/autotest-add-testing-libraries-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_create_manual_test_pane.png b/documentation/18.11/eiffelstudio/_images/AutoTest_create_manual_test_pane.png
new file mode 100644
index 00000000..30da04c5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_create_manual_test_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_create_manual_test_pane.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_create_manual_test_pane.png.data
new file mode 100644
index 00000000..5dd82070
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_create_manual_test_pane.png.data
@@ -0,0 +1,3 @@
+title=AutoTest Manual Test pane
+author=halw
+path=content/autotest-manual-test-pane
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_test_02.png b/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_test_02.png
new file mode 100644
index 00000000..40cab741
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_test_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_test_02.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_test_02.png.data
new file mode 100644
index 00000000..682de328
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_test_02.png.data
@@ -0,0 +1,3 @@
+title=AutoTest create new test 02
+author=halw
+path=content/autotest-create-new-test-02
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_tests.png b/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_tests.png
new file mode 100644
index 00000000..603f45ad
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_tests.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_tests.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_tests.png.data
new file mode 100644
index 00000000..9ee5378f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_create_new_tests.png.data
@@ -0,0 +1,3 @@
+title=AutoTest create new test
+author=halw
+path=content/autotest-create-new-test
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_drop_down.png b/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_drop_down.png
new file mode 100644
index 00000000..7d90bc8e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_drop_down.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_drop_down.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_drop_down.png.data
new file mode 100644
index 00000000..2c61eb98
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_drop_down.png.data
@@ -0,0 +1,3 @@
+title=AutoTest debug all drop down
+author=halw
+path=content/autotest-debug-all-drop-down
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_icon.png b/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_icon.png
new file mode 100644
index 00000000..525c93e8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_icon.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_icon.png.data
new file mode 100644
index 00000000..093c758a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_debug_all_icon.png.data
@@ -0,0 +1,3 @@
+title=AutoTest debug all icon
+author=halw
+path=content/autotest-debug-all-icon
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_empty_tool_01.png b/documentation/18.11/eiffelstudio/_images/AutoTest_empty_tool_01.png
new file mode 100644
index 00000000..bb1493cd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_empty_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_empty_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_empty_tool_01.png.data
new file mode 100644
index 00000000..3898c7e6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_empty_tool_01.png.data
@@ -0,0 +1,3 @@
+title=AutoTest empty tool 01
+author=halw
+path=content/autotest-empty-tool-01
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_01.png b/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_01.png
new file mode 100644
index 00000000..c411fbfc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_01.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_01.png.data
new file mode 100644
index 00000000..04a37393
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_01.png.data
@@ -0,0 +1,3 @@
+title=AutoTest extracted 01
+author=halw
+path=content/autotest-extracted-01
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_02.png b/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_02.png
new file mode 100644
index 00000000..5181a3ef
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_02.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_02.png.data
new file mode 100644
index 00000000..f0adba46
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_extracted_02.png.data
@@ -0,0 +1,3 @@
+title=AutoTest extracted 02
+author=halw
+path=content/autotest-extracted-02
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_filter_drop_down.png b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_drop_down.png
new file mode 100644
index 00000000..368e8231
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_drop_down.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_filter_drop_down.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_drop_down.png.data
new file mode 100644
index 00000000..c97b199b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_drop_down.png.data
@@ -0,0 +1,3 @@
+title=AutoTest filter drop down
+author=halw
+path=content/autotest-filter-drop-down
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result.png b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result.png
new file mode 100644
index 00000000..eb32790c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result.png.data
new file mode 100644
index 00000000..4d0a02d9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result.png.data
@@ -0,0 +1,3 @@
+title=AutoTest filter result
+author=halw
+path=content/autotest-filter-result
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result_fail.png b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result_fail.png
new file mode 100644
index 00000000..178a441a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result_fail.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result_fail.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result_fail.png.data
new file mode 100644
index 00000000..dee4ed69
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_result_fail.png.data
@@ -0,0 +1,3 @@
+title=AutoTest filter result fail
+author=halw
+path=content/autotest-filter-result-fail
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_filter_withdraw.png b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_withdraw.png
new file mode 100644
index 00000000..ceb2fbd6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_withdraw.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_filter_withdraw.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_withdraw.png.data
new file mode 100644
index 00000000..99f86879
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_filter_withdraw.png.data
@@ -0,0 +1,3 @@
+title=AutoTest filter withdraw
+author=halw
+path=content/autotest-filter-withdraw
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_fail.png b/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_fail.png
new file mode 100644
index 00000000..746a0956
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_fail.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_fail.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_fail.png.data
new file mode 100644
index 00000000..10a26473
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_fail.png.data
@@ -0,0 +1,3 @@
+title=AutoTest generated results fail
+author=halw
+path=content/autotest-generated-results-fail
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_pass.png b/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_pass.png
new file mode 100644
index 00000000..698a8a9f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_pass.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_pass.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_pass.png.data
new file mode 100644
index 00000000..1fc7e063
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_generated_results_pass.png.data
@@ -0,0 +1,3 @@
+title=AutoTest generated results pass
+author=halw
+path=content/autotest-generated-results-pass
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_information_icon.png b/documentation/18.11/eiffelstudio/_images/AutoTest_information_icon.png
new file mode 100644
index 00000000..cf4b949c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_information_icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_information_icon.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_information_icon.png.data
new file mode 100644
index 00000000..ad705db4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_information_icon.png.data
@@ -0,0 +1,3 @@
+title=AutoTest information icon
+author=halw
+path=content/autotest-information-icon
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_interface_results_-_Execution.png b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_results_-_Execution.png
new file mode 100644
index 00000000..6e3a95fb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_results_-_Execution.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_interface_results_-_Execution.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_results_-_Execution.png.data
new file mode 100644
index 00000000..445c6af4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_results_-_Execution.png.data
@@ -0,0 +1,3 @@
+title=AutoTest interface results execution
+author=halw
+path=content/autotest-interface-results-execution
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_class.png b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_class.png
new file mode 100644
index 00000000..fde87617
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_class.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_class.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_class.png.data
new file mode 100644
index 00000000..a5745bad
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_class.png.data
@@ -0,0 +1,3 @@
+title=AutoTest interface test view class
+author=halw
+path=content/autotest-interface-test-view-class
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_covers.png b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_covers.png
new file mode 100644
index 00000000..d4e9d5a9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_covers.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_covers.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_covers.png.data
new file mode 100644
index 00000000..c8acff4c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_interface_test_view_covers.png.data
@@ -0,0 +1,3 @@
+title=AutoTest interface test view covers
+author=halw
+path=content/autotest-interface-test-view-covers
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_run_all_drop_down.png b/documentation/18.11/eiffelstudio/_images/AutoTest_run_all_drop_down.png
new file mode 100644
index 00000000..d2c0be3e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_run_all_drop_down.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_run_all_drop_down.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_run_all_drop_down.png.data
new file mode 100644
index 00000000..6a37638b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_run_all_drop_down.png.data
@@ -0,0 +1,3 @@
+title=AutoTest run all drop down
+author=halw
+path=content/autotest-run-all-drop-down
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_test_coverage_tag_dialog.png b/documentation/18.11/eiffelstudio/_images/AutoTest_test_coverage_tag_dialog.png
new file mode 100644
index 00000000..94b1aa1f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_test_coverage_tag_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_test_coverage_tag_dialog.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_test_coverage_tag_dialog.png.data
new file mode 100644
index 00000000..08b316df
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_test_coverage_tag_dialog.png.data
@@ -0,0 +1,3 @@
+title=AutoTest test coverage tag dialog
+author=halw
+path=content/autotest-test-coverage-tag-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_test_results_details_0.png b/documentation/18.11/eiffelstudio/_images/AutoTest_test_results_details_0.png
new file mode 100644
index 00000000..273066d6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_test_results_details_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_test_results_details_0.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_test_results_details_0.png.data
new file mode 100644
index 00000000..397473bd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_test_results_details_0.png.data
@@ -0,0 +1,3 @@
+title=AutoTest test results details
+author=halw
+path=content/autotest-test-results-details
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_after_generation_01.png b/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_after_generation_01.png
new file mode 100644
index 00000000..2579d0f7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_after_generation_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_after_generation_01.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_after_generation_01.png.data
new file mode 100644
index 00000000..5e21c00d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_after_generation_01.png.data
@@ -0,0 +1,3 @@
+title=AutoTest testing pane after generation
+author=halw
+path=content/autotest-testing-pane-after-generation
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_execution_results.png b/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_execution_results.png
new file mode 100644
index 00000000..474f8ed2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_execution_results.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_execution_results.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_execution_results.png.data
new file mode 100644
index 00000000..3c026bd2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_testing_pane_execution_results.png.data
@@ -0,0 +1,3 @@
+title=AutoTest testing pane execution results
+author=halw
+path=content/autotest-testing-pane-execution-results
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tests_pane_null_filter.png b/documentation/18.11/eiffelstudio/_images/AutoTest_tests_pane_null_filter.png
new file mode 100644
index 00000000..11586d26
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_tests_pane_null_filter.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tests_pane_null_filter.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_tests_pane_null_filter.png.data
new file mode 100644
index 00000000..e57a32f1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_tests_pane_null_filter.png.data
@@ -0,0 +1,3 @@
+title=AutoTest tests pane null filter
+author=halw
+path=content/autotest-tests-pane-null-filter
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tool_after_run.png b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_after_run.png
new file mode 100644
index 00000000..14b8be91
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_after_run.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tool_after_run.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_after_run.png.data
new file mode 100644
index 00000000..ed5ae1d6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_after_run.png.data
@@ -0,0 +1,3 @@
+title=AutoTest tool after run
+author=halw
+path=content/autotest-tool-after-run
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_failed_test.png b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_failed_test.png
new file mode 100644
index 00000000..d9e109c1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_failed_test.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_failed_test.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_failed_test.png.data
new file mode 100644
index 00000000..5fb2b848
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_failed_test.png.data
@@ -0,0 +1,3 @@
+title=AutoTest tool with failed test
+author=halw
+path=content/autotest-tool-failed-test
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_passed_test.png b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_passed_test.png
new file mode 100644
index 00000000..071b5c4a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_passed_test.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_passed_test.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_passed_test.png.data
new file mode 100644
index 00000000..08b32a01
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_passed_test.png.data
@@ -0,0 +1,3 @@
+title=AutoTest tool with passed test
+author=halw
+path=content/autotest-tool-passed-test
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_test.png b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_test.png
new file mode 100644
index 00000000..b25961ed
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_test.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_test.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_test.png.data
new file mode 100644
index 00000000..ac244d7b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_tool_with_test.png.data
@@ -0,0 +1,3 @@
+title=AutoTest tool with test
+author=halw
+path=content/autotest-tool-test
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_user_defined_tag_root.png b/documentation/18.11/eiffelstudio/_images/AutoTest_user_defined_tag_root.png
new file mode 100644
index 00000000..a6f8ff3a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/AutoTest_user_defined_tag_root.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/AutoTest_user_defined_tag_root.png.data b/documentation/18.11/eiffelstudio/_images/AutoTest_user_defined_tag_root.png.data
new file mode 100644
index 00000000..6ad1ad45
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/AutoTest_user_defined_tag_root.png.data
@@ -0,0 +1,3 @@
+title=AutoTest user defined tag root
+author=halw
+path=content/autotest-user-defined-tag-root
diff --git a/documentation/18.11/eiffelstudio/_images/Automatic_class_license_Eiffel_Software_directory.png b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_Eiffel_Software_directory.png
new file mode 100644
index 00000000..d1d8dc84
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_Eiffel_Software_directory.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Automatic_class_license_Eiffel_Software_directory.png.data b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_Eiffel_Software_directory.png.data
new file mode 100644
index 00000000..63d35be1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_Eiffel_Software_directory.png.data
@@ -0,0 +1,3 @@
+title=Automatic class license Eiffel Software directory
+author=halw
+path=content/automatic-class-license-eiffel-software-directory
diff --git a/documentation/18.11/eiffelstudio/_images/Automatic_class_license_project_directory.png b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_project_directory.png
new file mode 100644
index 00000000..353bca71
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_project_directory.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Automatic_class_license_project_directory.png.data b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_project_directory.png.data
new file mode 100644
index 00000000..49a99424
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_project_directory.png.data
@@ -0,0 +1,3 @@
+title=Automatic class license project directory
+author=halw
+path=content/automatic-class-license-project-directory
diff --git a/documentation/18.11/eiffelstudio/_images/Automatic_class_license_user_files_directory.png b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_user_files_directory.png
new file mode 100644
index 00000000..7f105c19
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_user_files_directory.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Automatic_class_license_user_files_directory.png.data b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_user_files_directory.png.data
new file mode 100644
index 00000000..79cad87e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Automatic_class_license_user_files_directory.png.data
@@ -0,0 +1,3 @@
+title=Automatic class license Eiffel user files directory
+author=halw
+path=content/automatic-class-license-eiffel-user-files-directory
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Analysis_Buttons.png b/documentation/18.11/eiffelstudio/_images/CA_Analysis_Buttons.png
new file mode 100644
index 00000000..8aaf732c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/CA_Analysis_Buttons.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Analysis_Buttons.png.data b/documentation/18.11/eiffelstudio/_images/CA_Analysis_Buttons.png.data
new file mode 100644
index 00000000..2f413625
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/CA_Analysis_Buttons.png.data
@@ -0,0 +1,2 @@
+title=CA Analysis Buttons
+path=content/CA_Analysis_Buttons.png
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Class_Context_Menu.png b/documentation/18.11/eiffelstudio/_images/CA_Class_Context_Menu.png
new file mode 100644
index 00000000..bb1360b6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/CA_Class_Context_Menu.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Class_Context_Menu.png.data b/documentation/18.11/eiffelstudio/_images/CA_Class_Context_Menu.png.data
new file mode 100644
index 00000000..7a512fbe
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/CA_Class_Context_Menu.png.data
@@ -0,0 +1,2 @@
+title=CA Class Context Menu
+path=content/CA_Class_Context_Menu.png
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Cluster_Context_Menu.png b/documentation/18.11/eiffelstudio/_images/CA_Cluster_Context_Menu.png
new file mode 100644
index 00000000..94a5d3cc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/CA_Cluster_Context_Menu.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Cluster_Context_Menu.png.data b/documentation/18.11/eiffelstudio/_images/CA_Cluster_Context_Menu.png.data
new file mode 100644
index 00000000..793c2081
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/CA_Cluster_Context_Menu.png.data
@@ -0,0 +1,2 @@
+title=CA Cluster Context Menu
+path=content/CA_Cluster_Context_Menu.png
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Fixing.png b/documentation/18.11/eiffelstudio/_images/CA_Fixing.png
new file mode 100644
index 00000000..94e2128c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/CA_Fixing.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Fixing.png.data b/documentation/18.11/eiffelstudio/_images/CA_Fixing.png.data
new file mode 100644
index 00000000..eb6063cb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/CA_Fixing.png.data
@@ -0,0 +1,2 @@
+title=CA Fixing Rule Violation
+path=content/CA_Fixing.png
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Preferences_Dialog.png b/documentation/18.11/eiffelstudio/_images/CA_Preferences_Dialog.png
new file mode 100644
index 00000000..13369061
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/CA_Preferences_Dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Preferences_Dialog.png.data b/documentation/18.11/eiffelstudio/_images/CA_Preferences_Dialog.png.data
new file mode 100644
index 00000000..528a649e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/CA_Preferences_Dialog.png.data
@@ -0,0 +1,2 @@
+title=CA Preference Dialog
+path=content/CA_Preferences_Dialog.png
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Rule_Preferences.png b/documentation/18.11/eiffelstudio/_images/CA_Rule_Preferences.png
new file mode 100644
index 00000000..037d940e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/CA_Rule_Preferences.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Rule_Preferences.png.data b/documentation/18.11/eiffelstudio/_images/CA_Rule_Preferences.png.data
new file mode 100644
index 00000000..bdf89919
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/CA_Rule_Preferences.png.data
@@ -0,0 +1,2 @@
+title=CA Rule Preferences
+path=content/CA_Rule_Preferences.png
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Sample_Results.png b/documentation/18.11/eiffelstudio/_images/CA_Sample_Results.png
new file mode 100644
index 00000000..782eb8fd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/CA_Sample_Results.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/CA_Sample_Results.png.data b/documentation/18.11/eiffelstudio/_images/CA_Sample_Results.png.data
new file mode 100644
index 00000000..178c5975
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/CA_Sample_Results.png.data
@@ -0,0 +1,2 @@
+title=CA Simple Analysis
+path=content/CA_Sample_Results.png
diff --git a/documentation/18.11/eiffelstudio/_images/Ca_empty-tool-panel.png b/documentation/18.11/eiffelstudio/_images/Ca_empty-tool-panel.png
new file mode 100644
index 00000000..542b1530
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Ca_empty-tool-panel.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Ca_empty-tool-panel.png.data b/documentation/18.11/eiffelstudio/_images/Ca_empty-tool-panel.png.data
new file mode 100644
index 00000000..9dbf267c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Ca_empty-tool-panel.png.data
@@ -0,0 +1,2 @@
+title=Eiffel Inspector - Tool Panel
+path=content/Ca_empty-tool-panel.png
diff --git a/documentation/18.11/eiffelstudio/_images/Create_new_tests_2.png b/documentation/18.11/eiffelstudio/_images/Create_new_tests_2.png
new file mode 100644
index 00000000..2122892d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Create_new_tests_2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Create_new_tests_2.png.data b/documentation/18.11/eiffelstudio/_images/Create_new_tests_2.png.data
new file mode 100644
index 00000000..94a996b9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Create_new_tests_2.png.data
@@ -0,0 +1,3 @@
+title=Create new tests
+author=halw
+path=content/create-new-tests
diff --git a/documentation/18.11/eiffelstudio/_images/Customize_toolbar_dialog.png b/documentation/18.11/eiffelstudio/_images/Customize_toolbar_dialog.png
new file mode 100644
index 00000000..19f290e6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Customize_toolbar_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Customize_toolbar_dialog.png.data b/documentation/18.11/eiffelstudio/_images/Customize_toolbar_dialog.png.data
new file mode 100644
index 00000000..9876424f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Customize_toolbar_dialog.png.data
@@ -0,0 +1,3 @@
+title=Customize toolbar dialog
+author=halw
+path=content/customize-toolbar-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_add_button.png b/documentation/18.11/eiffelstudio/_images/EIS_add_button.png
new file mode 100644
index 00000000..e4a32422
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/EIS_add_button.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_add_button.png.data b/documentation/18.11/eiffelstudio/_images/EIS_add_button.png.data
new file mode 100644
index 00000000..065fdf75
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/EIS_add_button.png.data
@@ -0,0 +1,3 @@
+title=EIS add button
+author=halw
+path=content/eis-add-button
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_affected_source.png b/documentation/18.11/eiffelstudio/_images/EIS_affected_source.png
new file mode 100644
index 00000000..7107509f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/EIS_affected_source.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_affected_source.png.data b/documentation/18.11/eiffelstudio/_images/EIS_affected_source.png.data
new file mode 100644
index 00000000..418063be
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/EIS_affected_source.png.data
@@ -0,0 +1,3 @@
+title=Information Tool change analysis
+author=tedf
+path=content/information-tool-change-analysis
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_info_tabl.png b/documentation/18.11/eiffelstudio/_images/EIS_info_tabl.png
new file mode 100644
index 00000000..d87d321a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/EIS_info_tabl.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_info_tabl.png.data b/documentation/18.11/eiffelstudio/_images/EIS_info_tabl.png.data
new file mode 100644
index 00000000..32d6a013
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/EIS_info_tabl.png.data
@@ -0,0 +1,3 @@
+title=EIS info tab
+author=halw
+path=content/eis-info-tab
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_information_icon.png b/documentation/18.11/eiffelstudio/_images/EIS_information_icon.png
new file mode 100644
index 00000000..315696c7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/EIS_information_icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_information_icon.png.data b/documentation/18.11/eiffelstudio/_images/EIS_information_icon.png.data
new file mode 100644
index 00000000..919df111
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/EIS_information_icon.png.data
@@ -0,0 +1,3 @@
+title=EIS information icon
+author=halw
+path=content/eis-information-icon
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_locate_class_or_cluster_icon.png b/documentation/18.11/eiffelstudio/_images/EIS_locate_class_or_cluster_icon.png
new file mode 100644
index 00000000..c00a79e0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/EIS_locate_class_or_cluster_icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/EIS_locate_class_or_cluster_icon.png.data b/documentation/18.11/eiffelstudio/_images/EIS_locate_class_or_cluster_icon.png.data
new file mode 100644
index 00000000..e28d503b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/EIS_locate_class_or_cluster_icon.png.data
@@ -0,0 +1,3 @@
+title=EIS locate class or cluster icon
+author=halw
+path=content/eis-locate-class-or-cluster-icon
diff --git a/documentation/18.11/eiffelstudio/_images/Eiffel_Inspector-command_line_0.png b/documentation/18.11/eiffelstudio/_images/Eiffel_Inspector-command_line_0.png
new file mode 100644
index 00000000..4f4a4179
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Eiffel_Inspector-command_line_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Eiffel_Inspector-command_line_0.png.data b/documentation/18.11/eiffelstudio/_images/Eiffel_Inspector-command_line_0.png.data
new file mode 100644
index 00000000..f03e71af
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Eiffel_Inspector-command_line_0.png.data
@@ -0,0 +1,2 @@
+title=Eiffel Inspector Command Line
+path=content/Eiffel_Inspector-command_line_0.png
diff --git a/documentation/18.11/eiffelstudio/_images/External_commands_tools_menu_0.png b/documentation/18.11/eiffelstudio/_images/External_commands_tools_menu_0.png
new file mode 100644
index 00000000..5286c907
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/External_commands_tools_menu_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/External_commands_tools_menu_0.png.data b/documentation/18.11/eiffelstudio/_images/External_commands_tools_menu_0.png.data
new file mode 100644
index 00000000..c51a372b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/External_commands_tools_menu_0.png.data
@@ -0,0 +1,3 @@
+title=External commands tools menu
+author=halw
+path=content/external-commands-tools-menu
diff --git a/documentation/18.11/eiffelstudio/_images/External_compilation_pane_edit_feature.png b/documentation/18.11/eiffelstudio/_images/External_compilation_pane_edit_feature.png
new file mode 100644
index 00000000..83afe0e1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/External_compilation_pane_edit_feature.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/External_compilation_pane_edit_feature.png.data b/documentation/18.11/eiffelstudio/_images/External_compilation_pane_edit_feature.png.data
new file mode 100644
index 00000000..e7eff856
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/External_compilation_pane_edit_feature.png.data
@@ -0,0 +1,3 @@
+title=External compilation pane edit feature
+author=halw
+path=content/external-compilation-pane-edit-feature
diff --git a/documentation/18.11/eiffelstudio/_images/External_compilation_pane_file_selection.png b/documentation/18.11/eiffelstudio/_images/External_compilation_pane_file_selection.png
new file mode 100644
index 00000000..313b3eff
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/External_compilation_pane_file_selection.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/External_compilation_pane_file_selection.png.data b/documentation/18.11/eiffelstudio/_images/External_compilation_pane_file_selection.png.data
new file mode 100644
index 00000000..929837e9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/External_compilation_pane_file_selection.png.data
@@ -0,0 +1,3 @@
+title=External compilation pane file selection
+author=halw
+path=content/external-compilation-pane-file-selection
diff --git a/documentation/18.11/eiffelstudio/_images/External_compilation_tool_01.png b/documentation/18.11/eiffelstudio/_images/External_compilation_tool_01.png
new file mode 100644
index 00000000..2e481a85
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/External_compilation_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/External_compilation_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/External_compilation_tool_01.png.data
new file mode 100644
index 00000000..6263f26a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/External_compilation_tool_01.png.data
@@ -0,0 +1,3 @@
+title=External compilation pane 01
+author=halw
+path=content/external-compilation-pane-01
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rule_Condition.png b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rule_Condition.png
new file mode 100644
index 00000000..86855735
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rule_Condition.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rule_Condition.png.data b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rule_Condition.png.data
new file mode 100644
index 00000000..2a0a0551
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rule_Condition.png.data
@@ -0,0 +1,3 @@
+title=condition-dialog
+author=halw
+path=content/condition-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rules.png b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rules.png
new file mode 100644
index 00000000..b0971e8e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rules.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rules.png.data b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rules.png.data
new file mode 100644
index 00000000..c1420713
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Exclude_Rules.png.data
@@ -0,0 +1,3 @@
+title=exclude-dialog
+author=halw
+path=content/exclude-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Root.png b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Root.png
new file mode 100644
index 00000000..e771bb0d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Root.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Root.png.data b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Root.png.data
new file mode 100644
index 00000000..2b173b11
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Root.png.data
@@ -0,0 +1,3 @@
+title=root-dialog
+author=halw
+path=content/root-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Version.png b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Version.png
new file mode 100644
index 00000000..42071d1c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Version.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Version.png.data b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Version.png.data
new file mode 100644
index 00000000..70098e97
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Edit_Version.png.data
@@ -0,0 +1,3 @@
+title=version-dialog
+author=halw
+path=content/version-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Proj_Settings.png b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Proj_Settings.png
new file mode 100644
index 00000000..4ef40d3e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Proj_Settings.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Proj_Settings.png.data b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Proj_Settings.png.data
new file mode 100644
index 00000000..04c4c47f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/GenTargetOptions_Proj_Settings.png.data
@@ -0,0 +1,3 @@
+title=target-options
+author=halw
+path=content/target-options
diff --git a/documentation/18.11/eiffelstudio/_images/Group_Options_Edit_Visible_Classes.png b/documentation/18.11/eiffelstudio/_images/Group_Options_Edit_Visible_Classes.png
new file mode 100644
index 00000000..88eda268
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Group_Options_Edit_Visible_Classes.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Group_Options_Edit_Visible_Classes.png.data b/documentation/18.11/eiffelstudio/_images/Group_Options_Edit_Visible_Classes.png.data
new file mode 100644
index 00000000..129a282c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Group_Options_Edit_Visible_Classes.png.data
@@ -0,0 +1,3 @@
+title=visible-dialog
+author=halw
+path=content/visible-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/Group_Options_main.png b/documentation/18.11/eiffelstudio/_images/Group_Options_main.png
new file mode 100644
index 00000000..78a2c0ff
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Group_Options_main.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Group_Options_main.png.data b/documentation/18.11/eiffelstudio/_images/Group_Options_main.png.data
new file mode 100644
index 00000000..105a37b2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Group_Options_main.png.data
@@ -0,0 +1,3 @@
+title=group-options
+author=halw
+path=content/group-options
diff --git a/documentation/18.11/eiffelstudio/_images/Implementation venn diagram.png b/documentation/18.11/eiffelstudio/_images/Implementation venn diagram.png
new file mode 100644
index 00000000..8e60ec0a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Implementation venn diagram.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Implementation venn diagram.png.data b/documentation/18.11/eiffelstudio/_images/Implementation venn diagram.png.data
new file mode 100644
index 00000000..89a3b7f0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Implementation venn diagram.png.data
@@ -0,0 +1,3 @@
+title=Eiffel implementation venn diagram
+author=admin
+path=content/eiffel-implementation-venn-diagram
diff --git a/documentation/18.11/eiffelstudio/_images/Metrics_tool_Metrics_evaluation_pane.png b/documentation/18.11/eiffelstudio/_images/Metrics_tool_Metrics_evaluation_pane.png
new file mode 100644
index 00000000..0ea5bd67
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Metrics_tool_Metrics_evaluation_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Metrics_tool_Metrics_evaluation_pane.png.data b/documentation/18.11/eiffelstudio/_images/Metrics_tool_Metrics_evaluation_pane.png.data
new file mode 100644
index 00000000..6a503e0e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Metrics_tool_Metrics_evaluation_pane.png.data
@@ -0,0 +1,3 @@
+title=Metrics tool Metrics evaluation pane
+author=halw
+path=content/metrics-tool-metrics-evaluation-pane
diff --git a/documentation/18.11/eiffelstudio/_images/Output_tool_02.png b/documentation/18.11/eiffelstudio/_images/Output_tool_02.png
new file mode 100644
index 00000000..284554e3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Output_tool_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Output_tool_02.png.data b/documentation/18.11/eiffelstudio/_images/Output_tool_02.png.data
new file mode 100644
index 00000000..c3e68932
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Output_tool_02.png.data
@@ -0,0 +1,3 @@
+title=Outputs tool 02
+author=halw
+path=content/outputs-tool-02
diff --git a/documentation/18.11/eiffelstudio/_images/Outputs_tool_01.png b/documentation/18.11/eiffelstudio/_images/Outputs_tool_01.png
new file mode 100644
index 00000000..409c3d84
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Outputs_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Outputs_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/Outputs_tool_01.png.data
new file mode 100644
index 00000000..1ed68b62
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Outputs_tool_01.png.data
@@ -0,0 +1,3 @@
+title=Outputs tool 01
+author=halw
+path=content/outputs-tool-01
diff --git a/documentation/18.11/eiffelstudio/_images/Outputs_tool_General_pane.png b/documentation/18.11/eiffelstudio/_images/Outputs_tool_General_pane.png
new file mode 100644
index 00000000..581e8db0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Outputs_tool_General_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Outputs_tool_General_pane.png.data b/documentation/18.11/eiffelstudio/_images/Outputs_tool_General_pane.png.data
new file mode 100644
index 00000000..2a09958c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Outputs_tool_General_pane.png.data
@@ -0,0 +1,3 @@
+title=Outputs tool General pane
+author=halw
+path=content/outputs-tool-general-pane
diff --git a/documentation/18.11/eiffelstudio/_images/Outputs_tool_Open_folder.png b/documentation/18.11/eiffelstudio/_images/Outputs_tool_Open_folder.png
new file mode 100644
index 00000000..3f4b22ec
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Outputs_tool_Open_folder.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Outputs_tool_Open_folder.png.data b/documentation/18.11/eiffelstudio/_images/Outputs_tool_Open_folder.png.data
new file mode 100644
index 00000000..43f450a0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Outputs_tool_Open_folder.png.data
@@ -0,0 +1,3 @@
+title=Outputs tool Open folder
+author=halw
+path=content/outputs-tool-open-folder
diff --git a/documentation/18.11/eiffelstudio/_images/Outputs_tool_Transient_functionality.png b/documentation/18.11/eiffelstudio/_images/Outputs_tool_Transient_functionality.png
new file mode 100644
index 00000000..d0a82756
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Outputs_tool_Transient_functionality.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Outputs_tool_Transient_functionality.png.data b/documentation/18.11/eiffelstudio/_images/Outputs_tool_Transient_functionality.png.data
new file mode 100644
index 00000000..0b062c4b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Outputs_tool_Transient_functionality.png.data
@@ -0,0 +1,3 @@
+title=Outputs tool transient functionality
+author=halw
+path=content/outputs-tool-transient-functionality
diff --git a/documentation/18.11/eiffelstudio/_images/Search_capture_boxes_0.png b/documentation/18.11/eiffelstudio/_images/Search_capture_boxes_0.png
new file mode 100644
index 00000000..198a655e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Search_capture_boxes_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Search_capture_boxes_0.png.data b/documentation/18.11/eiffelstudio/_images/Search_capture_boxes_0.png.data
new file mode 100644
index 00000000..20d54bdc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Search_capture_boxes_0.png.data
@@ -0,0 +1,3 @@
+title=Search capture boxes
+author=halw
+path=content/search-capture-boxes
diff --git a/documentation/18.11/eiffelstudio/_images/Select_Help_Document_dialog.png b/documentation/18.11/eiffelstudio/_images/Select_Help_Document_dialog.png
new file mode 100644
index 00000000..378336e7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Select_Help_Document_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Select_Help_Document_dialog.png.data b/documentation/18.11/eiffelstudio/_images/Select_Help_Document_dialog.png.data
new file mode 100644
index 00000000..dc3ef320
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Select_Help_Document_dialog.png.data
@@ -0,0 +1,3 @@
+title=select help document dialog
+author=halw
+path=content/select-help-document-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/Subversion_update_command_01.png b/documentation/18.11/eiffelstudio/_images/Subversion_update_command_01.png
new file mode 100644
index 00000000..3b541249
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/Subversion_update_command_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/Subversion_update_command_01.png.data b/documentation/18.11/eiffelstudio/_images/Subversion_update_command_01.png.data
new file mode 100644
index 00000000..07f5ac2f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/Subversion_update_command_01.png.data
@@ -0,0 +1,3 @@
+title=subversion-update-command-01
+author=halw
+path=content/subversion-update-command-01
diff --git a/documentation/18.11/eiffelstudio/_images/address-toolbar.png b/documentation/18.11/eiffelstudio/_images/address-toolbar.png
new file mode 100644
index 00000000..e7c5e047
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/address-toolbar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/address-toolbar.png.data b/documentation/18.11/eiffelstudio/_images/address-toolbar.png.data
new file mode 100644
index 00000000..cf65d59f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/address-toolbar.png.data
@@ -0,0 +1,3 @@
+title=address-toolbar
+author=halw
+path=content/address-toolbar
diff --git a/documentation/18.11/eiffelstudio/_images/argument-dialog.png b/documentation/18.11/eiffelstudio/_images/argument-dialog.png
new file mode 100644
index 00000000..609eb497
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/argument-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/argument-dialog.png.data b/documentation/18.11/eiffelstudio/_images/argument-dialog.png.data
new file mode 100644
index 00000000..fc11051d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/argument-dialog.png.data
@@ -0,0 +1,3 @@
+title=argument-dialog
+author=admin
+path=content/argument-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/assertion-options-2.png b/documentation/18.11/eiffelstudio/_images/assertion-options-2.png
new file mode 100644
index 00000000..3a00d9fa
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/assertion-options-2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/assertion-options-2.png.data b/documentation/18.11/eiffelstudio/_images/assertion-options-2.png.data
new file mode 100644
index 00000000..94f70382
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/assertion-options-2.png.data
@@ -0,0 +1,3 @@
+title=assertion-options
+author=halw
+path=content/assertion-options
diff --git a/documentation/18.11/eiffelstudio/_images/auto-hide-icon.png b/documentation/18.11/eiffelstudio/_images/auto-hide-icon.png
new file mode 100644
index 00000000..7010127b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/auto-hide-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/auto-hide-icon.png.data b/documentation/18.11/eiffelstudio/_images/auto-hide-icon.png.data
new file mode 100644
index 00000000..7f8b143c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/auto-hide-icon.png.data
@@ -0,0 +1,3 @@
+title=auto-hide-icon
+author=halw
+path=content/auto-hide-icon
diff --git a/documentation/18.11/eiffelstudio/_images/automatic-sweeping.png b/documentation/18.11/eiffelstudio/_images/automatic-sweeping.png
new file mode 100644
index 00000000..8e551049
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/automatic-sweeping.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/automatic-sweeping.png.data b/documentation/18.11/eiffelstudio/_images/automatic-sweeping.png.data
new file mode 100644
index 00000000..9355e023
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/automatic-sweeping.png.data
@@ -0,0 +1,3 @@
+title=automatic sweeping icon
+author=halw
+path=content/automatic-sweeping-icon
diff --git a/documentation/18.11/eiffelstudio/_images/automatic_annotation_icon.png b/documentation/18.11/eiffelstudio/_images/automatic_annotation_icon.png
new file mode 100644
index 00000000..77576c51
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/automatic_annotation_icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/automatic_annotation_icon.png.data b/documentation/18.11/eiffelstudio/_images/automatic_annotation_icon.png.data
new file mode 100644
index 00000000..270b6dcc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/automatic_annotation_icon.png.data
@@ -0,0 +1,3 @@
+title=automatic annotation icon
+author=halw
+path=content/automatic-annotation-icon
diff --git a/documentation/18.11/eiffelstudio/_images/bon-agg-client.png b/documentation/18.11/eiffelstudio/_images/bon-agg-client.png
new file mode 100644
index 00000000..9e9443f3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-agg-client.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-agg-client.png.data b/documentation/18.11/eiffelstudio/_images/bon-agg-client.png.data
new file mode 100644
index 00000000..22697171
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-agg-client.png.data
@@ -0,0 +1,3 @@
+title=bon-agg-client
+author=admin
+path=content/bon-agg-client
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-deferred.png b/documentation/18.11/eiffelstudio/_images/bon-class-deferred.png
new file mode 100644
index 00000000..a90bda7d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-class-deferred.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-deferred.png.data b/documentation/18.11/eiffelstudio/_images/bon-class-deferred.png.data
new file mode 100644
index 00000000..96a55382
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-class-deferred.png.data
@@ -0,0 +1,3 @@
+title=bon-class-deferred
+author=admin
+path=content/bon-class-deferred
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-effective.png b/documentation/18.11/eiffelstudio/_images/bon-class-effective.png
new file mode 100644
index 00000000..f8cd79a3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-class-effective.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-effective.png.data b/documentation/18.11/eiffelstudio/_images/bon-class-effective.png.data
new file mode 100644
index 00000000..e6dbe01a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-class-effective.png.data
@@ -0,0 +1,3 @@
+title=bon-class-effective
+author=admin
+path=content/bon-class-effective
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-interfaced.png b/documentation/18.11/eiffelstudio/_images/bon-class-interfaced.png
new file mode 100644
index 00000000..7936348b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-class-interfaced.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-interfaced.png.data b/documentation/18.11/eiffelstudio/_images/bon-class-interfaced.png.data
new file mode 100644
index 00000000..4abd37bd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-class-interfaced.png.data
@@ -0,0 +1,3 @@
+title=bon-class-interfaced
+author=admin
+path=content/bon-class-interfaced
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-persistent.png b/documentation/18.11/eiffelstudio/_images/bon-class-persistent.png
new file mode 100644
index 00000000..329375b2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-class-persistent.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-persistent.png.data b/documentation/18.11/eiffelstudio/_images/bon-class-persistent.png.data
new file mode 100644
index 00000000..be6b2574
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-class-persistent.png.data
@@ -0,0 +1,3 @@
+title=bon-class-persistent
+author=admin
+path=content/bon-class-persistent
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-reused.png b/documentation/18.11/eiffelstudio/_images/bon-class-reused.png
new file mode 100644
index 00000000..e661b213
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-class-reused.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-reused.png.data b/documentation/18.11/eiffelstudio/_images/bon-class-reused.png.data
new file mode 100644
index 00000000..d1bee886
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-class-reused.png.data
@@ -0,0 +1,3 @@
+title=bon-class-reused
+author=admin
+path=content/bon-class-reused
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-root.png b/documentation/18.11/eiffelstudio/_images/bon-class-root.png
new file mode 100644
index 00000000..b32edb6e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-class-root.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class-root.png.data b/documentation/18.11/eiffelstudio/_images/bon-class-root.png.data
new file mode 100644
index 00000000..cfe7f5f6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-class-root.png.data
@@ -0,0 +1,3 @@
+title=bon-class-root
+author=admin
+path=content/bon-class-root
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class.png b/documentation/18.11/eiffelstudio/_images/bon-class.png
new file mode 100644
index 00000000..0124cd2b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-class.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-class.png.data b/documentation/18.11/eiffelstudio/_images/bon-class.png.data
new file mode 100644
index 00000000..6fa0e666
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-class.png.data
@@ -0,0 +1,3 @@
+title=bon-class
+author=admin
+path=content/bon-class
diff --git a/documentation/18.11/eiffelstudio/_images/bon-client.png b/documentation/18.11/eiffelstudio/_images/bon-client.png
new file mode 100644
index 00000000..daae8acd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-client.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-client.png.data b/documentation/18.11/eiffelstudio/_images/bon-client.png.data
new file mode 100644
index 00000000..7732ce25
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-client.png.data
@@ -0,0 +1,3 @@
+title=bon-client
+author=admin
+path=content/bon-client
diff --git a/documentation/18.11/eiffelstudio/_images/bon-cluster-iconified.png b/documentation/18.11/eiffelstudio/_images/bon-cluster-iconified.png
new file mode 100644
index 00000000..49df8572
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-cluster-iconified.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-cluster-iconified.png.data b/documentation/18.11/eiffelstudio/_images/bon-cluster-iconified.png.data
new file mode 100644
index 00000000..cce106cf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-cluster-iconified.png.data
@@ -0,0 +1,3 @@
+title=bon-cluster-iconified
+author=admin
+path=content/bon-cluster-iconified
diff --git a/documentation/18.11/eiffelstudio/_images/bon-cluster.png b/documentation/18.11/eiffelstudio/_images/bon-cluster.png
new file mode 100644
index 00000000..8c250799
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-cluster.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-cluster.png.data b/documentation/18.11/eiffelstudio/_images/bon-cluster.png.data
new file mode 100644
index 00000000..63483ae5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-cluster.png.data
@@ -0,0 +1,3 @@
+title=bon-cluster
+author=admin
+path=content/bon-cluster
diff --git a/documentation/18.11/eiffelstudio/_images/bon-inheritance.png b/documentation/18.11/eiffelstudio/_images/bon-inheritance.png
new file mode 100644
index 00000000..ce23a911
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-inheritance.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-inheritance.png.data b/documentation/18.11/eiffelstudio/_images/bon-inheritance.png.data
new file mode 100644
index 00000000..a56b76ea
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-inheritance.png.data
@@ -0,0 +1,3 @@
+title=bon-inheritance
+author=admin
+path=content/bon-inheritance
diff --git a/documentation/18.11/eiffelstudio/_images/bon-list-relations.png b/documentation/18.11/eiffelstudio/_images/bon-list-relations.png
new file mode 100644
index 00000000..b83ca42b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bon-list-relations.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bon-list-relations.png.data b/documentation/18.11/eiffelstudio/_images/bon-list-relations.png.data
new file mode 100644
index 00000000..4e555afc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bon-list-relations.png.data
@@ -0,0 +1,3 @@
+title=bon-list-relations
+author=admin
+path=content/bon-list-relations
diff --git a/documentation/18.11/eiffelstudio/_images/bp-current-line-icon.png b/documentation/18.11/eiffelstudio/_images/bp-current-line-icon.png
new file mode 100644
index 00000000..86016d4f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bp-current-line-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bp-current-line-icon.png.data b/documentation/18.11/eiffelstudio/_images/bp-current-line-icon.png.data
new file mode 100644
index 00000000..6cf6aebd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bp-current-line-icon.png.data
@@ -0,0 +1,3 @@
+title=bp-current-line-icon
+author=admin
+path=content/bp-current-line-icon
diff --git a/documentation/18.11/eiffelstudio/_images/bp-disabled-conditional-icon.png b/documentation/18.11/eiffelstudio/_images/bp-disabled-conditional-icon.png
new file mode 100644
index 00000000..e848d8c3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bp-disabled-conditional-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bp-disabled-conditional-icon.png.data b/documentation/18.11/eiffelstudio/_images/bp-disabled-conditional-icon.png.data
new file mode 100644
index 00000000..0a13ce5c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bp-disabled-conditional-icon.png.data
@@ -0,0 +1,3 @@
+title=bp-disabled-conditional-icon
+author=admin
+path=content/bp-disabled-conditional-icon
diff --git a/documentation/18.11/eiffelstudio/_images/bp-disabled-icon.png b/documentation/18.11/eiffelstudio/_images/bp-disabled-icon.png
new file mode 100644
index 00000000..67adce91
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bp-disabled-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bp-disabled-icon.png.data b/documentation/18.11/eiffelstudio/_images/bp-disabled-icon.png.data
new file mode 100644
index 00000000..31c8db3d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bp-disabled-icon.png.data
@@ -0,0 +1,3 @@
+title=bp-disabled-icon
+author=admin
+path=content/bp-disabled-icon
diff --git a/documentation/18.11/eiffelstudio/_images/bp-enabled-conditional-icon.png b/documentation/18.11/eiffelstudio/_images/bp-enabled-conditional-icon.png
new file mode 100644
index 00000000..1c145462
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bp-enabled-conditional-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bp-enabled-conditional-icon.png.data b/documentation/18.11/eiffelstudio/_images/bp-enabled-conditional-icon.png.data
new file mode 100644
index 00000000..26077080
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bp-enabled-conditional-icon.png.data
@@ -0,0 +1,3 @@
+title=bp-enabled-conditional-icon
+author=admin
+path=content/bp-enabled-conditional-icon
diff --git a/documentation/18.11/eiffelstudio/_images/bp-enabled-icon.png b/documentation/18.11/eiffelstudio/_images/bp-enabled-icon.png
new file mode 100644
index 00000000..279a01a2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bp-enabled-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bp-enabled-icon.png.data b/documentation/18.11/eiffelstudio/_images/bp-enabled-icon.png.data
new file mode 100644
index 00000000..1a4b3e48
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bp-enabled-icon.png.data
@@ -0,0 +1,3 @@
+title=bp-enabled-icon
+author=admin
+path=content/bp-enabled-icon
diff --git a/documentation/18.11/eiffelstudio/_images/bp-slot-icon.png b/documentation/18.11/eiffelstudio/_images/bp-slot-icon.png
new file mode 100644
index 00000000..e8330b9f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bp-slot-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bp-slot-icon.png.data b/documentation/18.11/eiffelstudio/_images/bp-slot-icon.png.data
new file mode 100644
index 00000000..32827c32
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bp-slot-icon.png.data
@@ -0,0 +1,3 @@
+title=bp-slot-icon
+author=admin
+path=content/bp-slot-icon
diff --git a/documentation/18.11/eiffelstudio/_images/bp-slot-other-frame-icon.png b/documentation/18.11/eiffelstudio/_images/bp-slot-other-frame-icon.png
new file mode 100644
index 00000000..9c440b67
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/bp-slot-other-frame-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/bp-slot-other-frame-icon.png.data b/documentation/18.11/eiffelstudio/_images/bp-slot-other-frame-icon.png.data
new file mode 100644
index 00000000..da6d23f2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/bp-slot-other-frame-icon.png.data
@@ -0,0 +1,3 @@
+title=bp-slot-other-frame-icon
+author=admin
+path=content/bp-slot-other-frame-icon
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-context-menu.png b/documentation/18.11/eiffelstudio/_images/breakpoint-context-menu.png
new file mode 100644
index 00000000..64511aab
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoint-context-menu.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-context-menu.png.data b/documentation/18.11/eiffelstudio/_images/breakpoint-context-menu.png.data
new file mode 100644
index 00000000..4966eb43
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoint-context-menu.png.data
@@ -0,0 +1,3 @@
+title=breakpoint-context-menu
+author=admin
+path=content/breakpoint-context-menu
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-condition.png b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-condition.png
new file mode 100644
index 00000000..324aac6b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-condition.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-condition.png.data b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-condition.png.data
new file mode 100644
index 00000000..d03c8f38
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-condition.png.data
@@ -0,0 +1,3 @@
+title=breakpoint-dialog-condition
+author=admin
+path=content/breakpoint-dialog-condition
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-context.png b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-context.png
new file mode 100644
index 00000000..fd8ce1af
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-context.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-context.png.data b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-context.png.data
new file mode 100644
index 00000000..0c4e585d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-context.png.data
@@ -0,0 +1,3 @@
+title=breakpoint-dialog-context
+author=admin
+path=content/breakpoint-dialog-context
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-hit-count.png b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-hit-count.png
new file mode 100644
index 00000000..cb1f72f1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-hit-count.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-hit-count.png.data b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-hit-count.png.data
new file mode 100644
index 00000000..3fceb34b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-hit-count.png.data
@@ -0,0 +1,3 @@
+title=breakpoint-dialog-hit-count
+author=admin
+path=content/breakpoint-dialog-hit-count
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits-action.png b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits-action.png
new file mode 100644
index 00000000..176a8258
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits-action.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits-action.png.data b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits-action.png.data
new file mode 100644
index 00000000..6d3adbf2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits-action.png.data
@@ -0,0 +1,3 @@
+title=breakpoint-dialog-when-hits-action
+author=admin
+path=content/breakpoint-dialog-when-hits-action
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits.png b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits.png
new file mode 100644
index 00000000..37eeccf1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits.png.data b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits.png.data
new file mode 100644
index 00000000..83c42e0a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoint-dialog-when-hits.png.data
@@ -0,0 +1,3 @@
+title=breakpoint-dialog-when-hits
+author=admin
+path=content/breakpoint-dialog-when-hits
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-delete-icon.png b/documentation/18.11/eiffelstudio/_images/breakpoints-delete-icon.png
new file mode 100644
index 00000000..071e166b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoints-delete-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-delete-icon.png.data b/documentation/18.11/eiffelstudio/_images/breakpoints-delete-icon.png.data
new file mode 100644
index 00000000..b62e76d4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoints-delete-icon.png.data
@@ -0,0 +1,3 @@
+title=breakpoints-delete-icon
+author=admin
+path=content/breakpoints-delete-icon
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter-button.png b/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter-button.png
new file mode 100644
index 00000000..a4196cf0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter-button.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter-button.png.data b/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter-button.png.data
new file mode 100644
index 00000000..5122b028
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter-button.png.data
@@ -0,0 +1,3 @@
+title=breakpoints-list-filter-button
+author=admin
+path=content/breakpoints-list-filter-button
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter.png b/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter.png
new file mode 100644
index 00000000..2e1da125
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter.png.data b/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter.png.data
new file mode 100644
index 00000000..a8989bae
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoints-list-filter.png.data
@@ -0,0 +1,3 @@
+title=breakpoints-list-filter
+author=admin
+path=content/breakpoints-list-filter
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-list-flat.png b/documentation/18.11/eiffelstudio/_images/breakpoints-list-flat.png
new file mode 100644
index 00000000..c6a3e972
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoints-list-flat.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-list-flat.png.data b/documentation/18.11/eiffelstudio/_images/breakpoints-list-flat.png.data
new file mode 100644
index 00000000..1d7c18f4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoints-list-flat.png.data
@@ -0,0 +1,3 @@
+title=breakpoints-list-flat
+author=admin
+path=content/breakpoints-list-flat
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-list.png b/documentation/18.11/eiffelstudio/_images/breakpoints-list.png
new file mode 100644
index 00000000..b49dac1f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/breakpoints-list.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/breakpoints-list.png.data b/documentation/18.11/eiffelstudio/_images/breakpoints-list.png.data
new file mode 100644
index 00000000..bd7f7705
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/breakpoints-list.png.data
@@ -0,0 +1,3 @@
+title=breakpoints-list
+author=admin
+path=content/breakpoints-list
diff --git a/documentation/18.11/eiffelstudio/_images/call-stack-tool-with-threads.png b/documentation/18.11/eiffelstudio/_images/call-stack-tool-with-threads.png
new file mode 100644
index 00000000..f3687128
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/call-stack-tool-with-threads.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/call-stack-tool-with-threads.png.data b/documentation/18.11/eiffelstudio/_images/call-stack-tool-with-threads.png.data
new file mode 100644
index 00000000..9f654c57
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/call-stack-tool-with-threads.png.data
@@ -0,0 +1,3 @@
+title=call-stack-tool-with-threads
+author=admin
+path=content/call-stack-tool-threads
diff --git a/documentation/18.11/eiffelstudio/_images/call-stack-tool.png b/documentation/18.11/eiffelstudio/_images/call-stack-tool.png
new file mode 100644
index 00000000..5ee4a593
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/call-stack-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/call-stack-tool.png.data b/documentation/18.11/eiffelstudio/_images/call-stack-tool.png.data
new file mode 100644
index 00000000..d6323025
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/call-stack-tool.png.data
@@ -0,0 +1,3 @@
+title=call-stack-tool
+author=admin
+path=content/call-stack-tool
diff --git a/documentation/18.11/eiffelstudio/_images/callee-is.jpg b/documentation/18.11/eiffelstudio/_images/callee-is.jpg
new file mode 100644
index 00000000..65a7ef53
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/callee-is.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/callee-is.jpg.data b/documentation/18.11/eiffelstudio/_images/callee-is.jpg.data
new file mode 100644
index 00000000..ae1f3fb4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/callee-is.jpg.data
@@ -0,0 +1,3 @@
+title=callee-is
+author=admin
+path=content/callee
diff --git a/documentation/18.11/eiffelstudio/_images/callstack-active-arrow-icon.png b/documentation/18.11/eiffelstudio/_images/callstack-active-arrow-icon.png
new file mode 100644
index 00000000..5656bba0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/callstack-active-arrow-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/callstack-active-arrow-icon.png.data b/documentation/18.11/eiffelstudio/_images/callstack-active-arrow-icon.png.data
new file mode 100644
index 00000000..dab986e7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/callstack-active-arrow-icon.png.data
@@ -0,0 +1,3 @@
+title=callstack-active-arrow-icon
+author=admin
+path=content/callstack-active-arrow-icon
diff --git a/documentation/18.11/eiffelstudio/_images/callstack-empty-arrow-icon.png b/documentation/18.11/eiffelstudio/_images/callstack-empty-arrow-icon.png
new file mode 100644
index 00000000..f22fe54a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/callstack-empty-arrow-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/callstack-empty-arrow-icon.png.data b/documentation/18.11/eiffelstudio/_images/callstack-empty-arrow-icon.png.data
new file mode 100644
index 00000000..d33df898
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/callstack-empty-arrow-icon.png.data
@@ -0,0 +1,3 @@
+title=callstack-empty-arrow-icon
+author=admin
+path=content/callstack-empty-arrow-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-ancestors-icon.png b/documentation/18.11/eiffelstudio/_images/class-ancestors-icon.png
new file mode 100644
index 00000000..7648c871
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-ancestors-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-ancestors-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-ancestors-icon.png.data
new file mode 100644
index 00000000..eda07ff5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-ancestors-icon.png.data
@@ -0,0 +1,3 @@
+title=class-ancestors-icon
+author=admin
+path=content/class-ancestors-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-clients-icon.png b/documentation/18.11/eiffelstudio/_images/class-clients-icon.png
new file mode 100644
index 00000000..79238ccc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-clients-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-clients-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-clients-icon.png.data
new file mode 100644
index 00000000..46a7acca
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-clients-icon.png.data
@@ -0,0 +1,3 @@
+title=class-clients-icon
+author=admin
+path=content/class-clients-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-deferred-icon.png b/documentation/18.11/eiffelstudio/_images/class-deferred-icon.png
new file mode 100644
index 00000000..d351b236
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-deferred-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-deferred-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-deferred-icon.png.data
new file mode 100644
index 00000000..42a3abf1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-deferred-icon.png.data
@@ -0,0 +1,3 @@
+title=class-deferred-icon
+author=admin
+path=content/class-deferred-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-descendents-icon.png b/documentation/18.11/eiffelstudio/_images/class-descendents-icon.png
new file mode 100644
index 00000000..4d47f951
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-descendents-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-descendents-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-descendents-icon.png.data
new file mode 100644
index 00000000..9fc3bf7a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-descendents-icon.png.data
@@ -0,0 +1,3 @@
+title=class-descendents-icon
+author=admin
+path=content/class-descendents-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-attribute-icon.png b/documentation/18.11/eiffelstudio/_images/class-features-attribute-icon.png
new file mode 100644
index 00000000..ded5bbf9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-features-attribute-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-attribute-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-features-attribute-icon.png.data
new file mode 100644
index 00000000..65cdae0c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-features-attribute-icon.png.data
@@ -0,0 +1,3 @@
+title=class-features-attribute-icon
+author=admin
+path=content/class-features-attribute-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-creator-icon.png b/documentation/18.11/eiffelstudio/_images/class-features-creator-icon.png
new file mode 100644
index 00000000..c0539a1d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-features-creator-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-creator-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-features-creator-icon.png.data
new file mode 100644
index 00000000..4c3e594e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-features-creator-icon.png.data
@@ -0,0 +1,3 @@
+title=class-features-creator-icon
+author=admin
+path=content/class-features-creator-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-deferred-icon.png b/documentation/18.11/eiffelstudio/_images/class-features-deferred-icon.png
new file mode 100644
index 00000000..400a94b5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-features-deferred-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-deferred-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-features-deferred-icon.png.data
new file mode 100644
index 00000000..07c6eccf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-features-deferred-icon.png.data
@@ -0,0 +1,3 @@
+title=class-features-deferred-icon
+author=admin
+path=content/class-features-deferred-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-exported-icon.png b/documentation/18.11/eiffelstudio/_images/class-features-exported-icon.png
new file mode 100644
index 00000000..9b4a23a0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-features-exported-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-exported-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-features-exported-icon.png.data
new file mode 100644
index 00000000..a148cf4d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-features-exported-icon.png.data
@@ -0,0 +1,3 @@
+title=class-features-exported-icon
+author=admin
+path=content/class-features-exported-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-external-icon.png b/documentation/18.11/eiffelstudio/_images/class-features-external-icon.png
new file mode 100644
index 00000000..31b26e17
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-features-external-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-external-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-features-external-icon.png.data
new file mode 100644
index 00000000..d6a1f228
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-features-external-icon.png.data
@@ -0,0 +1,3 @@
+title=class-features-external-icon
+author=admin
+path=content/class-features-external-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-invariant-icon.png b/documentation/18.11/eiffelstudio/_images/class-features-invariant-icon.png
new file mode 100644
index 00000000..fdd97ec2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-features-invariant-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-invariant-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-features-invariant-icon.png.data
new file mode 100644
index 00000000..2b4bfe2f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-features-invariant-icon.png.data
@@ -0,0 +1,3 @@
+title=class-features-invariant-icon
+author=admin
+path=content/class-features-invariant-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-once-icon.png b/documentation/18.11/eiffelstudio/_images/class-features-once-icon.png
new file mode 100644
index 00000000..748258f9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-features-once-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-once-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-features-once-icon.png.data
new file mode 100644
index 00000000..2a95a8ca
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-features-once-icon.png.data
@@ -0,0 +1,3 @@
+title=class-features-once-icon
+author=admin
+path=content/class-features-once-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-routine-icon.png b/documentation/18.11/eiffelstudio/_images/class-features-routine-icon.png
new file mode 100644
index 00000000..9f4d073a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-features-routine-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-features-routine-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-features-routine-icon.png.data
new file mode 100644
index 00000000..06d793ca
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-features-routine-icon.png.data
@@ -0,0 +1,3 @@
+title=class-features-routine-icon
+author=admin
+path=content/class-features-routine-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-format-bar.png b/documentation/18.11/eiffelstudio/_images/class-format-bar.png
new file mode 100644
index 00000000..c4590f09
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-format-bar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-format-bar.png.data b/documentation/18.11/eiffelstudio/_images/class-format-bar.png.data
new file mode 100644
index 00000000..f5ce78d7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-format-bar.png.data
@@ -0,0 +1,3 @@
+title=class-format-bar
+author=admin
+path=content/class-format-bar
diff --git a/documentation/18.11/eiffelstudio/_images/class-frozen-icon.png b/documentation/18.11/eiffelstudio/_images/class-frozen-icon.png
new file mode 100644
index 00000000..409cf9d8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-frozen-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-frozen-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-frozen-icon.png.data
new file mode 100644
index 00000000..79bf3e5f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-frozen-icon.png.data
@@ -0,0 +1,3 @@
+title=class-frozen-icon
+author=admin
+path=content/class-frozen-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-hie.jpg b/documentation/18.11/eiffelstudio/_images/class-hie.jpg
new file mode 100644
index 00000000..b1858a59
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-hie.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-hie.jpg.data b/documentation/18.11/eiffelstudio/_images/class-hie.jpg.data
new file mode 100644
index 00000000..c4514db1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-hie.jpg.data
@@ -0,0 +1,3 @@
+title=class-hie
+author=admin
+path=content/class-hie
diff --git a/documentation/18.11/eiffelstudio/_images/class-mini-format-bar.png b/documentation/18.11/eiffelstudio/_images/class-mini-format-bar.png
new file mode 100644
index 00000000..1f2c0924
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-mini-format-bar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-mini-format-bar.png.data b/documentation/18.11/eiffelstudio/_images/class-mini-format-bar.png.data
new file mode 100644
index 00000000..475f8f71
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-mini-format-bar.png.data
@@ -0,0 +1,3 @@
+title=class-mini-format-bar
+author=admin
+path=content/class-mini-format-bar
diff --git a/documentation/18.11/eiffelstudio/_images/class-normal-icon.png b/documentation/18.11/eiffelstudio/_images/class-normal-icon.png
new file mode 100644
index 00000000..d269b1b2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-normal-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-normal-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-normal-icon.png.data
new file mode 100644
index 00000000..c599113e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-normal-icon.png.data
@@ -0,0 +1,3 @@
+title=class-normal-icon
+author=admin
+path=content/class-normal-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-override-normal-icon.png b/documentation/18.11/eiffelstudio/_images/class-override-normal-icon.png
new file mode 100644
index 00000000..1d89d80c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-override-normal-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-override-normal-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-override-normal-icon.png.data
new file mode 100644
index 00000000..34d76923
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-override-normal-icon.png.data
@@ -0,0 +1,3 @@
+title=class-override-normal-icon
+author=admin
+path=content/class-override-normal-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-overriden-normal-icon.png b/documentation/18.11/eiffelstudio/_images/class-overriden-normal-icon.png
new file mode 100644
index 00000000..336bbe48
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-overriden-normal-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-overriden-normal-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-overriden-normal-icon.png.data
new file mode 100644
index 00000000..8479c24f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-overriden-normal-icon.png.data
@@ -0,0 +1,3 @@
+title=class-overriden-normal-icon
+author=admin
+path=content/class-overriden-normal-icon
diff --git a/documentation/18.11/eiffelstudio/_images/class-supliers-icon.png b/documentation/18.11/eiffelstudio/_images/class-supliers-icon.png
new file mode 100644
index 00000000..1cfcbb9a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/class-supliers-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/class-supliers-icon.png.data b/documentation/18.11/eiffelstudio/_images/class-supliers-icon.png.data
new file mode 100644
index 00000000..4222442a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/class-supliers-icon.png.data
@@ -0,0 +1,3 @@
+title=class-supliers-icon
+author=admin
+path=content/class-supliers-icon
diff --git a/documentation/18.11/eiffelstudio/_images/clean_compile_dialog.png b/documentation/18.11/eiffelstudio/_images/clean_compile_dialog.png
new file mode 100644
index 00000000..b751a80f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/clean_compile_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/clean_compile_dialog.png.data b/documentation/18.11/eiffelstudio/_images/clean_compile_dialog.png.data
new file mode 100644
index 00000000..86f762dd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/clean_compile_dialog.png.data
@@ -0,0 +1,3 @@
+title=clean compile dialog
+author=halw
+path=content/clean-compile-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/close-icon.png b/documentation/18.11/eiffelstudio/_images/close-icon.png
new file mode 100644
index 00000000..c4cac921
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/close-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/close-icon.png.data b/documentation/18.11/eiffelstudio/_images/close-icon.png.data
new file mode 100644
index 00000000..5ec9d881
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/close-icon.png.data
@@ -0,0 +1,3 @@
+title=close-icon
+author=halw
+path=content/close-icon
diff --git a/documentation/18.11/eiffelstudio/_images/cluster-legend.png b/documentation/18.11/eiffelstudio/_images/cluster-legend.png
new file mode 100644
index 00000000..bfc0f89f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/cluster-legend.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/cluster-legend.png.data b/documentation/18.11/eiffelstudio/_images/cluster-legend.png.data
new file mode 100644
index 00000000..a4ead217
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/cluster-legend.png.data
@@ -0,0 +1,3 @@
+title=cluster-legend
+author=admin
+path=content/cluster-legend
diff --git a/documentation/18.11/eiffelstudio/_images/cluster-tree.png b/documentation/18.11/eiffelstudio/_images/cluster-tree.png
new file mode 100644
index 00000000..3645bec7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/cluster-tree.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/cluster-tree.png.data b/documentation/18.11/eiffelstudio/_images/cluster-tree.png.data
new file mode 100644
index 00000000..dfe019a4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/cluster-tree.png.data
@@ -0,0 +1,3 @@
+title=cluster-tree
+author=admin
+path=content/cluster-tree
diff --git a/documentation/18.11/eiffelstudio/_images/color-dialog-windows.png b/documentation/18.11/eiffelstudio/_images/color-dialog-windows.png
new file mode 100644
index 00000000..05f535e2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/color-dialog-windows.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/color-dialog-windows.png.data b/documentation/18.11/eiffelstudio/_images/color-dialog-windows.png.data
new file mode 100644
index 00000000..acf62bfc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/color-dialog-windows.png.data
@@ -0,0 +1,3 @@
+title=color-dialog-windows
+author=admin
+path=content/color-dialog-windows
diff --git a/documentation/18.11/eiffelstudio/_images/command-error-info-icon.png b/documentation/18.11/eiffelstudio/_images/command-error-info-icon.png
new file mode 100644
index 00000000..fa393149
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/command-error-info-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/command-error-info-icon.png.data b/documentation/18.11/eiffelstudio/_images/command-error-info-icon.png.data
new file mode 100644
index 00000000..c500d86a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/command-error-info-icon.png.data
@@ -0,0 +1,3 @@
+title=command-error-info-icon
+author=admin
+path=content/command-error-info-icon
diff --git a/documentation/18.11/eiffelstudio/_images/command-send-to-external-editor-icon.png b/documentation/18.11/eiffelstudio/_images/command-send-to-external-editor-icon.png
new file mode 100644
index 00000000..3363cbd1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/command-send-to-external-editor-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/command-send-to-external-editor-icon.png.data b/documentation/18.11/eiffelstudio/_images/command-send-to-external-editor-icon.png.data
new file mode 100644
index 00000000..a6ba7bc1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/command-send-to-external-editor-icon.png.data
@@ -0,0 +1,3 @@
+title=command-send-to-external-editor-icon
+author=admin
+path=content/command-send-external-editor-icon
diff --git a/documentation/18.11/eiffelstudio/_images/compile-animation-6-icon.png b/documentation/18.11/eiffelstudio/_images/compile-animation-6-icon.png
new file mode 100644
index 00000000..7ed09652
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/compile-animation-6-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/compile-animation-6-icon.png.data b/documentation/18.11/eiffelstudio/_images/compile-animation-6-icon.png.data
new file mode 100644
index 00000000..57671b00
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/compile-animation-6-icon.png.data
@@ -0,0 +1,3 @@
+title=compile-animation-6-icon
+author=admin
+path=content/compile-animation-6-icon
diff --git a/documentation/18.11/eiffelstudio/_images/compile-button-dropdown.png b/documentation/18.11/eiffelstudio/_images/compile-button-dropdown.png
new file mode 100644
index 00000000..35659bfc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/compile-button-dropdown.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/compile-button-dropdown.png.data b/documentation/18.11/eiffelstudio/_images/compile-button-dropdown.png.data
new file mode 100644
index 00000000..d8efe823
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/compile-button-dropdown.png.data
@@ -0,0 +1,3 @@
+title=compile-button-dropdown
+author=halw
+path=content/compile-button-dropdown
diff --git a/documentation/18.11/eiffelstudio/_images/compile-button.png b/documentation/18.11/eiffelstudio/_images/compile-button.png
new file mode 100644
index 00000000..d9d84efa
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/compile-button.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/compile-button.png.data b/documentation/18.11/eiffelstudio/_images/compile-button.png.data
new file mode 100644
index 00000000..c0cf0f00
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/compile-button.png.data
@@ -0,0 +1,3 @@
+title=compile-button
+author=halw
+path=content/compile-button
diff --git a/documentation/18.11/eiffelstudio/_images/compile-error-icon.png b/documentation/18.11/eiffelstudio/_images/compile-error-icon.png
new file mode 100644
index 00000000..9fb4f4fd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/compile-error-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/compile-error-icon.png.data b/documentation/18.11/eiffelstudio/_images/compile-error-icon.png.data
new file mode 100644
index 00000000..fae4c3f1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/compile-error-icon.png.data
@@ -0,0 +1,3 @@
+title=compile-error-icon
+author=admin
+path=content/compile-error-icon
diff --git a/documentation/18.11/eiffelstudio/_images/compile-success-icon.png b/documentation/18.11/eiffelstudio/_images/compile-success-icon.png
new file mode 100644
index 00000000..1306dfa4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/compile-success-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/compile-success-icon.png.data b/documentation/18.11/eiffelstudio/_images/compile-success-icon.png.data
new file mode 100644
index 00000000..caf1e57e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/compile-success-icon.png.data
@@ -0,0 +1,3 @@
+title=compile-success-icon
+author=admin
+path=content/compile-success-icon
diff --git a/documentation/18.11/eiffelstudio/_images/console-auto1.jpg b/documentation/18.11/eiffelstudio/_images/console-auto1.jpg
new file mode 100644
index 00000000..d35622e4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/console-auto1.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/console-auto1.jpg.data b/documentation/18.11/eiffelstudio/_images/console-auto1.jpg.data
new file mode 100644
index 00000000..5ad04598
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/console-auto1.jpg.data
@@ -0,0 +1,3 @@
+title=console-auto1
+author=admin
+path=content/console-auto1
diff --git a/documentation/18.11/eiffelstudio/_images/console-auto2.jpg b/documentation/18.11/eiffelstudio/_images/console-auto2.jpg
new file mode 100644
index 00000000..74198a96
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/console-auto2.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/console-auto2.jpg.data b/documentation/18.11/eiffelstudio/_images/console-auto2.jpg.data
new file mode 100644
index 00000000..00e1ab9a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/console-auto2.jpg.data
@@ -0,0 +1,3 @@
+title=console-auto2
+author=admin
+path=content/console-auto2
diff --git a/documentation/18.11/eiffelstudio/_images/console-auto3.jpg b/documentation/18.11/eiffelstudio/_images/console-auto3.jpg
new file mode 100644
index 00000000..7f7ca2c8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/console-auto3.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/console-auto3.jpg.data b/documentation/18.11/eiffelstudio/_images/console-auto3.jpg.data
new file mode 100644
index 00000000..e0aa3e34
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/console-auto3.jpg.data
@@ -0,0 +1,3 @@
+title=console-auto3
+author=admin
+path=content/console-auto3
diff --git a/documentation/18.11/eiffelstudio/_images/console1.png b/documentation/18.11/eiffelstudio/_images/console1.png
new file mode 100644
index 00000000..ba6fd87c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/console1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/console1.png.data b/documentation/18.11/eiffelstudio/_images/console1.png.data
new file mode 100644
index 00000000..3489877d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/console1.png.data
@@ -0,0 +1,3 @@
+title=console1
+author=admin
+path=content/console1
diff --git a/documentation/18.11/eiffelstudio/_images/context-address-bar.png b/documentation/18.11/eiffelstudio/_images/context-address-bar.png
new file mode 100644
index 00000000..1f48553b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/context-address-bar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/context-address-bar.png.data b/documentation/18.11/eiffelstudio/_images/context-address-bar.png.data
new file mode 100644
index 00000000..f1fdba7a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/context-address-bar.png.data
@@ -0,0 +1,3 @@
+title=context-address-bar
+author=admin
+path=content/context-address-bar
diff --git a/documentation/18.11/eiffelstudio/_images/context-address-window.png b/documentation/18.11/eiffelstudio/_images/context-address-window.png
new file mode 100644
index 00000000..fa46f2ee
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/context-address-window.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/context-address-window.png.data b/documentation/18.11/eiffelstudio/_images/context-address-window.png.data
new file mode 100644
index 00000000..7ee99370
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/context-address-window.png.data
@@ -0,0 +1,3 @@
+title=context-address-window
+author=admin
+path=content/context-address-window
diff --git a/documentation/18.11/eiffelstudio/_images/context-class-cursor_0.png b/documentation/18.11/eiffelstudio/_images/context-class-cursor_0.png
new file mode 100644
index 00000000..fc7f7ac5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/context-class-cursor_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/context-class-cursor_0.png.data b/documentation/18.11/eiffelstudio/_images/context-class-cursor_0.png.data
new file mode 100644
index 00000000..35de7828
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/context-class-cursor_0.png.data
@@ -0,0 +1,3 @@
+title=context-class-cursor
+author=halw
+path=content/context-class-cursor
diff --git a/documentation/18.11/eiffelstudio/_images/context-dialog-class.png b/documentation/18.11/eiffelstudio/_images/context-dialog-class.png
new file mode 100644
index 00000000..97d7142c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/context-dialog-class.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/context-dialog-class.png.data b/documentation/18.11/eiffelstudio/_images/context-dialog-class.png.data
new file mode 100644
index 00000000..86d40395
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/context-dialog-class.png.data
@@ -0,0 +1,3 @@
+title=context-dialog-class
+author=admin
+path=content/context-dialog-class
diff --git a/documentation/18.11/eiffelstudio/_images/context-dialog-cluster.png b/documentation/18.11/eiffelstudio/_images/context-dialog-cluster.png
new file mode 100644
index 00000000..63375a1b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/context-dialog-cluster.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/context-dialog-cluster.png.data b/documentation/18.11/eiffelstudio/_images/context-dialog-cluster.png.data
new file mode 100644
index 00000000..3d32e47c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/context-dialog-cluster.png.data
@@ -0,0 +1,3 @@
+title=context-dialog-cluster
+author=admin
+path=content/context-dialog-cluster
diff --git a/documentation/18.11/eiffelstudio/_images/context-disabled-class-cursor_2.png b/documentation/18.11/eiffelstudio/_images/context-disabled-class-cursor_2.png
new file mode 100644
index 00000000..85479182
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/context-disabled-class-cursor_2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/context-disabled-class-cursor_2.png.data b/documentation/18.11/eiffelstudio/_images/context-disabled-class-cursor_2.png.data
new file mode 100644
index 00000000..c6e9e30c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/context-disabled-class-cursor_2.png.data
@@ -0,0 +1,3 @@
+title=context-disabled-class-cursor
+author=halw
+path=content/context-disabled-class-cursor
diff --git a/documentation/18.11/eiffelstudio/_images/context-link-icon.png b/documentation/18.11/eiffelstudio/_images/context-link-icon.png
new file mode 100644
index 00000000..a794d906
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/context-link-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/context-link-icon.png.data b/documentation/18.11/eiffelstudio/_images/context-link-icon.png.data
new file mode 100644
index 00000000..b74f708e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/context-link-icon.png.data
@@ -0,0 +1,3 @@
+title=context-link-icon
+author=admin
+path=content/context-link-icon
diff --git a/documentation/18.11/eiffelstudio/_images/context-sync-icon.png b/documentation/18.11/eiffelstudio/_images/context-sync-icon.png
new file mode 100644
index 00000000..c8ffa1cc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/context-sync-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/context-sync-icon.png.data b/documentation/18.11/eiffelstudio/_images/context-sync-icon.png.data
new file mode 100644
index 00000000..ca91bd57
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/context-sync-icon.png.data
@@ -0,0 +1,3 @@
+title=context-sync-icon
+author=admin
+path=content/context-sync-icon
diff --git a/documentation/18.11/eiffelstudio/_images/continued-icon.png b/documentation/18.11/eiffelstudio/_images/continued-icon.png
new file mode 100644
index 00000000..9aabb621
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/continued-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/continued-icon.png.data b/documentation/18.11/eiffelstudio/_images/continued-icon.png.data
new file mode 100644
index 00000000..32e80176
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/continued-icon.png.data
@@ -0,0 +1,3 @@
+title=continued-icon
+author=halw
+path=content/continued-icon
diff --git a/documentation/18.11/eiffelstudio/_images/contract-editor-edit-icon.png b/documentation/18.11/eiffelstudio/_images/contract-editor-edit-icon.png
new file mode 100644
index 00000000..4c8bd978
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/contract-editor-edit-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/contract-editor-edit-icon.png.data b/documentation/18.11/eiffelstudio/_images/contract-editor-edit-icon.png.data
new file mode 100644
index 00000000..b10a36a6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/contract-editor-edit-icon.png.data
@@ -0,0 +1,3 @@
+title=contract-editor-edit-icon
+author=halw
+path=content/contract-editor-edit-icon
diff --git a/documentation/18.11/eiffelstudio/_images/contract-icon.png b/documentation/18.11/eiffelstudio/_images/contract-icon.png
new file mode 100644
index 00000000..d9dd26d8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/contract-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/contract-icon.png.data b/documentation/18.11/eiffelstudio/_images/contract-icon.png.data
new file mode 100644
index 00000000..87ced1b3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/contract-icon.png.data
@@ -0,0 +1,3 @@
+title=contract-icon
+author=halw
+path=content/contract-icon
diff --git a/documentation/18.11/eiffelstudio/_images/create-a-project.png b/documentation/18.11/eiffelstudio/_images/create-a-project.png
new file mode 100644
index 00000000..33d4a330
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/create-a-project.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/create-a-project.png.data b/documentation/18.11/eiffelstudio/_images/create-a-project.png.data
new file mode 100644
index 00000000..0e197699
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/create-a-project.png.data
@@ -0,0 +1,3 @@
+title=create-a-project
+author=admin
+path=content/create-project
diff --git a/documentation/18.11/eiffelstudio/_images/debug-exception-dialog-icon.png b/documentation/18.11/eiffelstudio/_images/debug-exception-dialog-icon.png
new file mode 100644
index 00000000..dc788b0f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-exception-dialog-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-exception-dialog-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-exception-dialog-icon.png.data
new file mode 100644
index 00000000..6a6fd7ba
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-exception-dialog-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-exception-dialog-icon
+author=admin
+path=content/debug-exception-dialog-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-options.png b/documentation/18.11/eiffelstudio/_images/debug-options.png
new file mode 100644
index 00000000..50e4b922
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-options.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-options.png.data b/documentation/18.11/eiffelstudio/_images/debug-options.png.data
new file mode 100644
index 00000000..a509b487
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-options.png.data
@@ -0,0 +1,3 @@
+title=debug-options
+author=admin
+path=content/debug-options
diff --git a/documentation/18.11/eiffelstudio/_images/debug-pause-icon.png b/documentation/18.11/eiffelstudio/_images/debug-pause-icon.png
new file mode 100644
index 00000000..b5ff990a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-pause-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-pause-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-pause-icon.png.data
new file mode 100644
index 00000000..91ef6199
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-pause-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-pause-icon
+author=admin
+path=content/debug-pause-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-run-finalized-icon.png b/documentation/18.11/eiffelstudio/_images/debug-run-finalized-icon.png
new file mode 100644
index 00000000..f457a5cc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-run-finalized-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-run-finalized-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-run-finalized-icon.png.data
new file mode 100644
index 00000000..581466db
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-run-finalized-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-run-finalized-icon
+author=admin
+path=content/debug-run-finalized-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-run-icon.png b/documentation/18.11/eiffelstudio/_images/debug-run-icon.png
new file mode 100644
index 00000000..c19fa0fb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-run-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-run-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-run-icon.png.data
new file mode 100644
index 00000000..ab083fed
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-run-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-run-icon
+author=admin
+path=content/debug-run-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-run-without-breakpoint-icon.png b/documentation/18.11/eiffelstudio/_images/debug-run-without-breakpoint-icon.png
new file mode 100644
index 00000000..424bd08a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-run-without-breakpoint-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-run-without-breakpoint-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-run-without-breakpoint-icon.png.data
new file mode 100644
index 00000000..5bea7e73
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-run-without-breakpoint-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-run-without-breakpoint-icon
+author=admin
+path=content/debug-run-without-breakpoint-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-show-breakpoints-tool.png b/documentation/18.11/eiffelstudio/_images/debug-show-breakpoints-tool.png
new file mode 100644
index 00000000..57749f8e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-show-breakpoints-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-show-breakpoints-tool.png.data b/documentation/18.11/eiffelstudio/_images/debug-show-breakpoints-tool.png.data
new file mode 100644
index 00000000..d2ac1719
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-show-breakpoints-tool.png.data
@@ -0,0 +1,3 @@
+title=debug-show-breakpoints-tool
+author=halw
+path=content/debug-show-breakpoints-tool
diff --git a/documentation/18.11/eiffelstudio/_images/debug-step-into-icon.png b/documentation/18.11/eiffelstudio/_images/debug-step-into-icon.png
new file mode 100644
index 00000000..93bedf88
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-step-into-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-step-into-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-step-into-icon.png.data
new file mode 100644
index 00000000..d83d3eba
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-step-into-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-step-into-icon
+author=admin
+path=content/debug-step-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-step-out-icon.png b/documentation/18.11/eiffelstudio/_images/debug-step-out-icon.png
new file mode 100644
index 00000000..3debd7af
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-step-out-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-step-out-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-step-out-icon.png.data
new file mode 100644
index 00000000..920ec253
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-step-out-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-step-out-icon
+author=admin
+path=content/debug-step-out-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-step-over-icon.png b/documentation/18.11/eiffelstudio/_images/debug-step-over-icon.png
new file mode 100644
index 00000000..f1918233
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-step-over-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-step-over-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-step-over-icon.png.data
new file mode 100644
index 00000000..bbd4f7f3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-step-over-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-step-over-icon
+author=admin
+path=content/debug-step-over-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-stop-icon.png b/documentation/18.11/eiffelstudio/_images/debug-stop-icon.png
new file mode 100644
index 00000000..8120249f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-stop-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-stop-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-stop-icon.png.data
new file mode 100644
index 00000000..eb89d19c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-stop-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-stop-icon
+author=admin
+path=content/debug-stop-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debug-stopped-on-breakpoint-icon.png b/documentation/18.11/eiffelstudio/_images/debug-stopped-on-breakpoint-icon.png
new file mode 100644
index 00000000..0ede1b24
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debug-stopped-on-breakpoint-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debug-stopped-on-breakpoint-icon.png.data b/documentation/18.11/eiffelstudio/_images/debug-stopped-on-breakpoint-icon.png.data
new file mode 100644
index 00000000..4412741f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debug-stopped-on-breakpoint-icon.png.data
@@ -0,0 +1,3 @@
+title=debug-stopped-on-breakpoint-icon
+author=halw
+path=content/debug-stopped-breakpoint-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-load.png b/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-load.png
new file mode 100644
index 00000000..e7165155
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-load.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-load.png.data b/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-load.png.data
new file mode 100644
index 00000000..0ff3a76b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-load.png.data
@@ -0,0 +1,3 @@
+title=debuggee-object-storage-load
+author=admin
+path=content/debuggee-object-storage-load
diff --git a/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-save.png b/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-save.png
new file mode 100644
index 00000000..781f7f05
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-save.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-save.png.data b/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-save.png.data
new file mode 100644
index 00000000..4439a622
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debuggee-object-storage-save.png.data
@@ -0,0 +1,3 @@
+title=debuggee-object-storage-save
+author=admin
+path=content/debuggee-object-storage-save
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-auto-values.png b/documentation/18.11/eiffelstudio/_images/debugger-auto-values.png
new file mode 100644
index 00000000..bfc8a520
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-auto-values.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-auto-values.png.data b/documentation/18.11/eiffelstudio/_images/debugger-auto-values.png.data
new file mode 100644
index 00000000..eba2a92e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-auto-values.png.data
@@ -0,0 +1,3 @@
+title=debugger-auto-values
+author=admin
+path=content/debugger-auto-values
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-callstack-depth-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-callstack-depth-icon.png
new file mode 100644
index 00000000..a5e719b2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-callstack-depth-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-callstack-depth-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-callstack-depth-icon.png.data
new file mode 100644
index 00000000..3359cb69
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-callstack-depth-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-callstack-depth-icon
+author=admin
+path=content/debugger-callstack-depth-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-expand-info-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-expand-info-icon.png
new file mode 100644
index 00000000..0dfd5549
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-expand-info-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-expand-info-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-expand-info-icon.png.data
new file mode 100644
index 00000000..3f715887
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-expand-info-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-expand-info-icon
+author=admin
+path=content/debugger-expand-info-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-icon.png
new file mode 100644
index 00000000..7ac5d567
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-icon.png.data
new file mode 100644
index 00000000..60b8ee06
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-object-dotnet-icon
+author=admin
+path=content/debugger-object-dotnet-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-static-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-static-icon.png
new file mode 100644
index 00000000..f048aef9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-static-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-static-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-static-icon.png.data
new file mode 100644
index 00000000..7a372480
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-object-dotnet-static-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-object-dotnet-static-icon
+author=admin
+path=content/debugger-object-dotnet-static-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-eiffel-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-object-eiffel-icon.png
new file mode 100644
index 00000000..34b7adc8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-object-eiffel-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-eiffel-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-object-eiffel-icon.png.data
new file mode 100644
index 00000000..905f1624
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-object-eiffel-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-object-eiffel-icon
+author=admin
+path=content/debugger-object-eiffel-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-expand-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-object-expand-icon.png
new file mode 100644
index 00000000..021dfd40
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-object-expand-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-expand-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-object-expand-icon.png.data
new file mode 100644
index 00000000..69ddef16
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-object-expand-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-object-expand-icon
+author=admin
+path=content/debugger-object-expand-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-expanded-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-object-expanded-icon.png
new file mode 100644
index 00000000..27ce4f5f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-object-expanded-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-expanded-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-object-expanded-icon.png.data
new file mode 100644
index 00000000..458224c1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-object-expanded-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-object-expanded-icon
+author=admin
+path=content/debugger-object-expanded-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-immediate-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-object-immediate-icon.png
new file mode 100644
index 00000000..f69d8d31
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-object-immediate-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-immediate-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-object-immediate-icon.png.data
new file mode 100644
index 00000000..21e37241
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-object-immediate-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-object-immediate-icon
+author=admin
+path=content/debugger-object-immediate-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-static-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-object-static-icon.png
new file mode 100644
index 00000000..dd095688
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-object-static-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-static-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-object-static-icon.png.data
new file mode 100644
index 00000000..8a6a15de
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-object-static-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-object-static-icon
+author=admin
+path=content/debugger-object-static-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-void-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-object-void-icon.png
new file mode 100644
index 00000000..3f8440b7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-object-void-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-object-void-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-object-void-icon.png.data
new file mode 100644
index 00000000..640623f5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-object-void-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-object-void-icon
+author=admin
+path=content/debugger-object-void-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-set-sizes-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-set-sizes-icon.png
new file mode 100644
index 00000000..4ea36d5e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-set-sizes-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-set-sizes-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-set-sizes-icon.png.data
new file mode 100644
index 00000000..b160d4ce
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-set-sizes-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-set-sizes-icon
+author=admin
+path=content/debugger-set-sizes-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-show-hex-value-icon.png b/documentation/18.11/eiffelstudio/_images/debugger-show-hex-value-icon.png
new file mode 100644
index 00000000..46ba2005
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugger-show-hex-value-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugger-show-hex-value-icon.png.data b/documentation/18.11/eiffelstudio/_images/debugger-show-hex-value-icon.png.data
new file mode 100644
index 00000000..4d6466b7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugger-show-hex-value-icon.png.data
@@ -0,0 +1,3 @@
+title=debugger-show-hex-value-icon
+author=admin
+path=content/debugger-show-hex-value-icon
diff --git a/documentation/18.11/eiffelstudio/_images/debugging-tools-preferences.png b/documentation/18.11/eiffelstudio/_images/debugging-tools-preferences.png
new file mode 100644
index 00000000..cabf2b88
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/debugging-tools-preferences.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/debugging-tools-preferences.png.data b/documentation/18.11/eiffelstudio/_images/debugging-tools-preferences.png.data
new file mode 100644
index 00000000..e553087d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/debugging-tools-preferences.png.data
@@ -0,0 +1,3 @@
+title=debugging-tools-preferences
+author=admin
+path=content/debugging-tools-preferences
diff --git a/documentation/18.11/eiffelstudio/_images/deselect-all.png b/documentation/18.11/eiffelstudio/_images/deselect-all.png
new file mode 100644
index 00000000..3811e88b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/deselect-all.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/deselect-all.png.data b/documentation/18.11/eiffelstudio/_images/deselect-all.png.data
new file mode 100644
index 00000000..98ffc028
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/deselect-all.png.data
@@ -0,0 +1,3 @@
+title=deselect-all
+author=admin
+path=content/deselect-all
diff --git a/documentation/18.11/eiffelstudio/_images/deselect-recalculatable.png b/documentation/18.11/eiffelstudio/_images/deselect-recalculatable.png
new file mode 100644
index 00000000..0dc43769
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/deselect-recalculatable.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/deselect-recalculatable.png.data b/documentation/18.11/eiffelstudio/_images/deselect-recalculatable.png.data
new file mode 100644
index 00000000..c8a7d2a9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/deselect-recalculatable.png.data
@@ -0,0 +1,3 @@
+title=deselect-recalculatable
+author=admin
+path=content/deselect-recalculatable
diff --git a/documentation/18.11/eiffelstudio/_images/devel-diagram.png b/documentation/18.11/eiffelstudio/_images/devel-diagram.png
new file mode 100644
index 00000000..7bfa0e0d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/devel-diagram.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/devel-diagram.png.data b/documentation/18.11/eiffelstudio/_images/devel-diagram.png.data
new file mode 100644
index 00000000..2b2f87ae
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/devel-diagram.png.data
@@ -0,0 +1,3 @@
+title=devel-diagram
+author=admin
+path=content/devel-diagram
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-anchor-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-anchor-icon.png
new file mode 100644
index 00000000..0f5cd3f5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-anchor-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-anchor-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-anchor-icon.png.data
new file mode 100644
index 00000000..c609d16b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-anchor-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-anchor-icon
+author=admin
+path=content/diagram-anchor-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-choose-color-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-choose-color-icon.png
new file mode 100644
index 00000000..05f61449
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-choose-color-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-choose-color-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-choose-color-icon.png.data
new file mode 100644
index 00000000..268c3624
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-choose-color-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-choose-color-icon
+author=admin
+path=content/diagram-choose-color-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-defaultview.png b/documentation/18.11/eiffelstudio/_images/diagram-defaultview.png
new file mode 100644
index 00000000..dd690b1f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-defaultview.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-defaultview.png.data b/documentation/18.11/eiffelstudio/_images/diagram-defaultview.png.data
new file mode 100644
index 00000000..1d714aab
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-defaultview.png.data
@@ -0,0 +1,3 @@
+title=diagram-defaultview
+author=admin
+path=content/diagram-defaultview
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-depth-of-relations-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-depth-of-relations-icon.png
new file mode 100644
index 00000000..49aa6ca8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-depth-of-relations-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-depth-of-relations-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-depth-of-relations-icon.png.data
new file mode 100644
index 00000000..900e159f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-depth-of-relations-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-depth-of-relations-icon
+author=admin
+path=content/diagram-depth-relations-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-export-to-png-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-export-to-png-icon.png
new file mode 100644
index 00000000..a11274d8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-export-to-png-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-export-to-png-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-export-to-png-icon.png.data
new file mode 100644
index 00000000..262fda2d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-export-to-png-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-export-to-png-icon
+author=admin
+path=content/diagram-export-png-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-fill-cluster-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-fill-cluster-icon.png
new file mode 100644
index 00000000..a89c2211
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-fill-cluster-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-fill-cluster-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-fill-cluster-icon.png.data
new file mode 100644
index 00000000..28a13566
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-fill-cluster-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-fill-cluster-icon
+author=admin
+path=content/diagram-fill-cluster-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-fit-to-screen-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-fit-to-screen-icon.png
new file mode 100644
index 00000000..e43d03f7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-fit-to-screen-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-fit-to-screen-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-fit-to-screen-icon.png.data
new file mode 100644
index 00000000..ad0a7722
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-fit-to-screen-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-fit-to-screen-icon
+author=admin
+path=content/diagram-fit-screen-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-force-right-angles-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-force-right-angles-icon.png
new file mode 100644
index 00000000..ff1174b2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-force-right-angles-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-force-right-angles-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-force-right-angles-icon.png.data
new file mode 100644
index 00000000..87bb6b00
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-force-right-angles-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-force-right-angles-icon
+author=admin
+path=content/diagram-force-right-angles-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-inheritance-link-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-inheritance-link-icon.png
new file mode 100644
index 00000000..267f832a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-inheritance-link-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-inheritance-link-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-inheritance-link-icon.png.data
new file mode 100644
index 00000000..8d214c9c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-inheritance-link-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-inheritance-link-icon
+author=admin
+path=content/diagram-inheritance-link-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-myview.png b/documentation/18.11/eiffelstudio/_images/diagram-myview.png
new file mode 100644
index 00000000..0e1cac92
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-myview.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-myview.png.data b/documentation/18.11/eiffelstudio/_images/diagram-myview.png.data
new file mode 100644
index 00000000..f4e66a38
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-myview.png.data
@@ -0,0 +1,3 @@
+title=diagram-myview
+author=admin
+path=content/diagram-myview
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-new-conforming-inheritance-link-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-new-conforming-inheritance-link-icon.png
new file mode 100644
index 00000000..e2dc666f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-new-conforming-inheritance-link-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-new-conforming-inheritance-link-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-new-conforming-inheritance-link-icon.png.data
new file mode 100644
index 00000000..da1feb3d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-new-conforming-inheritance-link-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-new-conforming-inheritance-link-icon
+author=halw
+path=content/diagram-new-conforming-inheritance-link-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-new-supplier-link-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-new-supplier-link-icon.png
new file mode 100644
index 00000000..276508db
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-new-supplier-link-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-new-supplier-link-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-new-supplier-link-icon.png.data
new file mode 100644
index 00000000..d225cff8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-new-supplier-link-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-new-supplier-link-icon
+author=halw
+path=content/diagram-new-supplier-link-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-physics-settings-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-physics-settings-icon.png
new file mode 100644
index 00000000..83f3582f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-physics-settings-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-physics-settings-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-physics-settings-icon.png.data
new file mode 100644
index 00000000..50bc15eb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-physics-settings-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-physics-settings-icon
+author=admin
+path=content/diagram-physics-settings-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-show-labels-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-show-labels-icon.png
new file mode 100644
index 00000000..34140a8d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-show-labels-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-show-labels-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-show-labels-icon.png.data
new file mode 100644
index 00000000..1eb290cb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-show-labels-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-show-labels-icon
+author=admin
+path=content/diagram-show-labels-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-show-legend-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-show-legend-icon.png
new file mode 100644
index 00000000..95bdeacc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-show-legend-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-show-legend-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-show-legend-icon.png.data
new file mode 100644
index 00000000..9820a0eb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-show-legend-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-show-legend-icon
+author=admin
+path=content/diagram-show-legend-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-supplier-link-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-supplier-link-icon.png
new file mode 100644
index 00000000..fe4125b2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-supplier-link-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-supplier-link-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-supplier-link-icon.png.data
new file mode 100644
index 00000000..14a4cb08
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-supplier-link-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-supplier-link-icon
+author=admin
+path=content/diagram-supplier-link-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-target-cluster-or-class-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-target-cluster-or-class-icon.png
new file mode 100644
index 00000000..0b902e4e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-target-cluster-or-class-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-target-cluster-or-class-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-target-cluster-or-class-icon.png.data
new file mode 100644
index 00000000..1597da1c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-target-cluster-or-class-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-target-cluster-or-class-icon
+author=admin
+path=content/diagram-target-cluster-or-class-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-toggle-quality-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-toggle-quality-icon.png
new file mode 100644
index 00000000..a3e92fae
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-toggle-quality-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-toggle-quality-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-toggle-quality-icon.png.data
new file mode 100644
index 00000000..5bbe6ba1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-toggle-quality-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-toggle-quality-icon
+author=admin
+path=content/diagram-toggle-quality-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-toogle-physics-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-toogle-physics-icon.png
new file mode 100644
index 00000000..bd46e040
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-toogle-physics-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-toogle-physics-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-toogle-physics-icon.png.data
new file mode 100644
index 00000000..e91a871c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-toogle-physics-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-toogle-physics-icon
+author=admin
+path=content/diagram-toogle-physics-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-tool-tab.png b/documentation/18.11/eiffelstudio/_images/diagram-tool-tab.png
new file mode 100644
index 00000000..e011bab5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-tool-tab.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-tool-tab.png.data b/documentation/18.11/eiffelstudio/_images/diagram-tool-tab.png.data
new file mode 100644
index 00000000..607c0438
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-tool-tab.png.data
@@ -0,0 +1,3 @@
+title=diagram-tool-tab
+author=halw
+path=content/diagram-tool-tab
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-view-combo.png b/documentation/18.11/eiffelstudio/_images/diagram-view-combo.png
new file mode 100644
index 00000000..f781da2f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-view-combo.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-view-combo.png.data b/documentation/18.11/eiffelstudio/_images/diagram-view-combo.png.data
new file mode 100644
index 00000000..abb344c7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-view-combo.png.data
@@ -0,0 +1,3 @@
+title=diagram-view-combo
+author=admin
+path=content/diagram-view-combo
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-view-uml-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-view-uml-icon.png
new file mode 100644
index 00000000..f1e15b5b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-view-uml-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-view-uml-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-view-uml-icon.png.data
new file mode 100644
index 00000000..623d129a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-view-uml-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-view-uml-icon
+author=admin
+path=content/diagram-view-uml-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-zoom-in-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-zoom-in-icon.png
new file mode 100644
index 00000000..37c8a648
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-zoom-in-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-zoom-in-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-zoom-in-icon.png.data
new file mode 100644
index 00000000..07e01fdc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-zoom-in-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-zoom-in-icon
+author=admin
+path=content/diagram-zoom-icon
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-zoom-out-icon.png b/documentation/18.11/eiffelstudio/_images/diagram-zoom-out-icon.png
new file mode 100644
index 00000000..f283d595
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/diagram-zoom-out-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/diagram-zoom-out-icon.png.data b/documentation/18.11/eiffelstudio/_images/diagram-zoom-out-icon.png.data
new file mode 100644
index 00000000..106ac5d5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/diagram-zoom-out-icon.png.data
@@ -0,0 +1,3 @@
+title=diagram-zoom-out-icon
+author=admin
+path=content/diagram-zoom-out-icon
diff --git a/documentation/18.11/eiffelstudio/_images/dialogs-and-wizards--preferences-dialog.png b/documentation/18.11/eiffelstudio/_images/dialogs-and-wizards--preferences-dialog.png
new file mode 100644
index 00000000..00f69141
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/dialogs-and-wizards--preferences-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/dialogs-and-wizards--preferences-dialog.png.data b/documentation/18.11/eiffelstudio/_images/dialogs-and-wizards--preferences-dialog.png.data
new file mode 100644
index 00000000..fc85fe1b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/dialogs-and-wizards--preferences-dialog.png.data
@@ -0,0 +1,3 @@
+title=dialogs-and-wizards--preferences-dialog
+author=admin
+path=content/dialogs-and-wizards-preferences-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/disambiguated-name-icon.png b/documentation/18.11/eiffelstudio/_images/disambiguated-name-icon.png
new file mode 100644
index 00000000..f004e07b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/disambiguated-name-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/disambiguated-name-icon.png.data b/documentation/18.11/eiffelstudio/_images/disambiguated-name-icon.png.data
new file mode 100644
index 00000000..a2aebe33
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/disambiguated-name-icon.png.data
@@ -0,0 +1,3 @@
+title=disambiguated name icon
+author=halw
+path=content/disambiguated-name-icon
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target-bottom.png b/documentation/18.11/eiffelstudio/_images/docking-target-bottom.png
new file mode 100644
index 00000000..18a76c1f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/docking-target-bottom.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target-bottom.png.data b/documentation/18.11/eiffelstudio/_images/docking-target-bottom.png.data
new file mode 100644
index 00000000..56ecb39f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/docking-target-bottom.png.data
@@ -0,0 +1,3 @@
+title=docking-target-bottom
+author=halw
+path=content/docking-target-bottom
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target-left.png b/documentation/18.11/eiffelstudio/_images/docking-target-left.png
new file mode 100644
index 00000000..e935af68
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/docking-target-left.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target-left.png.data b/documentation/18.11/eiffelstudio/_images/docking-target-left.png.data
new file mode 100644
index 00000000..d6418053
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/docking-target-left.png.data
@@ -0,0 +1,3 @@
+title=docking-target-left
+author=halw
+path=content/docking-target-left
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target-right.png b/documentation/18.11/eiffelstudio/_images/docking-target-right.png
new file mode 100644
index 00000000..a39bfb01
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/docking-target-right.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target-right.png.data b/documentation/18.11/eiffelstudio/_images/docking-target-right.png.data
new file mode 100644
index 00000000..0b28c69c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/docking-target-right.png.data
@@ -0,0 +1,3 @@
+title=docking-target-right
+author=halw
+path=content/docking-target-right
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target-top.png b/documentation/18.11/eiffelstudio/_images/docking-target-top.png
new file mode 100644
index 00000000..5e8830ca
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/docking-target-top.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target-top.png.data b/documentation/18.11/eiffelstudio/_images/docking-target-top.png.data
new file mode 100644
index 00000000..f19e5562
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/docking-target-top.png.data
@@ -0,0 +1,3 @@
+title=docking-target-top
+author=halw
+path=content/docking-target-top
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target.png b/documentation/18.11/eiffelstudio/_images/docking-target.png
new file mode 100644
index 00000000..12c9cab7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/docking-target.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/docking-target.png.data b/documentation/18.11/eiffelstudio/_images/docking-target.png.data
new file mode 100644
index 00000000..5b1382eb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/docking-target.png.data
@@ -0,0 +1,3 @@
+title=docking-target
+author=halw
+path=content/docking-target
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example1.png b/documentation/18.11/eiffelstudio/_images/domain-example1.png
new file mode 100644
index 00000000..4316e85b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/domain-example1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example1.png.data b/documentation/18.11/eiffelstudio/_images/domain-example1.png.data
new file mode 100644
index 00000000..ada3ea87
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/domain-example1.png.data
@@ -0,0 +1,3 @@
+title=domain-example1
+author=admin
+path=content/domain-example1
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example2.png b/documentation/18.11/eiffelstudio/_images/domain-example2.png
new file mode 100644
index 00000000..c966db12
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/domain-example2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example2.png.data b/documentation/18.11/eiffelstudio/_images/domain-example2.png.data
new file mode 100644
index 00000000..c7617998
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/domain-example2.png.data
@@ -0,0 +1,3 @@
+title=domain-example2
+author=admin
+path=content/domain-example2
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example3.png b/documentation/18.11/eiffelstudio/_images/domain-example3.png
new file mode 100644
index 00000000..a01690d1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/domain-example3.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example3.png.data b/documentation/18.11/eiffelstudio/_images/domain-example3.png.data
new file mode 100644
index 00000000..442b97e1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/domain-example3.png.data
@@ -0,0 +1,3 @@
+title=domain-example3
+author=admin
+path=content/domain-example3
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example4.png b/documentation/18.11/eiffelstudio/_images/domain-example4.png
new file mode 100644
index 00000000..3b1e0b17
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/domain-example4.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example4.png.data b/documentation/18.11/eiffelstudio/_images/domain-example4.png.data
new file mode 100644
index 00000000..b88188ee
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/domain-example4.png.data
@@ -0,0 +1,3 @@
+title=domain-example4
+author=admin
+path=content/domain-example4
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example5.png b/documentation/18.11/eiffelstudio/_images/domain-example5.png
new file mode 100644
index 00000000..0ab9e1f8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/domain-example5.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example5.png.data b/documentation/18.11/eiffelstudio/_images/domain-example5.png.data
new file mode 100644
index 00000000..77ad56a4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/domain-example5.png.data
@@ -0,0 +1,3 @@
+title=domain-example5
+author=admin
+path=content/domain-example5
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example6.png b/documentation/18.11/eiffelstudio/_images/domain-example6.png
new file mode 100644
index 00000000..55c896ab
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/domain-example6.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/domain-example6.png.data b/documentation/18.11/eiffelstudio/_images/domain-example6.png.data
new file mode 100644
index 00000000..0aefabf1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/domain-example6.png.data
@@ -0,0 +1,3 @@
+title=domain-example6
+author=admin
+path=content/domain-example6
diff --git a/documentation/18.11/eiffelstudio/_images/edit_automatic_eis_entry_dialog.png b/documentation/18.11/eiffelstudio/_images/edit_automatic_eis_entry_dialog.png
new file mode 100644
index 00000000..63446acd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/edit_automatic_eis_entry_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/edit_automatic_eis_entry_dialog.png.data b/documentation/18.11/eiffelstudio/_images/edit_automatic_eis_entry_dialog.png.data
new file mode 100644
index 00000000..a73c6db5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/edit_automatic_eis_entry_dialog.png.data
@@ -0,0 +1,3 @@
+title=edit automatic eis entry dialog
+author=halw
+path=content/edit-automatic-eis-entry-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/editor-class-auto-completion-window.png b/documentation/18.11/eiffelstudio/_images/editor-class-auto-completion-window.png
new file mode 100644
index 00000000..fdc67150
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/editor-class-auto-completion-window.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/editor-class-auto-completion-window.png.data b/documentation/18.11/eiffelstudio/_images/editor-class-auto-completion-window.png.data
new file mode 100644
index 00000000..97cd1a09
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/editor-class-auto-completion-window.png.data
@@ -0,0 +1,3 @@
+title=editor-class-auto-completion-window
+author=halw
+path=content/editor-class-auto-completion-window
diff --git a/documentation/18.11/eiffelstudio/_images/editor-feature-auto-completion-window.png b/documentation/18.11/eiffelstudio/_images/editor-feature-auto-completion-window.png
new file mode 100644
index 00000000..7cfdd324
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/editor-feature-auto-completion-window.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/editor-feature-auto-completion-window.png.data b/documentation/18.11/eiffelstudio/_images/editor-feature-auto-completion-window.png.data
new file mode 100644
index 00000000..716dbbb6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/editor-feature-auto-completion-window.png.data
@@ -0,0 +1,3 @@
+title=editor feature auto-completion window
+author=halw
+path=content/editor-feature-auto-completion-window
diff --git a/documentation/18.11/eiffelstudio/_images/editor-pick-and-drop.png b/documentation/18.11/eiffelstudio/_images/editor-pick-and-drop.png
new file mode 100644
index 00000000..cbc36be9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/editor-pick-and-drop.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/editor-pick-and-drop.png.data b/documentation/18.11/eiffelstudio/_images/editor-pick-and-drop.png.data
new file mode 100644
index 00000000..a0de5a40
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/editor-pick-and-drop.png.data
@@ -0,0 +1,3 @@
+title=editor-pick-and-drop
+author=admin
+path=content/editor-pick-and-drop
diff --git a/documentation/18.11/eiffelstudio/_images/error-cursor-disabled_0.png b/documentation/18.11/eiffelstudio/_images/error-cursor-disabled_0.png
new file mode 100644
index 00000000..e7894186
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/error-cursor-disabled_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/error-cursor-disabled_0.png.data b/documentation/18.11/eiffelstudio/_images/error-cursor-disabled_0.png.data
new file mode 100644
index 00000000..c461c16b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/error-cursor-disabled_0.png.data
@@ -0,0 +1,3 @@
+title=error-cursor-disabled
+author=halw
+path=content/error-cursor-disabled
diff --git a/documentation/18.11/eiffelstudio/_images/error-cursor_0.png b/documentation/18.11/eiffelstudio/_images/error-cursor_0.png
new file mode 100644
index 00000000..b882ac23
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/error-cursor_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/error-cursor_0.png.data b/documentation/18.11/eiffelstudio/_images/error-cursor_0.png.data
new file mode 100644
index 00000000..503ddd3f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/error-cursor_0.png.data
@@ -0,0 +1,3 @@
+title=error-cursor
+author=halw
+path=content/error-cursor
diff --git a/documentation/18.11/eiffelstudio/_images/error-description-dialog.png b/documentation/18.11/eiffelstudio/_images/error-description-dialog.png
new file mode 100644
index 00000000..7e29f0b4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/error-description-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/error-description-dialog.png.data b/documentation/18.11/eiffelstudio/_images/error-description-dialog.png.data
new file mode 100644
index 00000000..58f0705b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/error-description-dialog.png.data
@@ -0,0 +1,3 @@
+title=error-description-dialog
+author=admin
+path=content/error-description-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/error-info.png b/documentation/18.11/eiffelstudio/_images/error-info.png
new file mode 100644
index 00000000..fa393149
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/error-info.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/error-info.png.data b/documentation/18.11/eiffelstudio/_images/error-info.png.data
new file mode 100644
index 00000000..93bbc08a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/error-info.png.data
@@ -0,0 +1,3 @@
+title=error-info
+author=admin
+path=content/error-info
diff --git a/documentation/18.11/eiffelstudio/_images/error-message.png b/documentation/18.11/eiffelstudio/_images/error-message.png
new file mode 100644
index 00000000..3d492093
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/error-message.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/error-message.png.data b/documentation/18.11/eiffelstudio/_images/error-message.png.data
new file mode 100644
index 00000000..b54367f9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/error-message.png.data
@@ -0,0 +1,3 @@
+title=error-message
+author=admin
+path=content/error-message
diff --git a/documentation/18.11/eiffelstudio/_images/error.png b/documentation/18.11/eiffelstudio/_images/error.png
new file mode 100644
index 00000000..92faae99
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/error.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/error.png.data b/documentation/18.11/eiffelstudio/_images/error.png.data
new file mode 100644
index 00000000..c19b8e59
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/error.png.data
@@ -0,0 +1,3 @@
+title=error
+author=admin
+path=content/error
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_01a_0.png b/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_01a_0.png
new file mode 100644
index 00000000..cdfffb3c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_01a_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_01a_0.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_01a_0.png.data
new file mode 100644
index 00000000..e5e04ce4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_01a_0.png.data
@@ -0,0 +1,3 @@
+title=es gt a development window 01
+author=halw
+path=content/es-gt-development-window-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_02.png b/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_02.png
new file mode 100644
index 00000000..33bf0ce8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_02.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_02.png.data
new file mode 100644
index 00000000..fb86f5f5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_a_development_window_02.png.data
@@ -0,0 +1,3 @@
+title=es gt a development window 02
+author=halw
+path=content/es-gt-development-window-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_active_windows_tool_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_active_windows_tool_01.png
new file mode 100644
index 00000000..474c9553
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_active_windows_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_active_windows_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_active_windows_tool_01.png.data
new file mode 100644
index 00000000..e1aa18ab
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_active_windows_tool_01.png.data
@@ -0,0 +1,3 @@
+title=es gt active windows tool 01
+author=halw
+path=content/es-gt-active-windows-tool-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_add_cluster_dialog.png b/documentation/18.11/eiffelstudio/_images/es_gt_add_cluster_dialog.png
new file mode 100644
index 00000000..521b5b66
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_add_cluster_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_add_cluster_dialog.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_add_cluster_dialog.png.data
new file mode 100644
index 00000000..3b2d78ba
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_add_cluster_dialog.png.data
@@ -0,0 +1,3 @@
+title=es gt add cluster dialog
+author=halw
+path=content/es-gt-add-cluster-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_add_tab_to_pane.png b/documentation/18.11/eiffelstudio/_images/es_gt_add_tab_to_pane.png
new file mode 100644
index 00000000..ce5e30b4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_add_tab_to_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_add_tab_to_pane.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_add_tab_to_pane.png.data
new file mode 100644
index 00000000..f3963778
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_add_tab_to_pane.png.data
@@ -0,0 +1,3 @@
+title=es gt add tab to pane
+author=halw
+path=content/es-gt-add-tab-pane
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_add_to_favorites_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_add_to_favorites_01.png
new file mode 100644
index 00000000..3ad5cbdf
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_add_to_favorites_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_add_to_favorites_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_add_to_favorites_01.png.data
new file mode 100644
index 00000000..0956b58d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_add_to_favorites_01.png.data
@@ -0,0 +1,3 @@
+title=es gt add to favorites 01
+author=halw
+path=content/es-gt-add-favorites-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_argument_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_argument_01.png
new file mode 100644
index 00000000..ad6b97d7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_argument_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_argument_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_argument_01.png.data
new file mode 100644
index 00000000..59b94fff
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_argument_01.png.data
@@ -0,0 +1,3 @@
+title=es gt auto complete argument 01
+author=halw
+path=content/es-gt-auto-complete-argument-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_feature_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_feature_01.png
new file mode 100644
index 00000000..8a7670af
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_feature_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_feature_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_feature_01.png.data
new file mode 100644
index 00000000..f16cb511
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_auto_complete_feature_01.png.data
@@ -0,0 +1,3 @@
+title=es gt auto complete feature 01
+author=halw
+path=content/es-gt-auto-complete-feature-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_auto_hide_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_auto_hide_01.png
new file mode 100644
index 00000000..92bf6160
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_auto_hide_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_auto_hide_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_auto_hide_01.png.data
new file mode 100644
index 00000000..6232b76a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_auto_hide_01.png.data
@@ -0,0 +1,3 @@
+title=es gt auto hide 01
+author=halw
+path=content/es-gt-auto-hide-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_autocomplete_from_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_autocomplete_from_01.png
new file mode 100644
index 00000000..b69d776c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_autocomplete_from_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_autocomplete_from_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_autocomplete_from_01.png.data
new file mode 100644
index 00000000..4d9daf7a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_autocomplete_from_01.png.data
@@ -0,0 +1,3 @@
+title=es gt auto complete from 01
+author=halw
+path=content/es-gt-auto-complete-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_breakpoint_context_menu.png b/documentation/18.11/eiffelstudio/_images/es_gt_breakpoint_context_menu.png
new file mode 100644
index 00000000..da6c89ad
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_breakpoint_context_menu.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_breakpoint_context_menu.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_breakpoint_context_menu.png.data
new file mode 100644
index 00000000..6307a986
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_breakpoint_context_menu.png.data
@@ -0,0 +1,3 @@
+title=es gt breakpoint context menu 01
+author=halw
+path=content/es-gt-breakpoint-context-menu-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_breakpoints_tool_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_breakpoints_tool_01.png
new file mode 100644
index 00000000..c0552d0e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_breakpoints_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_breakpoints_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_breakpoints_tool_01.png.data
new file mode 100644
index 00000000..7e14b8dd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_breakpoints_tool_01.png.data
@@ -0,0 +1,3 @@
+title=es gt breakpoints tool 01
+author=halw
+path=content/es-gt-breakpoints-tool-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_HEIR2_moved_to_new_cluster.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_HEIR2_moved_to_new_cluster.png
new file mode 100644
index 00000000..b22ec622
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_HEIR2_moved_to_new_cluster.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_HEIR2_moved_to_new_cluster.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_HEIR2_moved_to_new_cluster.png.data
new file mode 100644
index 00000000..d1fdc445
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_HEIR2_moved_to_new_cluster.png.data
@@ -0,0 +1,3 @@
+title=es gt class HEIR2 moved to new cluster
+author=halw
+path=content/es-gt-class-heir2-moved-new-cluster
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_field_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_field_01.png
new file mode 100644
index 00000000..a475de0c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_field_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_field_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_field_01.png.data
new file mode 100644
index 00000000..e6209046
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_field_01.png.data
@@ -0,0 +1,3 @@
+title=es gt class field 01
+author=halw
+path=content/es-gt-class-field-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_created.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_created.png
new file mode 100644
index 00000000..d381ca28
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_created.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_created.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_created.png.data
new file mode 100644
index 00000000..de5f6012
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_created.png.data
@@ -0,0 +1,3 @@
+title=es gt class heir2 created
+author=halw
+path=content/es-gt-class-heir2-created
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_relocated.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_relocated.png
new file mode 100644
index 00000000..ebc5c62c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_relocated.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_relocated.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_relocated.png.data
new file mode 100644
index 00000000..e3e570ad
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_relocated.png.data
@@ -0,0 +1,3 @@
+title=es gt class heir2 relocated
+author=halw
+path=content/es-gt-class-heir2-relocated
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_text.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_text.png
new file mode 100644
index 00000000..23a63d16
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_text.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_text.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_text.png.data
new file mode 100644
index 00000000..21608ace
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_heir2_text.png.data
@@ -0,0 +1,3 @@
+title=es gt class heir2 text
+author=halw
+path=content/es-gt-class-heir2-text
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_invalid_is_hidden.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_invalid_is_hidden.png
new file mode 100644
index 00000000..b96708a9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_invalid_is_hidden.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_invalid_is_hidden.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_invalid_is_hidden.png.data
new file mode 100644
index 00000000..65f278df
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_invalid_is_hidden.png.data
@@ -0,0 +1,3 @@
+title=es gt class invalid is hidden
+author=halw
+path=content/es-gt-class-invalid-hidden
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_01.png
new file mode 100644
index 00000000..99be7a0b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_01.png.data
new file mode 100644
index 00000000..ae7ac221
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_01.png.data
@@ -0,0 +1,3 @@
+title=es gt class tool 01
+author=halw
+path=content/es-gt-class-tool-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_descendants_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_descendants_01.png
new file mode 100644
index 00000000..807bf44e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_descendants_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_descendants_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_descendants_01.png.data
new file mode 100644
index 00000000..ba265066
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_descendants_01.png.data
@@ -0,0 +1,3 @@
+title=es gt class tool descendants 01
+author=halw
+path=content/es-gt-class-tool-descendants-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_flat_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_flat_01.png
new file mode 100644
index 00000000..2204972d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_flat_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_flat_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_flat_01.png.data
new file mode 100644
index 00000000..108168fb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_flat_01.png.data
@@ -0,0 +1,3 @@
+title=es gt class tool flat 01
+author=halw
+path=content/es-gt-class-tool-flat-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_routines_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_routines_01.png
new file mode 100644
index 00000000..93c6b18e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_routines_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_routines_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_routines_01.png.data
new file mode 100644
index 00000000..8c77289d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_class_tool_routines_01.png.data
@@ -0,0 +1,3 @@
+title=es gt class tool routines 01
+author=halw
+path=content/es-gt-class-tool-routines-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_close_favorites_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_close_favorites_01.png
new file mode 100644
index 00000000..e9c7f000
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_close_favorites_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_close_favorites_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_close_favorites_01.png.data
new file mode 100644
index 00000000..9575ea82
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_close_favorites_01.png.data
@@ -0,0 +1,3 @@
+title=es gt close favorites 01
+author=halw
+path=content/es-gt-close-favorites-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_compilation_wizard_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_compilation_wizard_01.png
new file mode 100644
index 00000000..3589efd3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_compilation_wizard_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_compilation_wizard_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_compilation_wizard_01.png.data
new file mode 100644
index 00000000..5b95651e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_compilation_wizard_01.png.data
@@ -0,0 +1,3 @@
+title=es gt compilation error wizard 01
+author=halw
+path=content/es-gt-compilation-error-wizard-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_create_new_class_button.png b/documentation/18.11/eiffelstudio/_images/es_gt_create_new_class_button.png
new file mode 100644
index 00000000..dc8bf7bd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_create_new_class_button.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_create_new_class_button.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_create_new_class_button.png.data
new file mode 100644
index 00000000..79688499
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_create_new_class_button.png.data
@@ -0,0 +1,3 @@
+title=es gt create new class button
+author=halw
+path=content/es-gt-create-new-class-button
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_debug_buttons_0.png b/documentation/18.11/eiffelstudio/_images/es_gt_debug_buttons_0.png
new file mode 100644
index 00000000..bb746896
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_debug_buttons_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_debug_buttons_0.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_debug_buttons_0.png.data
new file mode 100644
index 00000000..d3974a9f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_debug_buttons_0.png.data
@@ -0,0 +1,3 @@
+title=es gt debug buttons
+author=halw
+path=content/es-gt-debug-buttons
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_by_step_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_by_step_01.png
new file mode 100644
index 00000000..af723575
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_by_step_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_by_step_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_by_step_01.png.data
new file mode 100644
index 00000000..e2e79d9d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_by_step_01.png.data
@@ -0,0 +1,3 @@
+title=es gt debug step by step 01
+author=halw
+path=content/es-gt-debug-step-step-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_into_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_into_01.png
new file mode 100644
index 00000000..e55ed14f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_into_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_into_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_into_01.png.data
new file mode 100644
index 00000000..a77d8b6e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_debug_step_into_01.png.data
@@ -0,0 +1,3 @@
+title=es gt debug step into 01
+author=halw
+path=content/es-gt-debug-step-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_default_pane_tabs.png b/documentation/18.11/eiffelstudio/_images/es_gt_default_pane_tabs.png
new file mode 100644
index 00000000..0b99ccb0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_default_pane_tabs.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_default_pane_tabs.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_default_pane_tabs.png.data
new file mode 100644
index 00000000..c4ee0d4e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_default_pane_tabs.png.data
@@ -0,0 +1,3 @@
+title=es gt default pane tabs
+author=halw
+path=content/es-gt-default-pane-tabs
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoint_reached_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoint_reached_01.png
new file mode 100644
index 00000000..346265cf
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoint_reached_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoint_reached_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoint_reached_01.png.data
new file mode 100644
index 00000000..ecf2e97a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoint_reached_01.png.data
@@ -0,0 +1,3 @@
+title=es gt debug breakpoint reached 01
+author=halw
+path=content/es-gt-debug-breakpoint-reached-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_01.png
new file mode 100644
index 00000000..81147418
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_01.png.data
new file mode 100644
index 00000000..aaaa48d9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_01.png.data
@@ -0,0 +1,3 @@
+title=es gt development window breakpoints 01
+author=halw
+path=content/es-gt-development-window-breakpoints-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_02.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_02.png
new file mode 100644
index 00000000..51202e69
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_02.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_02.png.data
new file mode 100644
index 00000000..9a4d57c8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_breakpoints_02.png.data
@@ -0,0 +1,3 @@
+title=es gt development window breakpoints 02
+author=halw
+path=content/es-gt-development-window-breakpoints-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_foth_descendants_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_foth_descendants_01.png
new file mode 100644
index 00000000..83ed2588
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_foth_descendants_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_foth_descendants_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_foth_descendants_01.png.data
new file mode 100644
index 00000000..120955ab
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_foth_descendants_01.png.data
@@ -0,0 +1,3 @@
+title=es gt development window feature descendants 01
+author=halw
+path=content/es-gt-development-window-feature-descendants-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multi_array_list_forth_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multi_array_list_forth_01.png
new file mode 100644
index 00000000..d64e0a39
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multi_array_list_forth_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multi_array_list_forth_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multi_array_list_forth_01.png.data
new file mode 100644
index 00000000..9467238b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multi_array_list_forth_01.png.data
@@ -0,0 +1,3 @@
+title=es gt development window multi array list forth 01
+author=halw
+path=content/es-gt-development-window-multi-array-list-forth-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multiple_tabs_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multiple_tabs_01.png
new file mode 100644
index 00000000..15a88ce3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multiple_tabs_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multiple_tabs_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multiple_tabs_01.png.data
new file mode 100644
index 00000000..dc0ed7af
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_multiple_tabs_01.png.data
@@ -0,0 +1,3 @@
+title=es gt development window multiple tabs 01
+author=halw
+path=content/es-gt-development-window-multiple-tabs-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_syntax_error_01_0.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_syntax_error_01_0.png
new file mode 100644
index 00000000..eef03016
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_syntax_error_01_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_syntax_error_01_0.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_syntax_error_01_0.png.data
new file mode 100644
index 00000000..5161bc06
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_syntax_error_01_0.png.data
@@ -0,0 +1,3 @@
+title=es gt development window syntax error 01
+author=halw
+path=content/es-gt-development-window-syntax-error-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_list_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_list_01.png
new file mode 100644
index 00000000..46ec7eb4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_list_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_list_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_list_01.png.data
new file mode 100644
index 00000000..84c3a0a6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_list_01.png.data
@@ -0,0 +1,3 @@
+title=es gt development window targeted to list 01
+author=halw
+path=content/es-gt-development-window-targeted-list-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_01.png
new file mode 100644
index 00000000..f04912f7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_01.png.data
new file mode 100644
index 00000000..27ffac64
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_01.png.data
@@ -0,0 +1,3 @@
+title=es gt development window targeted to parent 01
+author=halw
+path=content/es-gt-development-window-targeted-parent-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_02.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_02.png
new file mode 100644
index 00000000..53b7c1d1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_02.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_02.png.data
new file mode 100644
index 00000000..467ce090
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_targeted_to_parent_02.png.data
@@ -0,0 +1,3 @@
+title=es gt development window targeted to parent 02
+author=halw
+path=content/es-gt-development-window-targeted-parent-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_01.png
new file mode 100644
index 00000000..a37239c3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_01.png.data
new file mode 100644
index 00000000..be07d3ac
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_01.png.data
@@ -0,0 +1,3 @@
+title=es gt development window validity error 01
+author=halw
+path=content/es-gt-development-window-validity-error-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_02.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_02.png
new file mode 100644
index 00000000..e05154be
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_02.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_02.png.data
new file mode 100644
index 00000000..6bfecd26
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_02.png.data
@@ -0,0 +1,3 @@
+title=es gt development window validity error 02
+author=halw
+path=content/es-gt-development-window-validity-error-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_03.png b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_03.png
new file mode 100644
index 00000000..a8bc848d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_03.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_03.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_03.png.data
new file mode 100644
index 00000000..0ce444ab
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_development_window_validity_error_03.png.data
@@ -0,0 +1,3 @@
+title=es gt development window validity error 03
+author=halw
+path=content/es-gt-development-window-validity-error-03
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_diagram_delete_confirmation.png b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_delete_confirmation.png
new file mode 100644
index 00000000..89c12a3b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_delete_confirmation.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_diagram_delete_confirmation.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_delete_confirmation.png.data
new file mode 100644
index 00000000..9aed4909
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_delete_confirmation.png.data
@@ -0,0 +1,3 @@
+title=es gt diagram delete confirmation
+author=halw
+path=content/es-gt-diagram-delete-confirmation
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_floating_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_floating_01.png
new file mode 100644
index 00000000..9f6ff0a1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_floating_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_floating_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_floating_01.png.data
new file mode 100644
index 00000000..b0d77d12
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_floating_01.png.data
@@ -0,0 +1,3 @@
+title=es gt diagram tool pane floating 01
+author=halw
+path=content/es-gt-diagram-tool-pane-floating-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_pinned_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_pinned_01.png
new file mode 100644
index 00000000..e5989857
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_pinned_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_pinned_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_pinned_01.png.data
new file mode 100644
index 00000000..c3e3b286
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_pane_pinned_01.png.data
@@ -0,0 +1,3 @@
+title=es gt diagram tool pane pinned 01
+author=halw
+path=content/es-gt-diagram-tool-pane-pinned-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_unhidden.png b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_unhidden.png
new file mode 100644
index 00000000..2ef95cbf
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_unhidden.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_unhidden.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_unhidden.png.data
new file mode 100644
index 00000000..3eaad271
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_diagram_tool_unhidden.png.data
@@ -0,0 +1,3 @@
+title=es gt development window diagram tool unhidden
+author=halw
+path=content/es-gt-development-window-diagram-tool-unhidden
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_docking_in_progress_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_docking_in_progress_01.png
new file mode 100644
index 00000000..7bbedf19
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_docking_in_progress_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_docking_in_progress_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_docking_in_progress_01.png.data
new file mode 100644
index 00000000..f5f0dc50
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_docking_in_progress_01.png.data
@@ -0,0 +1,3 @@
+title=es gt docking in progress 01
+author=halw
+path=content/es-gt-docking-progress-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_error_list_tool_pnd_validity_error.png b/documentation/18.11/eiffelstudio/_images/es_gt_error_list_tool_pnd_validity_error.png
new file mode 100644
index 00000000..9225c621
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_error_list_tool_pnd_validity_error.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_error_list_tool_pnd_validity_error.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_error_list_tool_pnd_validity_error.png.data
new file mode 100644
index 00000000..e262f1ea
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_error_list_tool_pnd_validity_error.png.data
@@ -0,0 +1,3 @@
+title=es gt error list tool pnd validity error
+author=halw
+path=content/es-gt-error-list-tool-pnd-validity-error
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_execute_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_execute_01.png
new file mode 100644
index 00000000..49c75875
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_execute_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_execute_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_execute_01.png.data
new file mode 100644
index 00000000..6954ea86
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_execute_01.png.data
@@ -0,0 +1,3 @@
+title=es gt execute 01
+author=halw
+path=content/es-gt-execute-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_execution_menu_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_execution_menu_01.png
new file mode 100644
index 00000000..587ea9ed
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_execution_menu_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_execution_menu_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_execution_menu_01.png.data
new file mode 100644
index 00000000..7c3697d6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_execution_menu_01.png.data
@@ -0,0 +1,3 @@
+title=es gt execution menu 01
+author=halw
+path=content/es-gt-execution-menu-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_favorites_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_favorites_01.png
new file mode 100644
index 00000000..caeaa3c3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_favorites_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_favorites_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_favorites_01.png.data
new file mode 100644
index 00000000..39feee38
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_favorites_01.png.data
@@ -0,0 +1,3 @@
+title=es gt favorites 01
+author=halw
+path=content/es-gt-favorites-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_01.png
new file mode 100644
index 00000000..e6150337
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_01.png.data
new file mode 100644
index 00000000..cd2d688a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_01.png.data
@@ -0,0 +1,3 @@
+title=es gt feature tool 01
+author=halw
+path=content/es-gt-feature-tool-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_callers_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_callers_01.png
new file mode 100644
index 00000000..3e2e31cc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_callers_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_callers_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_callers_01.png.data
new file mode 100644
index 00000000..c8513038
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_callers_01.png.data
@@ -0,0 +1,3 @@
+title=es gt feature tool callers 01
+author=halw
+path=content/es-gt-feature-tool-callers-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_toolbar_buttons_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_toolbar_buttons_01.png
new file mode 100644
index 00000000..2222da35
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_toolbar_buttons_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_toolbar_buttons_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_toolbar_buttons_01.png.data
new file mode 100644
index 00000000..099e5716
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_feature_tool_toolbar_buttons_01.png.data
@@ -0,0 +1,3 @@
+title=es gt feature tool toolbar buttons 01
+author=halw
+path=content/es-gt-feature-tool-toolbar-buttons-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_01.png
new file mode 100644
index 00000000..0a45dd33
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_01.png.data
new file mode 100644
index 00000000..bd72f910
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_01.png.data
@@ -0,0 +1,3 @@
+title=es gt features tool 01
+author=halw
+path=content/es-gt-features-tool-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_02.png b/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_02.png
new file mode 100644
index 00000000..67234afb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_02.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_02.png.data
new file mode 100644
index 00000000..c2e6a70f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_features_tool_02.png.data
@@ -0,0 +1,3 @@
+title=es gt features tool 02
+author=halw
+path=content/es-gt-features-tool-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_freeze_warning.png b/documentation/18.11/eiffelstudio/_images/es_gt_freeze_warning.png
new file mode 100644
index 00000000..08577ceb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_freeze_warning.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_freeze_warning.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_freeze_warning.png.data
new file mode 100644
index 00000000..f42d9b50
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_freeze_warning.png.data
@@ -0,0 +1,3 @@
+title=es gt freeze warning
+author=halw
+path=content/es-gt-freeze-warning
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_go_back_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_go_back_01.png
new file mode 100644
index 00000000..5c22f1d0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_go_back_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_go_back_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_go_back_01.png.data
new file mode 100644
index 00000000..4b44439d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_go_back_01.png.data
@@ -0,0 +1,3 @@
+title=es gt go back 01
+author=halw
+path=content/es-gt-go-back-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_graphics_based_design_starting_point.png b/documentation/18.11/eiffelstudio/_images/es_gt_graphics_based_design_starting_point.png
new file mode 100644
index 00000000..888c9247
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_graphics_based_design_starting_point.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_graphics_based_design_starting_point.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_graphics_based_design_starting_point.png.data
new file mode 100644
index 00000000..d264f3c0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_graphics_based_design_starting_point.png.data
@@ -0,0 +1,3 @@
+title=es gt graphics based design starting point
+author=halw
+path=content/es-gt-graphics-based-design-starting-point
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_01.png
new file mode 100644
index 00000000..d13f2d97
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_01.png.data
new file mode 100644
index 00000000..026172fe
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_01.png.data
@@ -0,0 +1,3 @@
+title=es gt groups tool 01
+author=halw
+path=content/es-gt-groups-tool-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_02.png b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_02.png
new file mode 100644
index 00000000..17a02aa4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_02.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_02.png.data
new file mode 100644
index 00000000..f4bd1380
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_02.png.data
@@ -0,0 +1,3 @@
+title=es gt groups tool 02
+author=halw
+path=content/es-gt-groups-tool-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_03.png b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_03.png
new file mode 100644
index 00000000..4117354f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_03.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_03.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_03.png.data
new file mode 100644
index 00000000..32abe1d6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_groups_tool_03.png.data
@@ -0,0 +1,3 @@
+title=es gt groups tool 03
+author=halw
+path=content/es-gt-groups-tool-03
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_heir2_inheriting_parent.png b/documentation/18.11/eiffelstudio/_images/es_gt_heir2_inheriting_parent.png
new file mode 100644
index 00000000..ef89cf72
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_heir2_inheriting_parent.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_heir2_inheriting_parent.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_heir2_inheriting_parent.png.data
new file mode 100644
index 00000000..7acfd4f3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_heir2_inheriting_parent.png.data
@@ -0,0 +1,3 @@
+title=es gt class heir2 inheriting parent
+author=halw
+path=content/es-gt-class-heir2-inheriting-parent
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_list_added_to_favorites_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_list_added_to_favorites_01.png
new file mode 100644
index 00000000..b8a11ad4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_list_added_to_favorites_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_list_added_to_favorites_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_list_added_to_favorites_01.png.data
new file mode 100644
index 00000000..26cf8864
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_list_added_to_favorites_01.png.data
@@ -0,0 +1,3 @@
+title=es gt list added to favorites 01
+author=halw
+path=content/es-gt-list-added-favorites-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_new_class_dialog.png b/documentation/18.11/eiffelstudio/_images/es_gt_new_class_dialog.png
new file mode 100644
index 00000000..59f8a733
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_new_class_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_new_class_dialog.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_new_class_dialog.png.data
new file mode 100644
index 00000000..99b25dd1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_new_class_dialog.png.data
@@ -0,0 +1,3 @@
+title=es gt new class dialog
+author=halw
+path=content/es-gt-new-class-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_new_cluster_added.png b/documentation/18.11/eiffelstudio/_images/es_gt_new_cluster_added.png
new file mode 100644
index 00000000..0b5260a1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_new_cluster_added.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_new_cluster_added.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_new_cluster_added.png.data
new file mode 100644
index 00000000..ea3f86c1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_new_cluster_added.png.data
@@ -0,0 +1,3 @@
+title=es gt new cluster added
+author=halw
+path=content/es-gt-new-cluster-added
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_new_feature_dialog.png b/documentation/18.11/eiffelstudio/_images/es_gt_new_feature_dialog.png
new file mode 100644
index 00000000..a194a443
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_new_feature_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_new_feature_dialog.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_new_feature_dialog.png.data
new file mode 100644
index 00000000..57b3deba
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_new_feature_dialog.png.data
@@ -0,0 +1,3 @@
+title=es gt new feature dialog
+author=halw
+path=content/es-gt-new-feature-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_open_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_open_01.png
new file mode 100644
index 00000000..59e476d4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_open_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_open_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_open_01.png.data
new file mode 100644
index 00000000..1a7b51e5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_open_01.png.data
@@ -0,0 +1,3 @@
+title=es gt open 01
+author=halw
+path=content/es-gt-open-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_open_02.png b/documentation/18.11/eiffelstudio/_images/es_gt_open_02.png
new file mode 100644
index 00000000..e34c4c36
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_open_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_open_02.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_open_02.png.data
new file mode 100644
index 00000000..a3399aaf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_open_02.png.data
@@ -0,0 +1,3 @@
+title=es gt open 02
+author=halw
+path=content/es-gt-open-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_picked_forth_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_picked_forth_01.png
new file mode 100644
index 00000000..8b9d6ade
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_picked_forth_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_picked_forth_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_picked_forth_01.png.data
new file mode 100644
index 00000000..f872bcb4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_picked_forth_01.png.data
@@ -0,0 +1,3 @@
+title=es gt picked forth 01
+author=halw
+path=content/es-gt-picked-forth-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_pnd_context_menu_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_pnd_context_menu_01.png
new file mode 100644
index 00000000..153463a5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_pnd_context_menu_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_pnd_context_menu_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_pnd_context_menu_01.png.data
new file mode 100644
index 00000000..1a0b85e4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_pnd_context_menu_01.png.data
@@ -0,0 +1,3 @@
+title=es gt pnd context menu 01
+author=halw
+path=content/es-gt-pnd-context-menu-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_project_directory_01_0.png b/documentation/18.11/eiffelstudio/_images/es_gt_project_directory_01_0.png
new file mode 100644
index 00000000..cd417e58
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_project_directory_01_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_project_directory_01_0.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_project_directory_01_0.png.data
new file mode 100644
index 00000000..1c138b46
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_project_directory_01_0.png.data
@@ -0,0 +1,3 @@
+title=es gt project directory 01
+author=halw
+path=content/es-gt-project-directory-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar.png b/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar.png
new file mode 100644
index 00000000..21a00868
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar.png.data
new file mode 100644
index 00000000..85a44c1b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar.png.data
@@ -0,0 +1,3 @@
+title=es gt redocking project toolbar
+author=halw
+path=content/es-gt-redocking-project-toolbar
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar_new_row.png b/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar_new_row.png
new file mode 100644
index 00000000..0cab1cff
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar_new_row.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar_new_row.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar_new_row.png.data
new file mode 100644
index 00000000..6d28a845
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_redocking_project_toolbar_new_row.png.data
@@ -0,0 +1,3 @@
+title=es gt redocking project toolbar new row
+author=halw
+path=content/es-gt-redocking-project-toolbar-new-row
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_relation_depth_dialog.png b/documentation/18.11/eiffelstudio/_images/es_gt_relation_depth_dialog.png
new file mode 100644
index 00000000..5f191ab1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_relation_depth_dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_relation_depth_dialog.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_relation_depth_dialog.png.data
new file mode 100644
index 00000000..4d4e8c8e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_relation_depth_dialog.png.data
@@ -0,0 +1,3 @@
+title=es gt relation depth dialog
+author=halw
+path=content/es-gt-relation-depth-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_reordered_pane_tabs.png b/documentation/18.11/eiffelstudio/_images/es_gt_reordered_pane_tabs.png
new file mode 100644
index 00000000..e9c71fd9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_reordered_pane_tabs.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_reordered_pane_tabs.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_reordered_pane_tabs.png.data
new file mode 100644
index 00000000..ed8f3654
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_reordered_pane_tabs.png.data
@@ -0,0 +1,3 @@
+title=es gt reordered pane tabs
+author=halw
+path=content/es-gt-reordered-pane-tabs
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_reset_tools_layout_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_reset_tools_layout_01.png
new file mode 100644
index 00000000..44b06a18
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_reset_tools_layout_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_reset_tools_layout_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_reset_tools_layout_01.png.data
new file mode 100644
index 00000000..c2c74a7a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_reset_tools_layout_01.png.data
@@ -0,0 +1,3 @@
+title=es gt reset tools layout 01
+author=halw
+path=content/es-gt-reset-tools-layout-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_select_conforming_inheritance_link_creation_mode.png b/documentation/18.11/eiffelstudio/_images/es_gt_select_conforming_inheritance_link_creation_mode.png
new file mode 100644
index 00000000..96c68f4d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_select_conforming_inheritance_link_creation_mode.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_select_conforming_inheritance_link_creation_mode.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_select_conforming_inheritance_link_creation_mode.png.data
new file mode 100644
index 00000000..7719168d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_select_conforming_inheritance_link_creation_mode.png.data
@@ -0,0 +1,3 @@
+title=es gt select conforming inheritance link creation mode
+author=halw
+path=content/es-gt-select-conforming-inheritance-link-creation-mode
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_side_by_side_editing.png b/documentation/18.11/eiffelstudio/_images/es_gt_side_by_side_editing.png
new file mode 100644
index 00000000..9007690c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_side_by_side_editing.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_side_by_side_editing.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_side_by_side_editing.png.data
new file mode 100644
index 00000000..d0249609
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_side_by_side_editing.png.data
@@ -0,0 +1,3 @@
+title=es gt side by side editing
+author=halw
+path=content/es-gt-side-side-editing
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_split_pane.png b/documentation/18.11/eiffelstudio/_images/es_gt_split_pane.png
new file mode 100644
index 00000000..83d10fbb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_split_pane.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_split_pane.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_split_pane.png.data
new file mode 100644
index 00000000..d501174d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_split_pane.png.data
@@ -0,0 +1,3 @@
+title=es gt split pane right
+author=halw
+path=content/es-gt-split-pane-right
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_string_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_string_01.png
new file mode 100644
index 00000000..5d2e9e5a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_string_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_string_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_string_01.png.data
new file mode 100644
index 00000000..b8eba76b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_string_01.png.data
@@ -0,0 +1,3 @@
+title=es gt string 01
+author=halw
+path=content/es-gt-string-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_target_history_01.png b/documentation/18.11/eiffelstudio/_images/es_gt_target_history_01.png
new file mode 100644
index 00000000..725de5de
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_target_history_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_target_history_01.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_target_history_01.png.data
new file mode 100644
index 00000000..667e13f2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_target_history_01.png.data
@@ -0,0 +1,3 @@
+title=es gt target history 01
+author=halw
+path=content/es-gt-target-history-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_testroot_class_diagram.png b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_class_diagram.png
new file mode 100644
index 00000000..6c9dcd7b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_class_diagram.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_testroot_class_diagram.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_class_diagram.png.data
new file mode 100644
index 00000000..e2ecb9ce
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_class_diagram.png.data
@@ -0,0 +1,3 @@
+title=es gt testroot class diagram
+author=halw
+path=content/es-gt-testroot-class-diagram
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_testroot_cluster.png b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_cluster.png
new file mode 100644
index 00000000..75a6bc3d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_cluster.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_testroot_cluster.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_cluster.png.data
new file mode 100644
index 00000000..2e33b7ce
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_cluster.png.data
@@ -0,0 +1,3 @@
+title=es gt testroot cluster diagram
+author=halw
+path=content/es-gt-testroot-cluster-diagram
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir.png b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir.png
new file mode 100644
index 00000000..e61b40e4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir.png.data
new file mode 100644
index 00000000..95599a5d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir.png.data
@@ -0,0 +1,3 @@
+title=es gt testroot is client of heir
+author=halw
+path=content/es-gt-testroot-client-heir
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir2.png b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir2.png
new file mode 100644
index 00000000..4c0ea80a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir2.png.data b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir2.png.data
new file mode 100644
index 00000000..5a13edbe
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_gt_testroot_is_client_of_heir2.png.data
@@ -0,0 +1,3 @@
+title=es gt testroot is client of heir2
+author=halw
+path=content/es-gt-testroot-client-heir2
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_01.png b/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_01.png
new file mode 100644
index 00000000..f7e4e58e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_01.png.data b/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_01.png.data
new file mode 100644
index 00000000..eda1eaa3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_01.png.data
@@ -0,0 +1,3 @@
+title=es ref add attached contract template 01
+author=halw
+path=content/es-ref-add-attached-contract-template-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_02.png b/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_02.png
new file mode 100644
index 00000000..d7a99ede
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_02.png.data b/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_02.png.data
new file mode 100644
index 00000000..a7c858ec
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_ref_add_attached_contract_template_02.png.data
@@ -0,0 +1,3 @@
+title=es ref add attached contract template 02
+author=halw
+path=content/es-ref-add-attached-contract-template-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_01.png b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_01.png
new file mode 100644
index 00000000..63ee0136
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_01.png.data b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_01.png.data
new file mode 100644
index 00000000..532656d5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_01.png.data
@@ -0,0 +1,3 @@
+title=es ref contract editor 01
+author=halw
+path=content/es-ref-contract-editor-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_02.png b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_02.png
new file mode 100644
index 00000000..8fd3274f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_02.png.data b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_02.png.data
new file mode 100644
index 00000000..4c646ddc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_02.png.data
@@ -0,0 +1,3 @@
+title=es ref contract editor 02
+author=halw
+path=content/es-ref-contract-editor-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_03.png b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_03.png
new file mode 100644
index 00000000..4f1c2ccc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_03.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_03.png.data b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_03.png.data
new file mode 100644
index 00000000..bcf1f077
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_03.png.data
@@ -0,0 +1,3 @@
+title=es ref contract editor 03
+author=halw
+path=content/es-ref-contract-editor-03
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_01.png b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_01.png
new file mode 100644
index 00000000..e06b0f56
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_01.png.data b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_01.png.data
new file mode 100644
index 00000000..8cad7917
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_01.png.data
@@ -0,0 +1,3 @@
+title=es ref contract editor add 01
+author=halw
+path=content/es-ref-contract-editor-add-01
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_02.png b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_02.png
new file mode 100644
index 00000000..e7ed1343
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_02.png.data b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_02.png.data
new file mode 100644
index 00000000..2bcc872a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_ref_contract_editor_add_02.png.data
@@ -0,0 +1,3 @@
+title=es ref contract editor add 02
+author=halw
+path=content/es-ref-contract-editor-add-02
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_edit_contract_dialog_01.png b/documentation/18.11/eiffelstudio/_images/es_ref_edit_contract_dialog_01.png
new file mode 100644
index 00000000..0b5526e8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/es_ref_edit_contract_dialog_01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/es_ref_edit_contract_dialog_01.png.data b/documentation/18.11/eiffelstudio/_images/es_ref_edit_contract_dialog_01.png.data
new file mode 100644
index 00000000..ea83f3d8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/es_ref_edit_contract_dialog_01.png.data
@@ -0,0 +1,3 @@
+title=es ref edit contract dialog 01
+author=halw
+path=content/es-ref-edit-contract-dialog-01
diff --git a/documentation/18.11/eiffelstudio/_images/exception-dialog.png b/documentation/18.11/eiffelstudio/_images/exception-dialog.png
new file mode 100644
index 00000000..e18d6aa0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exception-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exception-dialog.png.data b/documentation/18.11/eiffelstudio/_images/exception-dialog.png.data
new file mode 100644
index 00000000..b6b38595
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exception-dialog.png.data
@@ -0,0 +1,3 @@
+title=exception-dialog
+author=admin
+path=content/exception-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/exceptions-handling-tool.png b/documentation/18.11/eiffelstudio/_images/exceptions-handling-tool.png
new file mode 100644
index 00000000..4bb23a48
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exceptions-handling-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exceptions-handling-tool.png.data b/documentation/18.11/eiffelstudio/_images/exceptions-handling-tool.png.data
new file mode 100644
index 00000000..fb4cc716
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exceptions-handling-tool.png.data
@@ -0,0 +1,3 @@
+title=exceptions-handling-tool
+author=admin
+path=content/exceptions-handling-tool
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-00-1.png b/documentation/18.11/eiffelstudio/_images/exec-replay-00-1.png
new file mode 100644
index 00000000..13537cc4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exec-replay-00-1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-00-1.png.data b/documentation/18.11/eiffelstudio/_images/exec-replay-00-1.png.data
new file mode 100644
index 00000000..b4a1f3d0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exec-replay-00-1.png.data
@@ -0,0 +1,3 @@
+title=exec-replay-00-1
+author=admin
+path=content/exec-replay-00-1
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-00.png b/documentation/18.11/eiffelstudio/_images/exec-replay-00.png
new file mode 100644
index 00000000..c7090bff
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exec-replay-00.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-00.png.data b/documentation/18.11/eiffelstudio/_images/exec-replay-00.png.data
new file mode 100644
index 00000000..59af4719
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exec-replay-00.png.data
@@ -0,0 +1,3 @@
+title=exec-replay-00
+author=admin
+path=content/exec-replay-00
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-01.png b/documentation/18.11/eiffelstudio/_images/exec-replay-01.png
new file mode 100644
index 00000000..e5be9c29
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exec-replay-01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-01.png.data b/documentation/18.11/eiffelstudio/_images/exec-replay-01.png.data
new file mode 100644
index 00000000..f87cd516
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exec-replay-01.png.data
@@ -0,0 +1,3 @@
+title=exec-replay-01
+author=admin
+path=content/exec-replay-01
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-02-1.png b/documentation/18.11/eiffelstudio/_images/exec-replay-02-1.png
new file mode 100644
index 00000000..d214199f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exec-replay-02-1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-02-1.png.data b/documentation/18.11/eiffelstudio/_images/exec-replay-02-1.png.data
new file mode 100644
index 00000000..5f1a1e44
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exec-replay-02-1.png.data
@@ -0,0 +1,3 @@
+title=exec-replay-02-1
+author=admin
+path=content/exec-replay-02-1
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-02.png b/documentation/18.11/eiffelstudio/_images/exec-replay-02.png
new file mode 100644
index 00000000..84092b66
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exec-replay-02.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-02.png.data b/documentation/18.11/eiffelstudio/_images/exec-replay-02.png.data
new file mode 100644
index 00000000..7740d073
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exec-replay-02.png.data
@@ -0,0 +1,3 @@
+title=exec-replay-02
+author=admin
+path=content/exec-replay-02
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-03.png b/documentation/18.11/eiffelstudio/_images/exec-replay-03.png
new file mode 100644
index 00000000..466301d4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exec-replay-03.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-03.png.data b/documentation/18.11/eiffelstudio/_images/exec-replay-03.png.data
new file mode 100644
index 00000000..bc36b056
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exec-replay-03.png.data
@@ -0,0 +1,3 @@
+title=exec-replay-03
+author=admin
+path=content/exec-replay-03
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-04.png b/documentation/18.11/eiffelstudio/_images/exec-replay-04.png
new file mode 100644
index 00000000..c1a8b64c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/exec-replay-04.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/exec-replay-04.png.data b/documentation/18.11/eiffelstudio/_images/exec-replay-04.png.data
new file mode 100644
index 00000000..2c2e437d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/exec-replay-04.png.data
@@ -0,0 +1,3 @@
+title=exec-replay-04
+author=admin
+path=content/exec-replay-04
diff --git a/documentation/18.11/eiffelstudio/_images/execution-object-storage-icon.png b/documentation/18.11/eiffelstudio/_images/execution-object-storage-icon.png
new file mode 100644
index 00000000..fa3da8fa
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/execution-object-storage-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/execution-object-storage-icon.png.data b/documentation/18.11/eiffelstudio/_images/execution-object-storage-icon.png.data
new file mode 100644
index 00000000..1ac082ed
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/execution-object-storage-icon.png.data
@@ -0,0 +1,3 @@
+title=execution-object-storage-icon
+author=admin
+path=content/execution-object-storage-icon
diff --git a/documentation/18.11/eiffelstudio/_images/expand-errors.png b/documentation/18.11/eiffelstudio/_images/expand-errors.png
new file mode 100644
index 00000000..cd8185f1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/expand-errors.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/expand-errors.png.data b/documentation/18.11/eiffelstudio/_images/expand-errors.png.data
new file mode 100644
index 00000000..a1c829b2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/expand-errors.png.data
@@ -0,0 +1,3 @@
+title=expand-errors
+author=admin
+path=content/expand-errors
diff --git a/documentation/18.11/eiffelstudio/_images/expanded-display-default.png b/documentation/18.11/eiffelstudio/_images/expanded-display-default.png
new file mode 100644
index 00000000..d25bcc5e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/expanded-display-default.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/expanded-display-default.png.data b/documentation/18.11/eiffelstudio/_images/expanded-display-default.png.data
new file mode 100644
index 00000000..0028f737
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/expanded-display-default.png.data
@@ -0,0 +1,3 @@
+title=expanded-display-default
+author=admin
+path=content/expanded-display-default
diff --git a/documentation/18.11/eiffelstudio/_images/expanded-normal-icon.png b/documentation/18.11/eiffelstudio/_images/expanded-normal-icon.png
new file mode 100644
index 00000000..80475168
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/expanded-normal-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/expanded-normal-icon.png.data b/documentation/18.11/eiffelstudio/_images/expanded-normal-icon.png.data
new file mode 100644
index 00000000..41f62931
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/expanded-normal-icon.png.data
@@ -0,0 +1,3 @@
+title=expanded-normal-icon
+author=admin
+path=content/expanded-normal-icon
diff --git a/documentation/18.11/eiffelstudio/_images/expression-evaluation-tool.png b/documentation/18.11/eiffelstudio/_images/expression-evaluation-tool.png
new file mode 100644
index 00000000..1a7db80b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/expression-evaluation-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/expression-evaluation-tool.png.data b/documentation/18.11/eiffelstudio/_images/expression-evaluation-tool.png.data
new file mode 100644
index 00000000..f94d8feb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/expression-evaluation-tool.png.data
@@ -0,0 +1,3 @@
+title=expression-evaluation-tool
+author=admin
+path=content/expression-evaluation-tool
diff --git a/documentation/18.11/eiffelstudio/_images/external-commands-dialog-editor.png b/documentation/18.11/eiffelstudio/_images/external-commands-dialog-editor.png
new file mode 100644
index 00000000..83c01162
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/external-commands-dialog-editor.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/external-commands-dialog-editor.png.data b/documentation/18.11/eiffelstudio/_images/external-commands-dialog-editor.png.data
new file mode 100644
index 00000000..3bda6b95
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/external-commands-dialog-editor.png.data
@@ -0,0 +1,3 @@
+title=external-commands-dialog-editor
+author=admin
+path=content/external-commands-dialog-editor
diff --git a/documentation/18.11/eiffelstudio/_images/external-commands-dialog.png b/documentation/18.11/eiffelstudio/_images/external-commands-dialog.png
new file mode 100644
index 00000000..1e1c8ff3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/external-commands-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/external-commands-dialog.png.data b/documentation/18.11/eiffelstudio/_images/external-commands-dialog.png.data
new file mode 100644
index 00000000..9f9bc0b9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/external-commands-dialog.png.data
@@ -0,0 +1,3 @@
+title=external-commands-dialog
+author=admin
+path=content/external-commands-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/external-options.png b/documentation/18.11/eiffelstudio/_images/external-options.png
new file mode 100644
index 00000000..ac4ac343
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/external-options.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/external-options.png.data b/documentation/18.11/eiffelstudio/_images/external-options.png.data
new file mode 100644
index 00000000..8d507759
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/external-options.png.data
@@ -0,0 +1,3 @@
+title=external-options
+author=admin
+path=content/external-options
diff --git a/documentation/18.11/eiffelstudio/_images/fake-callee-is.jpg b/documentation/18.11/eiffelstudio/_images/fake-callee-is.jpg
new file mode 100644
index 00000000..7c172b36
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/fake-callee-is.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/fake-callee-is.jpg.data b/documentation/18.11/eiffelstudio/_images/fake-callee-is.jpg.data
new file mode 100644
index 00000000..69330a1d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/fake-callee-is.jpg.data
@@ -0,0 +1,3 @@
+title=fake-callee-is
+author=admin
+path=content/fake-callee
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-choose-folder-dialog.png b/documentation/18.11/eiffelstudio/_images/favorites-choose-folder-dialog.png
new file mode 100644
index 00000000..582f3b40
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-choose-folder-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-choose-folder-dialog.png.data b/documentation/18.11/eiffelstudio/_images/favorites-choose-folder-dialog.png.data
new file mode 100644
index 00000000..d2cfb304
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-choose-folder-dialog.png.data
@@ -0,0 +1,3 @@
+title=favorites-choose-folder-dialog
+author=admin
+path=content/favorites-choose-folder-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog-move-to.png b/documentation/18.11/eiffelstudio/_images/favorites-dialog-move-to.png
new file mode 100644
index 00000000..ca496bbe
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-dialog-move-to.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog-move-to.png.data b/documentation/18.11/eiffelstudio/_images/favorites-dialog-move-to.png.data
new file mode 100644
index 00000000..a677a94d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-dialog-move-to.png.data
@@ -0,0 +1,3 @@
+title=favorites-dialog-move-to
+author=admin
+path=content/favorites-dialog-move
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-class.png b/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-class.png
new file mode 100644
index 00000000..d1da8475
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-class.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-class.png.data b/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-class.png.data
new file mode 100644
index 00000000..4731f55d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-class.png.data
@@ -0,0 +1,3 @@
+title=favorites-dialog-new-class
+author=admin
+path=content/favorites-dialog-new-class
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-folder.png b/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-folder.png
new file mode 100644
index 00000000..22ac8b8e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-folder.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-folder.png.data b/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-folder.png.data
new file mode 100644
index 00000000..a07f74e1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-dialog-new-folder.png.data
@@ -0,0 +1,3 @@
+title=favorites-dialog-new-folder
+author=admin
+path=content/favorites-dialog-new-folder
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog-remove.png b/documentation/18.11/eiffelstudio/_images/favorites-dialog-remove.png
new file mode 100644
index 00000000..e8179190
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-dialog-remove.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog-remove.png.data b/documentation/18.11/eiffelstudio/_images/favorites-dialog-remove.png.data
new file mode 100644
index 00000000..84ec5c98
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-dialog-remove.png.data
@@ -0,0 +1,3 @@
+title=favorites-dialog-remove
+author=admin
+path=content/favorites-dialog-remove
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog.png b/documentation/18.11/eiffelstudio/_images/favorites-dialog.png
new file mode 100644
index 00000000..fa673ceb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-dialog.png.data b/documentation/18.11/eiffelstudio/_images/favorites-dialog.png.data
new file mode 100644
index 00000000..1480cf4b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-dialog.png.data
@@ -0,0 +1,3 @@
+title=favorites-dialog
+author=admin
+path=content/favorites-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-new-class-dialog.png b/documentation/18.11/eiffelstudio/_images/favorites-new-class-dialog.png
new file mode 100644
index 00000000..0405d8cd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-new-class-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-new-class-dialog.png.data b/documentation/18.11/eiffelstudio/_images/favorites-new-class-dialog.png.data
new file mode 100644
index 00000000..fc48a686
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-new-class-dialog.png.data
@@ -0,0 +1,3 @@
+title=favorites-new-class-dialog
+author=admin
+path=content/favorites-new-class-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-new-folder-dialog.png b/documentation/18.11/eiffelstudio/_images/favorites-new-folder-dialog.png
new file mode 100644
index 00000000..5fe49cc9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-new-folder-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-new-folder-dialog.png.data b/documentation/18.11/eiffelstudio/_images/favorites-new-folder-dialog.png.data
new file mode 100644
index 00000000..250b42af
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-new-folder-dialog.png.data
@@ -0,0 +1,3 @@
+title=favorites-new-folder-dialog
+author=admin
+path=content/favorites-new-folder-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-tool.png b/documentation/18.11/eiffelstudio/_images/favorites-tool.png
new file mode 100644
index 00000000..ed4fe7e8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-tool.png.data b/documentation/18.11/eiffelstudio/_images/favorites-tool.png.data
new file mode 100644
index 00000000..b8ba059c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-tool.png.data
@@ -0,0 +1,3 @@
+title=favorites-tool
+author=admin
+path=content/favorites-tool
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-tree.png b/documentation/18.11/eiffelstudio/_images/favorites-tree.png
new file mode 100644
index 00000000..db29a873
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/favorites-tree.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/favorites-tree.png.data b/documentation/18.11/eiffelstudio/_images/favorites-tree.png.data
new file mode 100644
index 00000000..7c2c990d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/favorites-tree.png.data
@@ -0,0 +1,3 @@
+title=favorites-tree
+author=admin
+path=content/favorites-tree
diff --git a/documentation/18.11/eiffelstudio/_images/feature-ancestors-icon.png b/documentation/18.11/eiffelstudio/_images/feature-ancestors-icon.png
new file mode 100644
index 00000000..f53576bb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-ancestors-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-ancestors-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-ancestors-icon.png.data
new file mode 100644
index 00000000..1fe999d8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-ancestors-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-ancestors-icon
+author=admin
+path=content/feature-ancestors-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-assignees-icon.png b/documentation/18.11/eiffelstudio/_images/feature-assignees-icon.png
new file mode 100644
index 00000000..0e313f9d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-assignees-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-assignees-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-assignees-icon.png.data
new file mode 100644
index 00000000..21297657
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-assignees-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-assignees-icon
+author=admin
+path=content/feature-assignees-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-assigners-icon.png b/documentation/18.11/eiffelstudio/_images/feature-assigners-icon.png
new file mode 100644
index 00000000..b67a055d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-assigners-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-assigners-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-assigners-icon.png.data
new file mode 100644
index 00000000..31626188
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-assigners-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-assigners-icon
+author=admin
+path=content/feature-assigners-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-attribute-icon.png b/documentation/18.11/eiffelstudio/_images/feature-attribute-icon.png
new file mode 100644
index 00000000..ded5bbf9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-attribute-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-attribute-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-attribute-icon.png.data
new file mode 100644
index 00000000..cf1a3f87
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-attribute-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-attribute-icon
+author=admin
+path=content/feature-attribute-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-callees-icon.png b/documentation/18.11/eiffelstudio/_images/feature-callees-icon.png
new file mode 100644
index 00000000..9767cbf6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-callees-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-callees-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-callees-icon.png.data
new file mode 100644
index 00000000..2576d4ed
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-callees-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-callees-icon
+author=admin
+path=content/feature-callees-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-callers-icon.png b/documentation/18.11/eiffelstudio/_images/feature-callers-icon.png
new file mode 100644
index 00000000..a6b35062
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-callers-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-callers-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-callers-icon.png.data
new file mode 100644
index 00000000..ccb46345
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-callers-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-callers-icon
+author=admin
+path=content/feature-callers-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-creaters-icon.png b/documentation/18.11/eiffelstudio/_images/feature-creaters-icon.png
new file mode 100644
index 00000000..4faf3af4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-creaters-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-creaters-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-creaters-icon.png.data
new file mode 100644
index 00000000..d09a5ec3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-creaters-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-creations-icon
+author=halw
+path=content/feature-creations-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-creators-icon.png b/documentation/18.11/eiffelstudio/_images/feature-creators-icon.png
new file mode 100644
index 00000000..84e0781f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-creators-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-creators-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-creators-icon.png.data
new file mode 100644
index 00000000..761eefbe
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-creators-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-creators-icon
+author=admin
+path=content/feature-creators-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-deferred-icon.png b/documentation/18.11/eiffelstudio/_images/feature-deferred-icon.png
new file mode 100644
index 00000000..400a94b5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-deferred-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-deferred-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-deferred-icon.png.data
new file mode 100644
index 00000000..1d1f167f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-deferred-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-deferred-icon
+author=admin
+path=content/feature-deferred-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-descendents-icon.png b/documentation/18.11/eiffelstudio/_images/feature-descendents-icon.png
new file mode 100644
index 00000000..72fc38a6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-descendents-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-descendents-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-descendents-icon.png.data
new file mode 100644
index 00000000..4ee66339
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-descendents-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-descendents-icon
+author=admin
+path=content/feature-descendents-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-external-icon.png b/documentation/18.11/eiffelstudio/_images/feature-external-icon.png
new file mode 100644
index 00000000..31b26e17
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-external-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-external-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-external-icon.png.data
new file mode 100644
index 00000000..08a6b220
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-external-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-external-icon
+author=admin
+path=content/feature-external-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-format-bar.png b/documentation/18.11/eiffelstudio/_images/feature-format-bar.png
new file mode 100644
index 00000000..7823a97b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-format-bar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-format-bar.png.data b/documentation/18.11/eiffelstudio/_images/feature-format-bar.png.data
new file mode 100644
index 00000000..e6edb1e6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-format-bar.png.data
@@ -0,0 +1,3 @@
+title=feature-format-bar
+author=admin
+path=content/feature-format-bar
diff --git a/documentation/18.11/eiffelstudio/_images/feature-frozen-routine-icon.png b/documentation/18.11/eiffelstudio/_images/feature-frozen-routine-icon.png
new file mode 100644
index 00000000..62fb6bd4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-frozen-routine-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-frozen-routine-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-frozen-routine-icon.png.data
new file mode 100644
index 00000000..5101decf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-frozen-routine-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-frozen-routine-icon
+author=admin
+path=content/feature-frozen-routine-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-homonyms-icon.png b/documentation/18.11/eiffelstudio/_images/feature-homonyms-icon.png
new file mode 100644
index 00000000..1aa93098
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-homonyms-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-homonyms-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-homonyms-icon.png.data
new file mode 100644
index 00000000..5f85cb58
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-homonyms-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-homonyms-icon
+author=admin
+path=content/feature-homonyms-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-implementers-icon.png b/documentation/18.11/eiffelstudio/_images/feature-implementers-icon.png
new file mode 100644
index 00000000..0f9c76c7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-implementers-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-implementers-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-implementers-icon.png.data
new file mode 100644
index 00000000..b3ce3146
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-implementers-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-implementers-icon
+author=admin
+path=content/feature-implementers-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-once-icon.png b/documentation/18.11/eiffelstudio/_images/feature-once-icon.png
new file mode 100644
index 00000000..748258f9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-once-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-once-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-once-icon.png.data
new file mode 100644
index 00000000..3eba596a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-once-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-once-icon
+author=admin
+path=content/feature-once-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-routine-icon.png b/documentation/18.11/eiffelstudio/_images/feature-routine-icon.png
new file mode 100644
index 00000000..966c9c96
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-routine-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-routine-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-routine-icon.png.data
new file mode 100644
index 00000000..eab74d2c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-routine-icon.png.data
@@ -0,0 +1,3 @@
+title=feature-routine-icon
+author=admin
+path=content/feature-routine-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-signatures-icon.png b/documentation/18.11/eiffelstudio/_images/feature-signatures-icon.png
new file mode 100644
index 00000000..ffaea53f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-signatures-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-signatures-icon.png.data b/documentation/18.11/eiffelstudio/_images/feature-signatures-icon.png.data
new file mode 100644
index 00000000..ea61119c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-signatures-icon.png.data
@@ -0,0 +1,3 @@
+title=feature signatures icon
+author=halw
+path=content/feature-signatures-icon
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tab_0.png b/documentation/18.11/eiffelstudio/_images/feature-tab_0.png
new file mode 100644
index 00000000..5e942329
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-tab_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tab_0.png.data b/documentation/18.11/eiffelstudio/_images/feature-tab_0.png.data
new file mode 100644
index 00000000..73d00fb2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-tab_0.png.data
@@ -0,0 +1,3 @@
+title=feature-tab
+author=halw
+path=content/feature-tab
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tool-signature-button.png b/documentation/18.11/eiffelstudio/_images/feature-tool-signature-button.png
new file mode 100644
index 00000000..a9e77c36
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-tool-signature-button.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tool-signature-button.png.data b/documentation/18.11/eiffelstudio/_images/feature-tool-signature-button.png.data
new file mode 100644
index 00000000..158f0472
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-tool-signature-button.png.data
@@ -0,0 +1,3 @@
+title=feature-tool-signature-button
+author=admin
+path=content/feature-tool-signature-button
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tool-signature.png b/documentation/18.11/eiffelstudio/_images/feature-tool-signature.png
new file mode 100644
index 00000000..045421fe
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-tool-signature.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tool-signature.png.data b/documentation/18.11/eiffelstudio/_images/feature-tool-signature.png.data
new file mode 100644
index 00000000..4eb96601
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-tool-signature.png.data
@@ -0,0 +1,3 @@
+title=feature-tool-signature
+author=admin
+path=content/feature-tool-signature
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tool.png b/documentation/18.11/eiffelstudio/_images/feature-tool.png
new file mode 100644
index 00000000..603b857c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tool.png.data b/documentation/18.11/eiffelstudio/_images/feature-tool.png.data
new file mode 100644
index 00000000..87dc32a3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-tool.png.data
@@ -0,0 +1,3 @@
+title=feature-tool
+author=admin
+path=content/feature-tool
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tree.png b/documentation/18.11/eiffelstudio/_images/feature-tree.png
new file mode 100644
index 00000000..acf4df46
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-tree.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-tree.png.data b/documentation/18.11/eiffelstudio/_images/feature-tree.png.data
new file mode 100644
index 00000000..1914a1c4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-tree.png.data
@@ -0,0 +1,3 @@
+title=feature-tree
+author=admin
+path=content/feature-tree
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-1-argument.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-1-argument.png
new file mode 100644
index 00000000..29905ade
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-1-argument.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-1-argument.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-1-argument.png.data
new file mode 100644
index 00000000..756dbaf5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-1-argument.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-1-argument
+author=admin
+path=content/feature-wizard-1-argument
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-3-arguments.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-3-arguments.png
new file mode 100644
index 00000000..d2ecf6c1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-3-arguments.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-3-arguments.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-3-arguments.png.data
new file mode 100644
index 00000000..5d7e31c3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-3-arguments.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-3-arguments
+author=admin
+path=content/feature-wizard-3-arguments
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute-example.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute-example.png
new file mode 100644
index 00000000..df3508a1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute-example.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute-example.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute-example.png.data
new file mode 100644
index 00000000..c9379ffb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute-example.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-attribute-example
+author=admin
+path=content/feature-wizard-attribute-example
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute.png
new file mode 100644
index 00000000..7363fc7b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute.png.data
new file mode 100644
index 00000000..5cfe9d5c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-attribute.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-attribute
+author=admin
+path=content/feature-wizard-attribute
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-clausenames.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-clausenames.png
new file mode 100644
index 00000000..306ba0ee
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-clausenames.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-clausenames.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-clausenames.png.data
new file mode 100644
index 00000000..124688e3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-clausenames.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-clausenames
+author=admin
+path=content/feature-wizard-clausenames
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-comment.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-comment.png
new file mode 100644
index 00000000..fffd3b24
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-comment.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-comment.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-comment.png.data
new file mode 100644
index 00000000..bb66bcc6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-comment.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-comment
+author=admin
+path=content/feature-wizard-comment
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-complextype.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-complextype.png
new file mode 100644
index 00000000..11b35e1f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-complextype.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-complextype.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-complextype.png.data
new file mode 100644
index 00000000..0cd63d8c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-complextype.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-complextype
+author=admin
+path=content/feature-wizard-complextype
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-export.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-export.png
new file mode 100644
index 00000000..8349c8bf
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-export.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-export.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-export.png.data
new file mode 100644
index 00000000..2aec7341
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-export.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-export
+author=admin
+path=content/feature-wizard-export
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-function-example.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-function-example.png
new file mode 100644
index 00000000..2da833e3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-function-example.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-function-example.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-function-example.png.data
new file mode 100644
index 00000000..4dddb826
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-function-example.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-function-example
+author=admin
+path=content/feature-wizard-function-example
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-function.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-function.png
new file mode 100644
index 00000000..64d8a685
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-function.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-function.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-function.png.data
new file mode 100644
index 00000000..5c4ef629
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-function.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-function
+author=admin
+path=content/feature-wizard-function
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-generictype.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-generictype.png
new file mode 100644
index 00000000..df5ff938
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-generictype.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-generictype.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-generictype.png.data
new file mode 100644
index 00000000..67f5d5f3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-generictype.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-generictype
+author=admin
+path=content/feature-wizard-generictype
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-generictyperec.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-generictyperec.png
new file mode 100644
index 00000000..70ea00a5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-generictyperec.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-generictyperec.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-generictyperec.png.data
new file mode 100644
index 00000000..56fa1bba
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-generictyperec.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-generictyperec
+author=admin
+path=content/feature-wizard-generictyperec
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant-selected.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant-selected.png
new file mode 100644
index 00000000..58e62577
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant-selected.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant-selected.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant-selected.png.data
new file mode 100644
index 00000000..b9b5f17c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant-selected.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-invariant-selected
+author=admin
+path=content/feature-wizard-invariant-selected
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant.png
new file mode 100644
index 00000000..02723887
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant.png.data
new file mode 100644
index 00000000..0aa0db74
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-invariant.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-invariant
+author=admin
+path=content/feature-wizard-invariant
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure-example.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure-example.png
new file mode 100644
index 00000000..010822c7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure-example.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure-example.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure-example.png.data
new file mode 100644
index 00000000..77a1e118
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure-example.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-procedure-example
+author=admin
+path=content/feature-wizard-procedure-example
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure.png
new file mode 100644
index 00000000..de43fad8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure.png.data
new file mode 100644
index 00000000..58ef1574
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-procedure.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-procedure
+author=admin
+path=content/feature-wizard-procedure
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure-example.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure-example.png
new file mode 100644
index 00000000..165b1e86
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure-example.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure-example.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure-example.png.data
new file mode 100644
index 00000000..ba29ae5e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure-example.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-setprocedure-example
+author=admin
+path=content/feature-wizard-setprocedure-example
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure.png
new file mode 100644
index 00000000..37cedd89
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure.png.data
new file mode 100644
index 00000000..16a3ccea
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-setprocedure.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-setprocedure
+author=admin
+path=content/feature-wizard-setprocedure
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-tupletype2.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-tupletype2.png
new file mode 100644
index 00000000..de9722c8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-tupletype2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-tupletype2.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-tupletype2.png.data
new file mode 100644
index 00000000..a81d1b22
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-tupletype2.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-tupletype2
+author=admin
+path=content/feature-wizard-tupletype2
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-typeselection.png b/documentation/18.11/eiffelstudio/_images/feature-wizard-typeselection.png
new file mode 100644
index 00000000..66707440
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard-typeselection.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard-typeselection.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard-typeselection.png.data
new file mode 100644
index 00000000..93855d35
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard-typeselection.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard-typeselection
+author=admin
+path=content/feature-wizard-typeselection
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard.png b/documentation/18.11/eiffelstudio/_images/feature-wizard.png
new file mode 100644
index 00000000..17b80399
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature-wizard.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature-wizard.png.data b/documentation/18.11/eiffelstudio/_images/feature-wizard.png.data
new file mode 100644
index 00000000..21e23500
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature-wizard.png.data
@@ -0,0 +1,3 @@
+title=feature-wizard
+author=admin
+path=content/feature-wizard
diff --git a/documentation/18.11/eiffelstudio/_images/feature_call_auto-complete_example_1.png b/documentation/18.11/eiffelstudio/_images/feature_call_auto-complete_example_1.png
new file mode 100644
index 00000000..b79f57c0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/feature_call_auto-complete_example_1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/feature_call_auto-complete_example_1.png.data b/documentation/18.11/eiffelstudio/_images/feature_call_auto-complete_example_1.png.data
new file mode 100644
index 00000000..bce1e88d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/feature_call_auto-complete_example_1.png.data
@@ -0,0 +1,3 @@
+title=feature call auto complete example 1
+author=halw
+path=content/feature-call-auto-complete-example-1
diff --git a/documentation/18.11/eiffelstudio/_images/features-tab-icon.png b/documentation/18.11/eiffelstudio/_images/features-tab-icon.png
new file mode 100644
index 00000000..d39b5dda
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/features-tab-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/features-tab-icon.png.data b/documentation/18.11/eiffelstudio/_images/features-tab-icon.png.data
new file mode 100644
index 00000000..a9dfe7e2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/features-tab-icon.png.data
@@ -0,0 +1,3 @@
+title=features-tab
+author=halw
+path=content/features-tab
diff --git a/documentation/18.11/eiffelstudio/_images/filter-active.png b/documentation/18.11/eiffelstudio/_images/filter-active.png
new file mode 100644
index 00000000..315e9201
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/filter-active.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/filter-active.png.data b/documentation/18.11/eiffelstudio/_images/filter-active.png.data
new file mode 100644
index 00000000..98fb33d9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/filter-active.png.data
@@ -0,0 +1,3 @@
+title=filter-active
+author=admin
+path=content/filter-active
diff --git a/documentation/18.11/eiffelstudio/_images/filter.png b/documentation/18.11/eiffelstudio/_images/filter.png
new file mode 100644
index 00000000..aed10c99
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/filter.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/filter.png.data b/documentation/18.11/eiffelstudio/_images/filter.png.data
new file mode 100644
index 00000000..70af0f2d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/filter.png.data
@@ -0,0 +1,3 @@
+title=filter
+author=admin
+path=content/filter
diff --git a/documentation/18.11/eiffelstudio/_images/folder-assembly-icon.png b/documentation/18.11/eiffelstudio/_images/folder-assembly-icon.png
new file mode 100644
index 00000000..3793b09e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-assembly-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-assembly-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-assembly-icon.png.data
new file mode 100644
index 00000000..784c5a26
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-assembly-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-assembly-icon
+author=admin
+path=content/folder-assembly-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-blank-icon.png b/documentation/18.11/eiffelstudio/_images/folder-blank-icon.png
new file mode 100644
index 00000000..6c64b73b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-blank-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-blank-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-blank-icon.png.data
new file mode 100644
index 00000000..cb0f4708
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-blank-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-blank-icon
+author=admin
+path=content/folder-blank-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-cluster-icon.png b/documentation/18.11/eiffelstudio/_images/folder-cluster-icon.png
new file mode 100644
index 00000000..03d4a06b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-cluster-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-cluster-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-cluster-icon.png.data
new file mode 100644
index 00000000..5b6558fb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-cluster-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-cluster-icon
+author=admin
+path=content/folder-cluster-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-cluster-readonly-icon.png b/documentation/18.11/eiffelstudio/_images/folder-cluster-readonly-icon.png
new file mode 100644
index 00000000..6a339c4b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-cluster-readonly-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-cluster-readonly-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-cluster-readonly-icon.png.data
new file mode 100644
index 00000000..3e4e1dcf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-cluster-readonly-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-cluster-readonly-icon
+author=admin
+path=content/folder-cluster-readonly-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-features-all-icon.png b/documentation/18.11/eiffelstudio/_images/folder-features-all-icon.png
new file mode 100644
index 00000000..cb54a51d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-features-all-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-features-all-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-features-all-icon.png.data
new file mode 100644
index 00000000..5b2fd3d7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-features-all-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-features-all-icon
+author=admin
+path=content/folder-features-all-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-features-none-icon.png b/documentation/18.11/eiffelstudio/_images/folder-features-none-icon.png
new file mode 100644
index 00000000..d4cc1f9a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-features-none-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-features-none-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-features-none-icon.png.data
new file mode 100644
index 00000000..ffbd7a14
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-features-none-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-features-none-icon
+author=admin
+path=content/folder-features-none-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-features-some-icon.png b/documentation/18.11/eiffelstudio/_images/folder-features-some-icon.png
new file mode 100644
index 00000000..e14effa8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-features-some-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-features-some-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-features-some-icon.png.data
new file mode 100644
index 00000000..58629b89
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-features-some-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-features-some-icon
+author=admin
+path=content/folder-features-some-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-hidden-cluster-icon.png b/documentation/18.11/eiffelstudio/_images/folder-hidden-cluster-icon.png
new file mode 100644
index 00000000..cba561a0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-hidden-cluster-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-hidden-cluster-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-hidden-cluster-icon.png.data
new file mode 100644
index 00000000..f34ea101
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-hidden-cluster-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-hidden-cluster-icon
+author=admin
+path=content/folder-hidden-cluster-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-library-icon.png b/documentation/18.11/eiffelstudio/_images/folder-library-icon.png
new file mode 100644
index 00000000..9cc3f552
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-library-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-library-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-library-icon.png.data
new file mode 100644
index 00000000..08ae32c6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-library-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-library-icon
+author=admin
+path=content/folder-library-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-namespace-icon.png b/documentation/18.11/eiffelstudio/_images/folder-namespace-icon.png
new file mode 100644
index 00000000..f88368d6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-namespace-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-namespace-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-namespace-icon.png.data
new file mode 100644
index 00000000..08eb7100
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-namespace-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-namespace-icon
+author=admin
+path=content/folder-namespace-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-override-cluster-icon.png b/documentation/18.11/eiffelstudio/_images/folder-override-cluster-icon.png
new file mode 100644
index 00000000..cbb5f5e8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-override-cluster-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-override-cluster-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-override-cluster-icon.png.data
new file mode 100644
index 00000000..a88555d1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-override-cluster-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-override-cluster-icon
+author=admin
+path=content/folder-override-cluster-icon
diff --git a/documentation/18.11/eiffelstudio/_images/folder-target-icon.png b/documentation/18.11/eiffelstudio/_images/folder-target-icon.png
new file mode 100644
index 00000000..6f565f8b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/folder-target-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/folder-target-icon.png.data b/documentation/18.11/eiffelstudio/_images/folder-target-icon.png.data
new file mode 100644
index 00000000..b62be2de
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/folder-target-icon.png.data
@@ -0,0 +1,3 @@
+title=folder-target-icon
+author=admin
+path=content/folder-target-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-copy-icon.png b/documentation/18.11/eiffelstudio/_images/general-copy-icon.png
new file mode 100644
index 00000000..13cd4b7a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-copy-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-copy-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-copy-icon.png.data
new file mode 100644
index 00000000..0a086e44
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-copy-icon.png.data
@@ -0,0 +1,3 @@
+title=general-copy-icon
+author=admin
+path=content/general-copy-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-cut-icon.png b/documentation/18.11/eiffelstudio/_images/general-cut-icon.png
new file mode 100644
index 00000000..541562df
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-cut-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-cut-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-cut-icon.png.data
new file mode 100644
index 00000000..9bb11ddc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-cut-icon.png.data
@@ -0,0 +1,3 @@
+title=general-cut-icon
+author=admin
+path=content/general-cut-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-debug-mode.png b/documentation/18.11/eiffelstudio/_images/general-debug-mode.png
new file mode 100644
index 00000000..034cdef5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-debug-mode.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-debug-mode.png.data b/documentation/18.11/eiffelstudio/_images/general-debug-mode.png.data
new file mode 100644
index 00000000..a8b33bc8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-debug-mode.png.data
@@ -0,0 +1,3 @@
+title=general-debug-mode
+author=admin
+path=content/general-debug-mode
diff --git a/documentation/18.11/eiffelstudio/_images/general-delete-icon.png b/documentation/18.11/eiffelstudio/_images/general-delete-icon.png
new file mode 100644
index 00000000..76f179e0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-delete-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-delete-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-delete-icon.png.data
new file mode 100644
index 00000000..b68850b8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-delete-icon.png.data
@@ -0,0 +1,3 @@
+title=general-delete-icon
+author=admin
+path=content/general-delete-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-edit-icon.png b/documentation/18.11/eiffelstudio/_images/general-edit-icon.png
new file mode 100644
index 00000000..661b2c20
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-edit-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-edit-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-edit-icon.png.data
new file mode 100644
index 00000000..8b985e4a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-edit-icon.png.data
@@ -0,0 +1,3 @@
+title=general-edit-icon
+author=admin
+path=content/general-edit-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-edition-mode.png b/documentation/18.11/eiffelstudio/_images/general-edition-mode.png
new file mode 100644
index 00000000..d31763ec
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-edition-mode.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-edition-mode.png.data b/documentation/18.11/eiffelstudio/_images/general-edition-mode.png.data
new file mode 100644
index 00000000..bc65b530
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-edition-mode.png.data
@@ -0,0 +1,3 @@
+title=general-edition-mode
+author=admin
+path=content/general-edition-mode
diff --git a/documentation/18.11/eiffelstudio/_images/general-error-icon.png b/documentation/18.11/eiffelstudio/_images/general-error-icon.png
new file mode 100644
index 00000000..92faae99
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-error-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-error-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-error-icon.png.data
new file mode 100644
index 00000000..dc5d1946
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-error-icon.png.data
@@ -0,0 +1,3 @@
+title=general-error-icon
+author=admin
+path=content/general-error-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-open-icon.png b/documentation/18.11/eiffelstudio/_images/general-open-icon.png
new file mode 100644
index 00000000..df37ed22
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-open-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-open-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-open-icon.png.data
new file mode 100644
index 00000000..f6d9bb26
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-open-icon.png.data
@@ -0,0 +1,3 @@
+title=general-open-icon
+author=admin
+path=content/general-open-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-paste-icon.png b/documentation/18.11/eiffelstudio/_images/general-paste-icon.png
new file mode 100644
index 00000000..bf047fe7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-paste-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-paste-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-paste-icon.png.data
new file mode 100644
index 00000000..b9c51e26
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-paste-icon.png.data
@@ -0,0 +1,3 @@
+title=general-paste-icon
+author=admin
+path=content/general-paste-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-redo-icon.png b/documentation/18.11/eiffelstudio/_images/general-redo-icon.png
new file mode 100644
index 00000000..8631cce4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-redo-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-redo-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-redo-icon.png.data
new file mode 100644
index 00000000..8ecd8750
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-redo-icon.png.data
@@ -0,0 +1,3 @@
+title=general-redo-icon
+author=admin
+path=content/general-redo-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-reset-icon.png b/documentation/18.11/eiffelstudio/_images/general-reset-icon.png
new file mode 100644
index 00000000..8ebc3e87
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-reset-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-reset-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-reset-icon.png.data
new file mode 100644
index 00000000..3746248a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-reset-icon.png.data
@@ -0,0 +1,3 @@
+title=general-reset-icon
+author=admin
+path=content/general-reset-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-save-icon.png b/documentation/18.11/eiffelstudio/_images/general-save-icon.png
new file mode 100644
index 00000000..49e231b5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-save-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-save-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-save-icon.png.data
new file mode 100644
index 00000000..01af72ba
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-save-icon.png.data
@@ -0,0 +1,3 @@
+title=general-save-icon
+author=admin
+path=content/general-save-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-search-icon.png b/documentation/18.11/eiffelstudio/_images/general-search-icon.png
new file mode 100644
index 00000000..e2b072a8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-search-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-search-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-search-icon.png.data
new file mode 100644
index 00000000..9aab3b05
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-search-icon.png.data
@@ -0,0 +1,3 @@
+title=general-search-icon
+author=admin
+path=content/general-search-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-tick-icon.png b/documentation/18.11/eiffelstudio/_images/general-tick-icon.png
new file mode 100644
index 00000000..a7665664
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-tick-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-tick-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-tick-icon.png.data
new file mode 100644
index 00000000..54cefcd0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-tick-icon.png.data
@@ -0,0 +1,3 @@
+title=general-tick-icon
+author=admin
+path=content/general-tick-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-toogle-icon.png b/documentation/18.11/eiffelstudio/_images/general-toogle-icon.png
new file mode 100644
index 00000000..14d4e15d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-toogle-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-toogle-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-toogle-icon.png.data
new file mode 100644
index 00000000..1149b6d1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-toogle-icon.png.data
@@ -0,0 +1,3 @@
+title=general-toogle-icon
+author=admin
+path=content/general-toogle-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-undo-history-icon.png b/documentation/18.11/eiffelstudio/_images/general-undo-history-icon.png
new file mode 100644
index 00000000..7923d165
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-undo-history-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-undo-history-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-undo-history-icon.png.data
new file mode 100644
index 00000000..4d9f13b8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-undo-history-icon.png.data
@@ -0,0 +1,3 @@
+title=general-undo-history-icon
+author=admin
+path=content/general-undo-history-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-undo-icon.png b/documentation/18.11/eiffelstudio/_images/general-undo-icon.png
new file mode 100644
index 00000000..373a8ed4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-undo-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-undo-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-undo-icon.png.data
new file mode 100644
index 00000000..96d3ed92
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-undo-icon.png.data
@@ -0,0 +1,3 @@
+title=general-undo-icon
+author=admin
+path=content/general-undo-icon
diff --git a/documentation/18.11/eiffelstudio/_images/general-word-wrap-icon.png b/documentation/18.11/eiffelstudio/_images/general-word-wrap-icon.png
new file mode 100644
index 00000000..1e0237f9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/general-word-wrap-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/general-word-wrap-icon.png.data b/documentation/18.11/eiffelstudio/_images/general-word-wrap-icon.png.data
new file mode 100644
index 00000000..215c5af9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/general-word-wrap-icon.png.data
@@ -0,0 +1,3 @@
+title=general-word-wrap-icon
+author=admin
+path=content/general-word-wrap-icon
diff --git a/documentation/18.11/eiffelstudio/_images/groups-tool_1.png b/documentation/18.11/eiffelstudio/_images/groups-tool_1.png
new file mode 100644
index 00000000..3f8a7d07
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/groups-tool_1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/groups-tool_1.png.data b/documentation/18.11/eiffelstudio/_images/groups-tool_1.png.data
new file mode 100644
index 00000000..9030165e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/groups-tool_1.png.data
@@ -0,0 +1,3 @@
+title=groups-tool
+author=halw
+path=content/groups-tool
diff --git a/documentation/18.11/eiffelstudio/_images/hide-non-matching-entries-icon.png b/documentation/18.11/eiffelstudio/_images/hide-non-matching-entries-icon.png
new file mode 100644
index 00000000..953835a7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/hide-non-matching-entries-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/hide-non-matching-entries-icon.png.data b/documentation/18.11/eiffelstudio/_images/hide-non-matching-entries-icon.png.data
new file mode 100644
index 00000000..77296650
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/hide-non-matching-entries-icon.png.data
@@ -0,0 +1,3 @@
+title=hide non-matching entries icon
+author=halw
+path=content/hide-non-matching-entries-icon
diff --git a/documentation/18.11/eiffelstudio/_images/history-tool.png b/documentation/18.11/eiffelstudio/_images/history-tool.png
new file mode 100644
index 00000000..b656c44c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/history-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/history-tool.png.data b/documentation/18.11/eiffelstudio/_images/history-tool.png.data
new file mode 100644
index 00000000..df4d8c2c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/history-tool.png.data
@@ -0,0 +1,3 @@
+title=history-tool
+author=admin
+path=content/history-tool
diff --git a/documentation/18.11/eiffelstudio/_images/hood1.png b/documentation/18.11/eiffelstudio/_images/hood1.png
new file mode 100644
index 00000000..a9fcedcb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/hood1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/hood1.png.data b/documentation/18.11/eiffelstudio/_images/hood1.png.data
new file mode 100644
index 00000000..113f95b7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/hood1.png.data
@@ -0,0 +1,3 @@
+title=hood1
+author=admin
+path=content/hood1
diff --git a/documentation/18.11/eiffelstudio/_images/hood2.png b/documentation/18.11/eiffelstudio/_images/hood2.png
new file mode 100644
index 00000000..a022a90b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/hood2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/hood2.png.data b/documentation/18.11/eiffelstudio/_images/hood2.png.data
new file mode 100644
index 00000000..45f80108
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/hood2.png.data
@@ -0,0 +1,3 @@
+title=hood2
+author=admin
+path=content/hood2
diff --git a/documentation/18.11/eiffelstudio/_images/hood3.jpg b/documentation/18.11/eiffelstudio/_images/hood3.jpg
new file mode 100644
index 00000000..78cc1c6e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/hood3.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/hood3.jpg.data b/documentation/18.11/eiffelstudio/_images/hood3.jpg.data
new file mode 100644
index 00000000..d8f4cbd5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/hood3.jpg.data
@@ -0,0 +1,3 @@
+title=hood3
+author=admin
+path=content/hood3
diff --git a/documentation/18.11/eiffelstudio/_images/ildasm-dotnet-naming.png b/documentation/18.11/eiffelstudio/_images/ildasm-dotnet-naming.png
new file mode 100644
index 00000000..8fe0d173
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/ildasm-dotnet-naming.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/ildasm-dotnet-naming.png.data b/documentation/18.11/eiffelstudio/_images/ildasm-dotnet-naming.png.data
new file mode 100644
index 00000000..ac687fd5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/ildasm-dotnet-naming.png.data
@@ -0,0 +1,3 @@
+title=ildasm-dotnet-naming
+author=admin
+path=content/ildasm-dotnet-naming
diff --git a/documentation/18.11/eiffelstudio/_images/ildasm-no-dotnet-naming.png b/documentation/18.11/eiffelstudio/_images/ildasm-no-dotnet-naming.png
new file mode 100644
index 00000000..93533168
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/ildasm-no-dotnet-naming.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/ildasm-no-dotnet-naming.png.data b/documentation/18.11/eiffelstudio/_images/ildasm-no-dotnet-naming.png.data
new file mode 100644
index 00000000..0f474a53
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/ildasm-no-dotnet-naming.png.data
@@ -0,0 +1,3 @@
+title=ildasm-no-dotnet-naming
+author=admin
+path=content/ildasm-no-dotnet-naming
diff --git a/documentation/18.11/eiffelstudio/_images/index-140.png b/documentation/18.11/eiffelstudio/_images/index-140.png
new file mode 100644
index 00000000..0867d157
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-140.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-140.png.data b/documentation/18.11/eiffelstudio/_images/index-140.png.data
new file mode 100644
index 00000000..9f819877
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-140.png.data
@@ -0,0 +1,3 @@
+title=index-140
+author=admin
+path=content/index-140
diff --git a/documentation/18.11/eiffelstudio/_images/index-141.png b/documentation/18.11/eiffelstudio/_images/index-141.png
new file mode 100644
index 00000000..eae703c7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-141.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-141.png.data b/documentation/18.11/eiffelstudio/_images/index-141.png.data
new file mode 100644
index 00000000..32eb48f0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-141.png.data
@@ -0,0 +1,3 @@
+title=index-141
+author=admin
+path=content/index-141
diff --git a/documentation/18.11/eiffelstudio/_images/index-37.png b/documentation/18.11/eiffelstudio/_images/index-37.png
new file mode 100644
index 00000000..4317b89e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-37.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-37.png.data b/documentation/18.11/eiffelstudio/_images/index-37.png.data
new file mode 100644
index 00000000..65464203
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-37.png.data
@@ -0,0 +1,3 @@
+title=index-37
+author=halw
+path=content/index-37
diff --git a/documentation/18.11/eiffelstudio/_images/index-38.png b/documentation/18.11/eiffelstudio/_images/index-38.png
new file mode 100644
index 00000000..42b6febc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-38.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-38.png.data b/documentation/18.11/eiffelstudio/_images/index-38.png.data
new file mode 100644
index 00000000..a1fc9793
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-38.png.data
@@ -0,0 +1,3 @@
+title=index-38
+author=halw
+path=content/index-38
diff --git a/documentation/18.11/eiffelstudio/_images/index-39.png b/documentation/18.11/eiffelstudio/_images/index-39.png
new file mode 100644
index 00000000..9b31e6d3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-39.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-39.png.data b/documentation/18.11/eiffelstudio/_images/index-39.png.data
new file mode 100644
index 00000000..1e7f153e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-39.png.data
@@ -0,0 +1,3 @@
+title=index-39
+author=halw
+path=content/index-39
diff --git a/documentation/18.11/eiffelstudio/_images/index-40.png b/documentation/18.11/eiffelstudio/_images/index-40.png
new file mode 100644
index 00000000..1a7a5b9a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-40.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-40.png.data b/documentation/18.11/eiffelstudio/_images/index-40.png.data
new file mode 100644
index 00000000..fb09c89c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-40.png.data
@@ -0,0 +1,3 @@
+title=index-40
+author=halw
+path=content/index-40
diff --git a/documentation/18.11/eiffelstudio/_images/index-41.png b/documentation/18.11/eiffelstudio/_images/index-41.png
new file mode 100644
index 00000000..b0cceaf0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-41.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-41.png.data b/documentation/18.11/eiffelstudio/_images/index-41.png.data
new file mode 100644
index 00000000..ff38abfe
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-41.png.data
@@ -0,0 +1,3 @@
+title=index-41
+author=halw
+path=content/index-41
diff --git a/documentation/18.11/eiffelstudio/_images/index-42.png b/documentation/18.11/eiffelstudio/_images/index-42.png
new file mode 100644
index 00000000..940620f6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-42.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-42.png.data b/documentation/18.11/eiffelstudio/_images/index-42.png.data
new file mode 100644
index 00000000..d882afc1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-42.png.data
@@ -0,0 +1,3 @@
+title=index-42
+author=halw
+path=content/index-42
diff --git a/documentation/18.11/eiffelstudio/_images/index-43.png b/documentation/18.11/eiffelstudio/_images/index-43.png
new file mode 100644
index 00000000..81f4dd86
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-43.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-43.png.data b/documentation/18.11/eiffelstudio/_images/index-43.png.data
new file mode 100644
index 00000000..99ed8ae9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-43.png.data
@@ -0,0 +1,3 @@
+title=index-43
+author=halw
+path=content/index-43
diff --git a/documentation/18.11/eiffelstudio/_images/index-44.png b/documentation/18.11/eiffelstudio/_images/index-44.png
new file mode 100644
index 00000000..4d738ba2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-44.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-44.png.data b/documentation/18.11/eiffelstudio/_images/index-44.png.data
new file mode 100644
index 00000000..0d4b55f8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-44.png.data
@@ -0,0 +1,3 @@
+title=index-44
+author=halw
+path=content/index-44
diff --git a/documentation/18.11/eiffelstudio/_images/index-45.png b/documentation/18.11/eiffelstudio/_images/index-45.png
new file mode 100644
index 00000000..9a824b49
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-45.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-45.png.data b/documentation/18.11/eiffelstudio/_images/index-45.png.data
new file mode 100644
index 00000000..77e5b501
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-45.png.data
@@ -0,0 +1,3 @@
+title=index-45
+author=halw
+path=content/index-45
diff --git a/documentation/18.11/eiffelstudio/_images/index-46.png b/documentation/18.11/eiffelstudio/_images/index-46.png
new file mode 100644
index 00000000..466fa450
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-46.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-46.png.data b/documentation/18.11/eiffelstudio/_images/index-46.png.data
new file mode 100644
index 00000000..7b575a97
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-46.png.data
@@ -0,0 +1,3 @@
+title=index-46
+author=halw
+path=content/index-46
diff --git a/documentation/18.11/eiffelstudio/_images/index-47.png b/documentation/18.11/eiffelstudio/_images/index-47.png
new file mode 100644
index 00000000..61fd8c97
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-47.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-47.png.data b/documentation/18.11/eiffelstudio/_images/index-47.png.data
new file mode 100644
index 00000000..85afddce
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-47.png.data
@@ -0,0 +1,3 @@
+title=index-47
+author=halw
+path=content/index-47
diff --git a/documentation/18.11/eiffelstudio/_images/index-48.png b/documentation/18.11/eiffelstudio/_images/index-48.png
new file mode 100644
index 00000000..873e1f8c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-48.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-48.png.data b/documentation/18.11/eiffelstudio/_images/index-48.png.data
new file mode 100644
index 00000000..bc407d32
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-48.png.data
@@ -0,0 +1,3 @@
+title=index-48
+author=halw
+path=content/index-48
diff --git a/documentation/18.11/eiffelstudio/_images/index-49.png b/documentation/18.11/eiffelstudio/_images/index-49.png
new file mode 100644
index 00000000..5838b991
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/index-49.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/index-49.png.data b/documentation/18.11/eiffelstudio/_images/index-49.png.data
new file mode 100644
index 00000000..46bc4df3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/index-49.png.data
@@ -0,0 +1,3 @@
+title=index-49
+author=halw
+path=content/index-49
diff --git a/documentation/18.11/eiffelstudio/_images/information-tool-v71.png b/documentation/18.11/eiffelstudio/_images/information-tool-v71.png
new file mode 100644
index 00000000..413e4ea8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/information-tool-v71.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/information-tool-v71.png.data b/documentation/18.11/eiffelstudio/_images/information-tool-v71.png.data
new file mode 100644
index 00000000..6a8e0363
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/information-tool-v71.png.data
@@ -0,0 +1,3 @@
+title=information tool v71
+author=halw
+path=content/information-tool-v71
diff --git a/documentation/18.11/eiffelstudio/_images/interface1.png b/documentation/18.11/eiffelstudio/_images/interface1.png
new file mode 100644
index 00000000..c89486a3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface1.png.data b/documentation/18.11/eiffelstudio/_images/interface1.png.data
new file mode 100644
index 00000000..3720f16b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface1.png.data
@@ -0,0 +1,3 @@
+title=interface1
+author=admin
+path=content/interface1
diff --git a/documentation/18.11/eiffelstudio/_images/interface10.png b/documentation/18.11/eiffelstudio/_images/interface10.png
new file mode 100644
index 00000000..e189b0c8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface10.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface10.png.data b/documentation/18.11/eiffelstudio/_images/interface10.png.data
new file mode 100644
index 00000000..945dc67e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface10.png.data
@@ -0,0 +1,3 @@
+title=interface10
+author=admin
+path=content/interface10
diff --git a/documentation/18.11/eiffelstudio/_images/interface11.png b/documentation/18.11/eiffelstudio/_images/interface11.png
new file mode 100644
index 00000000..a74839b0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface11.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface11.png.data b/documentation/18.11/eiffelstudio/_images/interface11.png.data
new file mode 100644
index 00000000..15efbdd7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface11.png.data
@@ -0,0 +1,3 @@
+title=interface11
+author=admin
+path=content/interface11
diff --git a/documentation/18.11/eiffelstudio/_images/interface12.png b/documentation/18.11/eiffelstudio/_images/interface12.png
new file mode 100644
index 00000000..1c8eb9a9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface12.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface12.png.data b/documentation/18.11/eiffelstudio/_images/interface12.png.data
new file mode 100644
index 00000000..16ad44dd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface12.png.data
@@ -0,0 +1,3 @@
+title=interface12
+author=admin
+path=content/interface12
diff --git a/documentation/18.11/eiffelstudio/_images/interface13.png b/documentation/18.11/eiffelstudio/_images/interface13.png
new file mode 100644
index 00000000..fb937f3d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface13.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface13.png.data b/documentation/18.11/eiffelstudio/_images/interface13.png.data
new file mode 100644
index 00000000..174c63a0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface13.png.data
@@ -0,0 +1,3 @@
+title=interface13
+author=admin
+path=content/interface13
diff --git a/documentation/18.11/eiffelstudio/_images/interface14.png b/documentation/18.11/eiffelstudio/_images/interface14.png
new file mode 100644
index 00000000..23f48c5a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface14.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface14.png.data b/documentation/18.11/eiffelstudio/_images/interface14.png.data
new file mode 100644
index 00000000..6d41f07b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface14.png.data
@@ -0,0 +1,3 @@
+title=interface14
+author=admin
+path=content/interface14
diff --git a/documentation/18.11/eiffelstudio/_images/interface16.png b/documentation/18.11/eiffelstudio/_images/interface16.png
new file mode 100644
index 00000000..7aae82ec
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface16.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface16.png.data b/documentation/18.11/eiffelstudio/_images/interface16.png.data
new file mode 100644
index 00000000..1d3daf6d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface16.png.data
@@ -0,0 +1,3 @@
+title=interface16
+author=admin
+path=content/interface16
diff --git a/documentation/18.11/eiffelstudio/_images/interface17.png b/documentation/18.11/eiffelstudio/_images/interface17.png
new file mode 100644
index 00000000..e39b08ac
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface17.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface17.png.data b/documentation/18.11/eiffelstudio/_images/interface17.png.data
new file mode 100644
index 00000000..ea54b1a6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface17.png.data
@@ -0,0 +1,3 @@
+title=interface17
+author=admin
+path=content/interface17
diff --git a/documentation/18.11/eiffelstudio/_images/interface18.png b/documentation/18.11/eiffelstudio/_images/interface18.png
new file mode 100644
index 00000000..4f243468
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface18.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface18.png.data b/documentation/18.11/eiffelstudio/_images/interface18.png.data
new file mode 100644
index 00000000..dea3eb11
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface18.png.data
@@ -0,0 +1,3 @@
+title=interface18
+author=admin
+path=content/interface18
diff --git a/documentation/18.11/eiffelstudio/_images/interface19.png b/documentation/18.11/eiffelstudio/_images/interface19.png
new file mode 100644
index 00000000..ccb55de6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface19.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface19.png.data b/documentation/18.11/eiffelstudio/_images/interface19.png.data
new file mode 100644
index 00000000..2bb25ae4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface19.png.data
@@ -0,0 +1,3 @@
+title=interface19
+author=admin
+path=content/interface19
diff --git a/documentation/18.11/eiffelstudio/_images/interface2.png b/documentation/18.11/eiffelstudio/_images/interface2.png
new file mode 100644
index 00000000..7922abc2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface2.png.data b/documentation/18.11/eiffelstudio/_images/interface2.png.data
new file mode 100644
index 00000000..8e84a6ce
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface2.png.data
@@ -0,0 +1,3 @@
+title=interface2
+author=admin
+path=content/interface2
diff --git a/documentation/18.11/eiffelstudio/_images/interface20.png b/documentation/18.11/eiffelstudio/_images/interface20.png
new file mode 100644
index 00000000..24abc021
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface20.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface20.png.data b/documentation/18.11/eiffelstudio/_images/interface20.png.data
new file mode 100644
index 00000000..3e9f0c79
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface20.png.data
@@ -0,0 +1,3 @@
+title=interface20
+author=admin
+path=content/interface20
diff --git a/documentation/18.11/eiffelstudio/_images/interface21.png b/documentation/18.11/eiffelstudio/_images/interface21.png
new file mode 100644
index 00000000..36f5d9c6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface21.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface21.png.data b/documentation/18.11/eiffelstudio/_images/interface21.png.data
new file mode 100644
index 00000000..0a7f6fd8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface21.png.data
@@ -0,0 +1,3 @@
+title=interface21
+author=admin
+path=content/interface21
diff --git a/documentation/18.11/eiffelstudio/_images/interface22.png b/documentation/18.11/eiffelstudio/_images/interface22.png
new file mode 100644
index 00000000..4d56bfb9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface22.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface22.png.data b/documentation/18.11/eiffelstudio/_images/interface22.png.data
new file mode 100644
index 00000000..42812626
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface22.png.data
@@ -0,0 +1,3 @@
+title=interface22
+author=admin
+path=content/interface22
diff --git a/documentation/18.11/eiffelstudio/_images/interface23.png b/documentation/18.11/eiffelstudio/_images/interface23.png
new file mode 100644
index 00000000..7267cb01
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface23.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface23.png.data b/documentation/18.11/eiffelstudio/_images/interface23.png.data
new file mode 100644
index 00000000..427b021e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface23.png.data
@@ -0,0 +1,3 @@
+title=interface23
+author=admin
+path=content/interface23
diff --git a/documentation/18.11/eiffelstudio/_images/interface24.png b/documentation/18.11/eiffelstudio/_images/interface24.png
new file mode 100644
index 00000000..0472bc2c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface24.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface24.png.data b/documentation/18.11/eiffelstudio/_images/interface24.png.data
new file mode 100644
index 00000000..45cdf25d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface24.png.data
@@ -0,0 +1,3 @@
+title=interface24
+author=admin
+path=content/interface24
diff --git a/documentation/18.11/eiffelstudio/_images/interface25.png b/documentation/18.11/eiffelstudio/_images/interface25.png
new file mode 100644
index 00000000..c4c9a6d6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface25.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface25.png.data b/documentation/18.11/eiffelstudio/_images/interface25.png.data
new file mode 100644
index 00000000..62678d79
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface25.png.data
@@ -0,0 +1,3 @@
+title=interface25
+author=admin
+path=content/interface25
diff --git a/documentation/18.11/eiffelstudio/_images/interface3.png b/documentation/18.11/eiffelstudio/_images/interface3.png
new file mode 100644
index 00000000..de0f2f46
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface3.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface3.png.data b/documentation/18.11/eiffelstudio/_images/interface3.png.data
new file mode 100644
index 00000000..314d1a24
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface3.png.data
@@ -0,0 +1,3 @@
+title=interface3
+author=admin
+path=content/interface3
diff --git a/documentation/18.11/eiffelstudio/_images/interface4.png b/documentation/18.11/eiffelstudio/_images/interface4.png
new file mode 100644
index 00000000..8562f7ec
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface4.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface4.png.data b/documentation/18.11/eiffelstudio/_images/interface4.png.data
new file mode 100644
index 00000000..00ade667
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface4.png.data
@@ -0,0 +1,3 @@
+title=interface4
+author=admin
+path=content/interface4
diff --git a/documentation/18.11/eiffelstudio/_images/interface5.png b/documentation/18.11/eiffelstudio/_images/interface5.png
new file mode 100644
index 00000000..4412638d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface5.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface5.png.data b/documentation/18.11/eiffelstudio/_images/interface5.png.data
new file mode 100644
index 00000000..d66c9b05
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface5.png.data
@@ -0,0 +1,3 @@
+title=interface5
+author=admin
+path=content/interface5
diff --git a/documentation/18.11/eiffelstudio/_images/interface6.png b/documentation/18.11/eiffelstudio/_images/interface6.png
new file mode 100644
index 00000000..97ad3cfc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface6.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface6.png.data b/documentation/18.11/eiffelstudio/_images/interface6.png.data
new file mode 100644
index 00000000..0b85fd71
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface6.png.data
@@ -0,0 +1,3 @@
+title=interface6
+author=admin
+path=content/interface6
diff --git a/documentation/18.11/eiffelstudio/_images/interface7.png b/documentation/18.11/eiffelstudio/_images/interface7.png
new file mode 100644
index 00000000..60f4a89b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface7.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface7.png.data b/documentation/18.11/eiffelstudio/_images/interface7.png.data
new file mode 100644
index 00000000..0493aeb3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface7.png.data
@@ -0,0 +1,3 @@
+title=interface7
+author=admin
+path=content/interface7
diff --git a/documentation/18.11/eiffelstudio/_images/interface8.png b/documentation/18.11/eiffelstudio/_images/interface8.png
new file mode 100644
index 00000000..87fe4706
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface8.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface8.png.data b/documentation/18.11/eiffelstudio/_images/interface8.png.data
new file mode 100644
index 00000000..db4cb7ab
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface8.png.data
@@ -0,0 +1,3 @@
+title=interface8
+author=admin
+path=content/interface8
diff --git a/documentation/18.11/eiffelstudio/_images/interface9.png b/documentation/18.11/eiffelstudio/_images/interface9.png
new file mode 100644
index 00000000..c667d42c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/interface9.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/interface9.png.data b/documentation/18.11/eiffelstudio/_images/interface9.png.data
new file mode 100644
index 00000000..104ddd51
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/interface9.png.data
@@ -0,0 +1,3 @@
+title=interface9
+author=admin
+path=content/interface9
diff --git a/documentation/18.11/eiffelstudio/_images/is-satisfied-by.png b/documentation/18.11/eiffelstudio/_images/is-satisfied-by.png
new file mode 100644
index 00000000..01f15b23
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/is-satisfied-by.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/is-satisfied-by.png.data b/documentation/18.11/eiffelstudio/_images/is-satisfied-by.png.data
new file mode 100644
index 00000000..c2ae8ad4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/is-satisfied-by.png.data
@@ -0,0 +1,3 @@
+title=is-satisfied-by
+author=admin
+path=content/satisfied
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-left.png b/documentation/18.11/eiffelstudio/_images/link-tool-left.png
new file mode 100644
index 00000000..2e28d66a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/link-tool-left.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-left.png.data b/documentation/18.11/eiffelstudio/_images/link-tool-left.png.data
new file mode 100644
index 00000000..2d2e0bc8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/link-tool-left.png.data
@@ -0,0 +1,3 @@
+title=link-tool-left
+author=admin
+path=content/link-tool-left
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-no-handles.png b/documentation/18.11/eiffelstudio/_images/link-tool-no-handles.png
new file mode 100644
index 00000000..770a34be
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/link-tool-no-handles.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-no-handles.png.data b/documentation/18.11/eiffelstudio/_images/link-tool-no-handles.png.data
new file mode 100644
index 00000000..6abc2489
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/link-tool-no-handles.png.data
@@ -0,0 +1,3 @@
+title=link-tool-no-handles
+author=admin
+path=content/link-tool-no-handles
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-right.png b/documentation/18.11/eiffelstudio/_images/link-tool-right.png
new file mode 100644
index 00000000..4862789d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/link-tool-right.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-right.png.data b/documentation/18.11/eiffelstudio/_images/link-tool-right.png.data
new file mode 100644
index 00000000..3ab6e135
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/link-tool-right.png.data
@@ -0,0 +1,3 @@
+title=link-tool-right
+author=admin
+path=content/link-tool-right
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-two-left.png b/documentation/18.11/eiffelstudio/_images/link-tool-two-left.png
new file mode 100644
index 00000000..5453b648
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/link-tool-two-left.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-two-left.png.data b/documentation/18.11/eiffelstudio/_images/link-tool-two-left.png.data
new file mode 100644
index 00000000..a60a2de9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/link-tool-two-left.png.data
@@ -0,0 +1,3 @@
+title=link-tool-two-left
+author=admin
+path=content/link-tool-two-left
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-two-right.png b/documentation/18.11/eiffelstudio/_images/link-tool-two-right.png
new file mode 100644
index 00000000..88d11a68
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/link-tool-two-right.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool-two-right.png.data b/documentation/18.11/eiffelstudio/_images/link-tool-two-right.png.data
new file mode 100644
index 00000000..89abfcd2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/link-tool-two-right.png.data
@@ -0,0 +1,3 @@
+title=link-tool-two-right
+author=admin
+path=content/link-tool-two-right
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool.png b/documentation/18.11/eiffelstudio/_images/link-tool.png
new file mode 100644
index 00000000..cbd5b953
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/link-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/link-tool.png.data b/documentation/18.11/eiffelstudio/_images/link-tool.png.data
new file mode 100644
index 00000000..779c3861
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/link-tool.png.data
@@ -0,0 +1,3 @@
+title=link-tool
+author=admin
+path=content/link-tool
diff --git a/documentation/18.11/eiffelstudio/_images/main-address-bar.png b/documentation/18.11/eiffelstudio/_images/main-address-bar.png
new file mode 100644
index 00000000..f2139357
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/main-address-bar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/main-address-bar.png.data b/documentation/18.11/eiffelstudio/_images/main-address-bar.png.data
new file mode 100644
index 00000000..292a7f51
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/main-address-bar.png.data
@@ -0,0 +1,3 @@
+title=main-address-bar
+author=halw
+path=content/main-address-bar
diff --git a/documentation/18.11/eiffelstudio/_images/main-toolbars_0.png b/documentation/18.11/eiffelstudio/_images/main-toolbars_0.png
new file mode 100644
index 00000000..ba058783
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/main-toolbars_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/main-toolbars_0.png.data b/documentation/18.11/eiffelstudio/_images/main-toolbars_0.png.data
new file mode 100644
index 00000000..ebe84b42
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/main-toolbars_0.png.data
@@ -0,0 +1,3 @@
+title=standard-toolbars
+author=halw
+path=content/standard-toolbars
diff --git a/documentation/18.11/eiffelstudio/_images/manual-sweep.png b/documentation/18.11/eiffelstudio/_images/manual-sweep.png
new file mode 100644
index 00000000..a1dd3e99
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/manual-sweep.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/manual-sweep.png.data b/documentation/18.11/eiffelstudio/_images/manual-sweep.png.data
new file mode 100644
index 00000000..57432676
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/manual-sweep.png.data
@@ -0,0 +1,3 @@
+title=manual sweeping icon
+author=halw
+path=content/manual-sweeping-icon
diff --git a/documentation/18.11/eiffelstudio/_images/mapping-options.png b/documentation/18.11/eiffelstudio/_images/mapping-options.png
new file mode 100644
index 00000000..83d20832
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/mapping-options.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/mapping-options.png.data b/documentation/18.11/eiffelstudio/_images/mapping-options.png.data
new file mode 100644
index 00000000..ad59eddf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/mapping-options.png.data
@@ -0,0 +1,3 @@
+title=mapping-options
+author=admin
+path=content/mapping-options
diff --git a/documentation/18.11/eiffelstudio/_images/maximize-icon.png b/documentation/18.11/eiffelstudio/_images/maximize-icon.png
new file mode 100644
index 00000000..d96bf0a8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/maximize-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/maximize-icon.png.data b/documentation/18.11/eiffelstudio/_images/maximize-icon.png.data
new file mode 100644
index 00000000..ee34061b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/maximize-icon.png.data
@@ -0,0 +1,3 @@
+title=maximize-icon
+author=halw
+path=content/maximize-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--command-send-to-external-editor-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--command-send-to-external-editor-icon.png
new file mode 100644
index 00000000..3363cbd1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--command-send-to-external-editor-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--command-send-to-external-editor-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--command-send-to-external-editor-icon.png.data
new file mode 100644
index 00000000..78c49880
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--command-send-to-external-editor-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--command-send-to-external-editor-icon
+author=admin
+path=content/metrics-tool-command-send-external-editor-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--context-sync-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--context-sync-icon.png
new file mode 100644
index 00000000..c8ffa1cc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--context-sync-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--context-sync-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--context-sync-icon.png.data
new file mode 100644
index 00000000..2d9eed21
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--context-sync-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--context-sync-icon
+author=admin
+path=content/metrics-tool-context-sync-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-run-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-run-icon.png
new file mode 100644
index 00000000..c19fa0fb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-run-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-run-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-run-icon.png.data
new file mode 100644
index 00000000..ff01d80a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-run-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--debug-run-icon
+author=admin
+path=content/metrics-tool-debug-run-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-stop-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-stop-icon.png
new file mode 100644
index 00000000..8120249f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-stop-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-stop-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-stop-icon.png.data
new file mode 100644
index 00000000..61d6305b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--debug-stop-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--debug-stop-icon
+author=admin
+path=content/metrics-tool-debug-stop-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--general-open-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-open-icon.png
new file mode 100644
index 00000000..df37ed22
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-open-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--general-open-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-open-icon.png.data
new file mode 100644
index 00000000..67f00eeb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-open-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--general-open-icon
+author=admin
+path=content/metrics-tool-general-open-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--general-remove-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-remove-icon.png
new file mode 100644
index 00000000..12f2ef76
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-remove-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--general-remove-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-remove-icon.png.data
new file mode 100644
index 00000000..6d2a58a6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-remove-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--general-remove-icon
+author=admin
+path=content/metrics-tool-general-remove-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--general-reset-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-reset-icon.png
new file mode 100644
index 00000000..8ebc3e87
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-reset-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--general-reset-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-reset-icon.png.data
new file mode 100644
index 00000000..cfc7fa3c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-reset-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--general-reset-icon
+author=admin
+path=content/metrics-tool-general-reset-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--general-save-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-save-icon.png
new file mode 100644
index 00000000..3f6a757c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-save-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--general-save-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-save-icon.png.data
new file mode 100644
index 00000000..faf53891
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--general-save-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--general-save-icon
+author=admin
+path=content/metrics-tool-general-save-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-export-to-file-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-export-to-file-icon.png
new file mode 100644
index 00000000..841cc2fe
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-export-to-file-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-export-to-file-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-export-to-file-icon.png.data
new file mode 100644
index 00000000..995718e7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-export-to-file-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--metric-export-to-file-icon
+author=admin
+path=content/metrics-tool-metric-export-file-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-filter-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-filter-icon.png
new file mode 100644
index 00000000..aed10c99
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-filter-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-filter-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-filter-icon.png.data
new file mode 100644
index 00000000..d64c7aed
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-filter-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--metric-filter-icon
+author=admin
+path=content/metrics-tool-metric-filter-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-group-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-group-icon.png
new file mode 100644
index 00000000..375118c3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-group-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-group-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-group-icon.png.data
new file mode 100644
index 00000000..4e073e20
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-group-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--metric-group-icon
+author=admin
+path=content/metrics-tool-metric-group-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-quick-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-quick-icon.png
new file mode 100644
index 00000000..73a08231
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-quick-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-quick-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-quick-icon.png.data
new file mode 100644
index 00000000..61d7a593
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-quick-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--metric-quick-icon
+author=admin
+path=content/metrics-tool-metric-quick-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-run-and-show-details-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-run-and-show-details-icon.png
new file mode 100644
index 00000000..ed21fed1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-run-and-show-details-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-run-and-show-details-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-run-and-show-details-icon.png.data
new file mode 100644
index 00000000..a031bd06
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-run-and-show-details-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--metric-run-and-show-details-icon
+author=admin
+path=content/metrics-tool-metric-run-and-show-details-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-send-to-archive-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-send-to-archive-icon.png
new file mode 100644
index 00000000..0bda37e7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-send-to-archive-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-send-to-archive-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-send-to-archive-icon.png.data
new file mode 100644
index 00000000..371cab76
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-send-to-archive-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--metric-send-to-archive-icon
+author=admin
+path=content/metrics-tool-metric-send-archive-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-unit-assertion-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-unit-assertion-icon.png
new file mode 100644
index 00000000..4528a839
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-unit-assertion-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-unit-assertion-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-unit-assertion-icon.png.data
new file mode 100644
index 00000000..11e6b5ad
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--metric-unit-assertion-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--metric-unit-assertion-icon
+author=admin
+path=content/metrics-tool-metric-unit-assertion-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--new-document-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--new-document-icon.png
new file mode 100644
index 00000000..bfe11f37
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--new-document-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--new-document-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--new-document-icon.png.data
new file mode 100644
index 00000000..68fdc3fd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--new-document-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--new-document-icon
+author=admin
+path=content/metrics-tool-new-document-icon
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--new-metric-icon.png b/documentation/18.11/eiffelstudio/_images/metrics-tool--new-metric-icon.png
new file mode 100644
index 00000000..07398ff2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/metrics-tool--new-metric-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/metrics-tool--new-metric-icon.png.data b/documentation/18.11/eiffelstudio/_images/metrics-tool--new-metric-icon.png.data
new file mode 100644
index 00000000..1abda108
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/metrics-tool--new-metric-icon.png.data
@@ -0,0 +1,3 @@
+title=metrics-tool--new-metric-icon
+author=admin
+path=content/metrics-tool-new-metric-icon
diff --git a/documentation/18.11/eiffelstudio/_images/minimize-icon.png b/documentation/18.11/eiffelstudio/_images/minimize-icon.png
new file mode 100644
index 00000000..9f9462c8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/minimize-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/minimize-icon.png.data b/documentation/18.11/eiffelstudio/_images/minimize-icon.png.data
new file mode 100644
index 00000000..85dafb46
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/minimize-icon.png.data
@@ -0,0 +1,3 @@
+title=minimize-icon
+author=halw
+path=content/minimize-icon
diff --git a/documentation/18.11/eiffelstudio/_images/move-down-icon.png b/documentation/18.11/eiffelstudio/_images/move-down-icon.png
new file mode 100644
index 00000000..6a4d7d62
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/move-down-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/move-down-icon.png.data b/documentation/18.11/eiffelstudio/_images/move-down-icon.png.data
new file mode 100644
index 00000000..b33052dd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/move-down-icon.png.data
@@ -0,0 +1,3 @@
+title=move-down-icon
+author=halw
+path=content/move-down-icon
diff --git a/documentation/18.11/eiffelstudio/_images/move-up-icon.png b/documentation/18.11/eiffelstudio/_images/move-up-icon.png
new file mode 100644
index 00000000..32a41057
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/move-up-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/move-up-icon.png.data b/documentation/18.11/eiffelstudio/_images/move-up-icon.png.data
new file mode 100644
index 00000000..3052edbf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/move-up-icon.png.data
@@ -0,0 +1,3 @@
+title=move-up-icon
+author=halw
+path=content/move-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-aggregate-supplier-link-icon.png b/documentation/18.11/eiffelstudio/_images/new-aggregate-supplier-link-icon.png
new file mode 100644
index 00000000..5359ea4d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-aggregate-supplier-link-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-aggregate-supplier-link-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-aggregate-supplier-link-icon.png.data
new file mode 100644
index 00000000..3700f564
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-aggregate-supplier-link-icon.png.data
@@ -0,0 +1,3 @@
+title=new-aggregate-supplier-link-icon
+author=admin
+path=content/new-aggregate-supplier-link-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-class-dialog.png b/documentation/18.11/eiffelstudio/_images/new-class-dialog.png
new file mode 100644
index 00000000..0522c84d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-class-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-class-dialog.png.data b/documentation/18.11/eiffelstudio/_images/new-class-dialog.png.data
new file mode 100644
index 00000000..3db943c5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-class-dialog.png.data
@@ -0,0 +1,3 @@
+title=new-class-dialog
+author=admin
+path=content/new-class-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/new-class-icon.png b/documentation/18.11/eiffelstudio/_images/new-class-icon.png
new file mode 100644
index 00000000..876bf7cc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-class-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-class-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-class-icon.png.data
new file mode 100644
index 00000000..b82f9bf9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-class-icon.png.data
@@ -0,0 +1,3 @@
+title=new-class-icon
+author=admin
+path=content/new-class-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-cluster-dialog.png b/documentation/18.11/eiffelstudio/_images/new-cluster-dialog.png
new file mode 100644
index 00000000..6b102b69
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-cluster-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-cluster-dialog.png.data b/documentation/18.11/eiffelstudio/_images/new-cluster-dialog.png.data
new file mode 100644
index 00000000..ad2de639
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-cluster-dialog.png.data
@@ -0,0 +1,3 @@
+title=new-cluster-dialog
+author=admin
+path=content/new-cluster-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/new-cluster-icon.png b/documentation/18.11/eiffelstudio/_images/new-cluster-icon.png
new file mode 100644
index 00000000..c65545e0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-cluster-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-cluster-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-cluster-icon.png.data
new file mode 100644
index 00000000..b29237e0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-cluster-icon.png.data
@@ -0,0 +1,3 @@
+title=new-cluster-icon
+author=admin
+path=content/new-cluster-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-document-icon.png b/documentation/18.11/eiffelstudio/_images/new-document-icon.png
new file mode 100644
index 00000000..bfe11f37
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-document-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-document-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-document-icon.png.data
new file mode 100644
index 00000000..76132429
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-document-icon.png.data
@@ -0,0 +1,3 @@
+title=new-document-icon
+author=admin
+path=content/new-document-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-editor-icon.png b/documentation/18.11/eiffelstudio/_images/new-editor-icon.png
new file mode 100644
index 00000000..ddd5d2bc
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-editor-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-editor-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-editor-icon.png.data
new file mode 100644
index 00000000..3a53e3af
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-editor-icon.png.data
@@ -0,0 +1,3 @@
+title=new-editor-icon
+author=admin
+path=content/new-editor-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-exported-feature.png b/documentation/18.11/eiffelstudio/_images/new-exported-feature.png
new file mode 100644
index 00000000..c36e656e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-exported-feature.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-exported-feature.png.data b/documentation/18.11/eiffelstudio/_images/new-exported-feature.png.data
new file mode 100644
index 00000000..f32279f5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-exported-feature.png.data
@@ -0,0 +1,3 @@
+title=new-exported-feature
+author=admin
+path=content/new-exported-feature
diff --git a/documentation/18.11/eiffelstudio/_images/new-expression-as-object-definition-dlg.png b/documentation/18.11/eiffelstudio/_images/new-expression-as-object-definition-dlg.png
new file mode 100644
index 00000000..39ec93ff
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-expression-as-object-definition-dlg.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-expression-as-object-definition-dlg.png.data b/documentation/18.11/eiffelstudio/_images/new-expression-as-object-definition-dlg.png.data
new file mode 100644
index 00000000..8b1ea615
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-expression-as-object-definition-dlg.png.data
@@ -0,0 +1,3 @@
+title=new-expression-as-object-definition-dlg
+author=admin
+path=content/new-expression-object-definition-dlg
diff --git a/documentation/18.11/eiffelstudio/_images/new-expression-definition-dlg.png b/documentation/18.11/eiffelstudio/_images/new-expression-definition-dlg.png
new file mode 100644
index 00000000..190682e0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-expression-definition-dlg.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-expression-definition-dlg.png.data b/documentation/18.11/eiffelstudio/_images/new-expression-definition-dlg.png.data
new file mode 100644
index 00000000..ae2933ef
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-expression-definition-dlg.png.data
@@ -0,0 +1,3 @@
+title=new-expression-definition-dlg
+author=admin
+path=content/new-expression-definition-dlg
diff --git a/documentation/18.11/eiffelstudio/_images/new-expression-icon.png b/documentation/18.11/eiffelstudio/_images/new-expression-icon.png
new file mode 100644
index 00000000..777f2790
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-expression-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-expression-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-expression-icon.png.data
new file mode 100644
index 00000000..3a4d3dcf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-expression-icon.png.data
@@ -0,0 +1,3 @@
+title=new-expression-icon
+author=admin
+path=content/new-expression-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-feature-icon.png b/documentation/18.11/eiffelstudio/_images/new-feature-icon.png
new file mode 100644
index 00000000..48dc7cd8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-feature-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-feature-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-feature-icon.png.data
new file mode 100644
index 00000000..4b4afd55
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-feature-icon.png.data
@@ -0,0 +1,3 @@
+title=new-feature-icon
+author=admin
+path=content/new-feature-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-inheritance-link-icon.png b/documentation/18.11/eiffelstudio/_images/new-inheritance-link-icon.png
new file mode 100644
index 00000000..2cf5b308
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-inheritance-link-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-inheritance-link-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-inheritance-link-icon.png.data
new file mode 100644
index 00000000..cfbb1e3b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-inheritance-link-icon.png.data
@@ -0,0 +1,3 @@
+title=new-inheritance-link-icon
+author=admin
+path=content/new-inheritance-link-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-library-dialog.png b/documentation/18.11/eiffelstudio/_images/new-library-dialog.png
new file mode 100644
index 00000000..0739c06e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-library-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-library-dialog.png.data b/documentation/18.11/eiffelstudio/_images/new-library-dialog.png.data
new file mode 100644
index 00000000..a5397024
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-library-dialog.png.data
@@ -0,0 +1,3 @@
+title=new-library-dialog
+author=halw
+path=content/new-library-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/new-library-icon.png b/documentation/18.11/eiffelstudio/_images/new-library-icon.png
new file mode 100644
index 00000000..2f13ba61
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-library-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-library-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-library-icon.png.data
new file mode 100644
index 00000000..326d6a8b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-library-icon.png.data
@@ -0,0 +1,3 @@
+title=new-library-icon
+author=admin
+path=content/new-library-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-supplier-link-icon.png b/documentation/18.11/eiffelstudio/_images/new-supplier-link-icon.png
new file mode 100644
index 00000000..8d14f4df
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-supplier-link-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-supplier-link-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-supplier-link-icon.png.data
new file mode 100644
index 00000000..6db10afe
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-supplier-link-icon.png.data
@@ -0,0 +1,3 @@
+title=new-supplier-link-icon
+author=admin
+path=content/new-supplier-link-icon
diff --git a/documentation/18.11/eiffelstudio/_images/new-window-icon.png b/documentation/18.11/eiffelstudio/_images/new-window-icon.png
new file mode 100644
index 00000000..26593fa1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/new-window-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/new-window-icon.png.data b/documentation/18.11/eiffelstudio/_images/new-window-icon.png.data
new file mode 100644
index 00000000..43d42120
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/new-window-icon.png.data
@@ -0,0 +1,3 @@
+title=new-window-icon
+author=admin
+path=content/new-window-icon
diff --git a/documentation/18.11/eiffelstudio/_images/next-error.png b/documentation/18.11/eiffelstudio/_images/next-error.png
new file mode 100644
index 00000000..98d7b1e7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/next-error.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/next-error.png.data b/documentation/18.11/eiffelstudio/_images/next-error.png.data
new file mode 100644
index 00000000..6a3257a7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/next-error.png.data
@@ -0,0 +1,3 @@
+title=next-error
+author=admin
+path=content/next-error
diff --git a/documentation/18.11/eiffelstudio/_images/next-warning.png b/documentation/18.11/eiffelstudio/_images/next-warning.png
new file mode 100644
index 00000000..2606fa56
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/next-warning.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/next-warning.png.data b/documentation/18.11/eiffelstudio/_images/next-warning.png.data
new file mode 100644
index 00000000..5d3659b2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/next-warning.png.data
@@ -0,0 +1,3 @@
+title=next-warning
+author=admin
+path=content/next-warning
diff --git a/documentation/18.11/eiffelstudio/_images/object-tool-layout-editor.png b/documentation/18.11/eiffelstudio/_images/object-tool-layout-editor.png
new file mode 100644
index 00000000..aa98ff60
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/object-tool-layout-editor.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/object-tool-layout-editor.png.data b/documentation/18.11/eiffelstudio/_images/object-tool-layout-editor.png.data
new file mode 100644
index 00000000..439f912c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/object-tool-layout-editor.png.data
@@ -0,0 +1,3 @@
+title=object-tool-layout-editor
+author=admin
+path=content/object-tool-layout-editor
diff --git a/documentation/18.11/eiffelstudio/_images/object-tool.png b/documentation/18.11/eiffelstudio/_images/object-tool.png
new file mode 100644
index 00000000..1828204f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/object-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/object-tool.png.data b/documentation/18.11/eiffelstudio/_images/object-tool.png.data
new file mode 100644
index 00000000..0e60a7cd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/object-tool.png.data
@@ -0,0 +1,3 @@
+title=object-tool
+author=admin
+path=content/object-tool
diff --git a/documentation/18.11/eiffelstudio/_images/object-viewer-browse.png b/documentation/18.11/eiffelstudio/_images/object-viewer-browse.png
new file mode 100644
index 00000000..933f2488
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/object-viewer-browse.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/object-viewer-browse.png.data b/documentation/18.11/eiffelstudio/_images/object-viewer-browse.png.data
new file mode 100644
index 00000000..636c569e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/object-viewer-browse.png.data
@@ -0,0 +1,3 @@
+title=object-viewer-browse
+author=admin
+path=content/object-viewer-browse
diff --git a/documentation/18.11/eiffelstudio/_images/object-viewer-dump.png b/documentation/18.11/eiffelstudio/_images/object-viewer-dump.png
new file mode 100644
index 00000000..75fbe3d5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/object-viewer-dump.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/object-viewer-dump.png.data b/documentation/18.11/eiffelstudio/_images/object-viewer-dump.png.data
new file mode 100644
index 00000000..41c2e7ef
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/object-viewer-dump.png.data
@@ -0,0 +1,3 @@
+title=object-viewer-dump
+author=admin
+path=content/object-viewer-dump
diff --git a/documentation/18.11/eiffelstudio/_images/object-viewer-internal.png b/documentation/18.11/eiffelstudio/_images/object-viewer-internal.png
new file mode 100644
index 00000000..35067aae
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/object-viewer-internal.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/object-viewer-internal.png.data b/documentation/18.11/eiffelstudio/_images/object-viewer-internal.png.data
new file mode 100644
index 00000000..0e90b43e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/object-viewer-internal.png.data
@@ -0,0 +1,3 @@
+title=object-viewer-internal
+author=admin
+path=content/object-viewer-internal
diff --git a/documentation/18.11/eiffelstudio/_images/object-viewer-xml.png b/documentation/18.11/eiffelstudio/_images/object-viewer-xml.png
new file mode 100644
index 00000000..e3fbbe36
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/object-viewer-xml.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/object-viewer-xml.png.data b/documentation/18.11/eiffelstudio/_images/object-viewer-xml.png.data
new file mode 100644
index 00000000..7e41ac62
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/object-viewer-xml.png.data
@@ -0,0 +1,3 @@
+title=object-viewer-xml
+author=admin
+path=content/object-viewer-xml
diff --git a/documentation/18.11/eiffelstudio/_images/objects-tool-exception.png b/documentation/18.11/eiffelstudio/_images/objects-tool-exception.png
new file mode 100644
index 00000000..6b2319a0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/objects-tool-exception.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/objects-tool-exception.png.data b/documentation/18.11/eiffelstudio/_images/objects-tool-exception.png.data
new file mode 100644
index 00000000..9603a997
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/objects-tool-exception.png.data
@@ -0,0 +1,3 @@
+title=objects-tool-exception
+author=admin
+path=content/objects-tool-exception
diff --git a/documentation/18.11/eiffelstudio/_images/obsolete-items-icon.png b/documentation/18.11/eiffelstudio/_images/obsolete-items-icon.png
new file mode 100644
index 00000000..dc163fa5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/obsolete-items-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/obsolete-items-icon.png.data b/documentation/18.11/eiffelstudio/_images/obsolete-items-icon.png.data
new file mode 100644
index 00000000..c57df0db
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/obsolete-items-icon.png.data
@@ -0,0 +1,3 @@
+title=obsolete items icon
+author=halw
+path=content/obsolete-items-icon
diff --git a/documentation/18.11/eiffelstudio/_images/previous-error.png b/documentation/18.11/eiffelstudio/_images/previous-error.png
new file mode 100644
index 00000000..0123561d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/previous-error.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/previous-error.png.data b/documentation/18.11/eiffelstudio/_images/previous-error.png.data
new file mode 100644
index 00000000..30a9f22c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/previous-error.png.data
@@ -0,0 +1,3 @@
+title=previous-error
+author=admin
+path=content/previous-error
diff --git a/documentation/18.11/eiffelstudio/_images/previous-warning.png b/documentation/18.11/eiffelstudio/_images/previous-warning.png
new file mode 100644
index 00000000..17b64ca2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/previous-warning.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/previous-warning.png.data b/documentation/18.11/eiffelstudio/_images/previous-warning.png.data
new file mode 100644
index 00000000..e7e63031
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/previous-warning.png.data
@@ -0,0 +1,3 @@
+title=previous-warning
+author=admin
+path=content/previous-warning
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-process.png b/documentation/18.11/eiffelstudio/_images/profiler-process.png
new file mode 100644
index 00000000..c4028a44
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/profiler-process.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-process.png.data b/documentation/18.11/eiffelstudio/_images/profiler-process.png.data
new file mode 100644
index 00000000..e13a90c7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/profiler-process.png.data
@@ -0,0 +1,3 @@
+title=profiler-process
+author=admin
+path=content/profiler-process
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-query-window.png b/documentation/18.11/eiffelstudio/_images/profiler-query-window.png
new file mode 100644
index 00000000..90245054
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/profiler-query-window.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-query-window.png.data b/documentation/18.11/eiffelstudio/_images/profiler-query-window.png.data
new file mode 100644
index 00000000..b652c6d5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/profiler-query-window.png.data
@@ -0,0 +1,3 @@
+title=profiler-query-window
+author=admin
+path=content/profiler-query-window
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-first-state.png b/documentation/18.11/eiffelstudio/_images/profiler-wizard-first-state.png
new file mode 100644
index 00000000..f43c5c5f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/profiler-wizard-first-state.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-first-state.png.data b/documentation/18.11/eiffelstudio/_images/profiler-wizard-first-state.png.data
new file mode 100644
index 00000000..c2f43825
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/profiler-wizard-first-state.png.data
@@ -0,0 +1,3 @@
+title=profiler-wizard-first-state
+author=admin
+path=content/profiler-wizard-first-state
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-fourth-state.png b/documentation/18.11/eiffelstudio/_images/profiler-wizard-fourth-state.png
new file mode 100644
index 00000000..fc6d761d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/profiler-wizard-fourth-state.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-fourth-state.png.data b/documentation/18.11/eiffelstudio/_images/profiler-wizard-fourth-state.png.data
new file mode 100644
index 00000000..632fcc2b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/profiler-wizard-fourth-state.png.data
@@ -0,0 +1,3 @@
+title=profiler-wizard-fourth-state
+author=admin
+path=content/profiler-wizard-fourth-state
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-rtir-error-state.png b/documentation/18.11/eiffelstudio/_images/profiler-wizard-rtir-error-state.png
new file mode 100644
index 00000000..2ffd135a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/profiler-wizard-rtir-error-state.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-rtir-error-state.png.data b/documentation/18.11/eiffelstudio/_images/profiler-wizard-rtir-error-state.png.data
new file mode 100644
index 00000000..ce33cab5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/profiler-wizard-rtir-error-state.png.data
@@ -0,0 +1,3 @@
+title=profiler-wizard-rtir-error-state
+author=admin
+path=content/profiler-wizard-rtir-error-state
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-second-state.png b/documentation/18.11/eiffelstudio/_images/profiler-wizard-second-state.png
new file mode 100644
index 00000000..5609e9e6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/profiler-wizard-second-state.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-second-state.png.data b/documentation/18.11/eiffelstudio/_images/profiler-wizard-second-state.png.data
new file mode 100644
index 00000000..cc8e1f51
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/profiler-wizard-second-state.png.data
@@ -0,0 +1,3 @@
+title=profiler-wizard-second-state
+author=admin
+path=content/profiler-wizard-second-state
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-third-state.png b/documentation/18.11/eiffelstudio/_images/profiler-wizard-third-state.png
new file mode 100644
index 00000000..076780ac
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/profiler-wizard-third-state.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/profiler-wizard-third-state.png.data b/documentation/18.11/eiffelstudio/_images/profiler-wizard-third-state.png.data
new file mode 100644
index 00000000..af244d6f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/profiler-wizard-third-state.png.data
@@ -0,0 +1,3 @@
+title=profiler-wizard-third-state
+author=admin
+path=content/profiler-wizard-third-state
diff --git a/documentation/18.11/eiffelstudio/_images/project-finalize-icon.png b/documentation/18.11/eiffelstudio/_images/project-finalize-icon.png
new file mode 100644
index 00000000..cdfb1d2f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/project-finalize-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/project-finalize-icon.png.data b/documentation/18.11/eiffelstudio/_images/project-finalize-icon.png.data
new file mode 100644
index 00000000..59077302
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/project-finalize-icon.png.data
@@ -0,0 +1,3 @@
+title=project-finalize-icon
+author=admin
+path=content/project-finalize-icon
diff --git a/documentation/18.11/eiffelstudio/_images/project-freeze-icon.png b/documentation/18.11/eiffelstudio/_images/project-freeze-icon.png
new file mode 100644
index 00000000..d5dd234b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/project-freeze-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/project-freeze-icon.png.data b/documentation/18.11/eiffelstudio/_images/project-freeze-icon.png.data
new file mode 100644
index 00000000..23c21208
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/project-freeze-icon.png.data
@@ -0,0 +1,3 @@
+title=project-freeze-icon
+author=admin
+path=content/project-freeze-icon
diff --git a/documentation/18.11/eiffelstudio/_images/project-melt-icon.png b/documentation/18.11/eiffelstudio/_images/project-melt-icon.png
new file mode 100644
index 00000000..b399dc97
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/project-melt-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/project-melt-icon.png.data b/documentation/18.11/eiffelstudio/_images/project-melt-icon.png.data
new file mode 100644
index 00000000..b0d87fbc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/project-melt-icon.png.data
@@ -0,0 +1,3 @@
+title=project-melt-icon
+author=admin
+path=content/project-melt-icon
diff --git a/documentation/18.11/eiffelstudio/_images/project-toolbar.png b/documentation/18.11/eiffelstudio/_images/project-toolbar.png
new file mode 100644
index 00000000..bf9c53f5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/project-toolbar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/project-toolbar.png.data b/documentation/18.11/eiffelstudio/_images/project-toolbar.png.data
new file mode 100644
index 00000000..94a031cb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/project-toolbar.png.data
@@ -0,0 +1,3 @@
+title=project-toolbar
+author=halw
+path=content/project-toolbar
diff --git a/documentation/18.11/eiffelstudio/_images/query-return-type-icon.png b/documentation/18.11/eiffelstudio/_images/query-return-type-icon.png
new file mode 100644
index 00000000..6e9011ec
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/query-return-type-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/query-return-type-icon.png.data b/documentation/18.11/eiffelstudio/_images/query-return-type-icon.png.data
new file mode 100644
index 00000000..df2fd019
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/query-return-type-icon.png.data
@@ -0,0 +1,3 @@
+title=query return type icon
+author=halw
+path=content/query-return-type-icon
diff --git a/documentation/18.11/eiffelstudio/_images/refactor-feature-up-icon.png b/documentation/18.11/eiffelstudio/_images/refactor-feature-up-icon.png
new file mode 100644
index 00000000..914eab3e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/refactor-feature-up-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/refactor-feature-up-icon.png.data b/documentation/18.11/eiffelstudio/_images/refactor-feature-up-icon.png.data
new file mode 100644
index 00000000..3c6b01de
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/refactor-feature-up-icon.png.data
@@ -0,0 +1,3 @@
+title=refactor-feature-up-icon
+author=admin
+path=content/refactor-feature-icon
diff --git a/documentation/18.11/eiffelstudio/_images/refactor-rename-icon.png b/documentation/18.11/eiffelstudio/_images/refactor-rename-icon.png
new file mode 100644
index 00000000..8971a133
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/refactor-rename-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/refactor-rename-icon.png.data b/documentation/18.11/eiffelstudio/_images/refactor-rename-icon.png.data
new file mode 100644
index 00000000..a574fded
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/refactor-rename-icon.png.data
@@ -0,0 +1,3 @@
+title=refactor-rename-icon
+author=admin
+path=content/refactor-rename-icon
diff --git a/documentation/18.11/eiffelstudio/_images/refactoring-toolbar.png b/documentation/18.11/eiffelstudio/_images/refactoring-toolbar.png
new file mode 100644
index 00000000..d27edf6d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/refactoring-toolbar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/refactoring-toolbar.png.data b/documentation/18.11/eiffelstudio/_images/refactoring-toolbar.png.data
new file mode 100644
index 00000000..8ac40c3d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/refactoring-toolbar.png.data
@@ -0,0 +1,3 @@
+title=refactoring-toolbar
+author=halw
+path=content/refactoring-toolbar
diff --git a/documentation/18.11/eiffelstudio/_images/refresh-icon.png b/documentation/18.11/eiffelstudio/_images/refresh-icon.png
new file mode 100644
index 00000000..1fcae4ee
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/refresh-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/refresh-icon.png.data b/documentation/18.11/eiffelstudio/_images/refresh-icon.png.data
new file mode 100644
index 00000000..f258be97
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/refresh-icon.png.data
@@ -0,0 +1,3 @@
+title=refresh-icon
+author=halw
+path=content/refresh-icon
diff --git a/documentation/18.11/eiffelstudio/_images/remember-list-size.png b/documentation/18.11/eiffelstudio/_images/remember-list-size.png
new file mode 100644
index 00000000..85fb095f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/remember-list-size.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/remember-list-size.png.data b/documentation/18.11/eiffelstudio/_images/remember-list-size.png.data
new file mode 100644
index 00000000..af340b3d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/remember-list-size.png.data
@@ -0,0 +1,3 @@
+title=remember list size icon
+author=halw
+path=content/remember-list-size-icon
diff --git a/documentation/18.11/eiffelstudio/_images/restore-icon.png b/documentation/18.11/eiffelstudio/_images/restore-icon.png
new file mode 100644
index 00000000..c6a5a42b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/restore-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/restore-icon.png.data b/documentation/18.11/eiffelstudio/_images/restore-icon.png.data
new file mode 100644
index 00000000..84814b85
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/restore-icon.png.data
@@ -0,0 +1,3 @@
+title=restore-icon
+author=halw
+path=content/restore-icon
diff --git a/documentation/18.11/eiffelstudio/_images/run-animation-4-icon.png b/documentation/18.11/eiffelstudio/_images/run-animation-4-icon.png
new file mode 100644
index 00000000..e98889b3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/run-animation-4-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/run-animation-4-icon.png.data b/documentation/18.11/eiffelstudio/_images/run-animation-4-icon.png.data
new file mode 100644
index 00000000..046a9dfe
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/run-animation-4-icon.png.data
@@ -0,0 +1,3 @@
+title=run-animation-4-icon
+author=admin
+path=content/run-animation-4-icon
diff --git a/documentation/18.11/eiffelstudio/_images/save-button.png b/documentation/18.11/eiffelstudio/_images/save-button.png
new file mode 100644
index 00000000..140bca62
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/save-button.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/save-button.png.data b/documentation/18.11/eiffelstudio/_images/save-button.png.data
new file mode 100644
index 00000000..df7393f8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/save-button.png.data
@@ -0,0 +1,3 @@
+title=save-button
+author=halw
+path=content/save-button
diff --git a/documentation/18.11/eiffelstudio/_images/search-icon.png b/documentation/18.11/eiffelstudio/_images/search-icon.png
new file mode 100644
index 00000000..d7c704b6
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/search-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/search-icon.png.data b/documentation/18.11/eiffelstudio/_images/search-icon.png.data
new file mode 100644
index 00000000..0d9a5d99
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/search-icon.png.data
@@ -0,0 +1,3 @@
+title=search-icon
+author=halw
+path=content/search-icon
diff --git a/documentation/18.11/eiffelstudio/_images/search-report-01.png b/documentation/18.11/eiffelstudio/_images/search-report-01.png
new file mode 100644
index 00000000..2d10777b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/search-report-01.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/search-report-01.png.data b/documentation/18.11/eiffelstudio/_images/search-report-01.png.data
new file mode 100644
index 00000000..4034024b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/search-report-01.png.data
@@ -0,0 +1,3 @@
+title=search-report-01
+author=halw
+path=content/search-report-01
diff --git a/documentation/18.11/eiffelstudio/_images/search-tool-scope-tab.png b/documentation/18.11/eiffelstudio/_images/search-tool-scope-tab.png
new file mode 100644
index 00000000..fca01b17
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/search-tool-scope-tab.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/search-tool-scope-tab.png.data b/documentation/18.11/eiffelstudio/_images/search-tool-scope-tab.png.data
new file mode 100644
index 00000000..0598921d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/search-tool-scope-tab.png.data
@@ -0,0 +1,3 @@
+title=search-tool-scope-tab
+author=halw
+path=content/search-tool-scope-tab
diff --git a/documentation/18.11/eiffelstudio/_images/search-tool_0.png b/documentation/18.11/eiffelstudio/_images/search-tool_0.png
new file mode 100644
index 00000000..bd2bb7d7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/search-tool_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/search-tool_0.png.data b/documentation/18.11/eiffelstudio/_images/search-tool_0.png.data
new file mode 100644
index 00000000..8748e61f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/search-tool_0.png.data
@@ -0,0 +1,3 @@
+title=search-tool
+author=halw
+path=content/search-tool
diff --git a/documentation/18.11/eiffelstudio/_images/select-all.png b/documentation/18.11/eiffelstudio/_images/select-all.png
new file mode 100644
index 00000000..7c5f3bfb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/select-all.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/select-all.png.data b/documentation/18.11/eiffelstudio/_images/select-all.png.data
new file mode 100644
index 00000000..c19c52b1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/select-all.png.data
@@ -0,0 +1,3 @@
+title=select-all
+author=admin
+path=content/select-all
diff --git a/documentation/18.11/eiffelstudio/_images/select-recalculatable.png b/documentation/18.11/eiffelstudio/_images/select-recalculatable.png
new file mode 100644
index 00000000..5949dd15
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/select-recalculatable.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/select-recalculatable.png.data b/documentation/18.11/eiffelstudio/_images/select-recalculatable.png.data
new file mode 100644
index 00000000..2bb26cf1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/select-recalculatable.png.data
@@ -0,0 +1,3 @@
+title=select-recalculatable
+author=admin
+path=content/select-recalculatable
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri1.png b/documentation/18.11/eiffelstudio/_images/selection-cri1.png
new file mode 100644
index 00000000..51d8ae80
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/selection-cri1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri1.png.data b/documentation/18.11/eiffelstudio/_images/selection-cri1.png.data
new file mode 100644
index 00000000..d4d0da20
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/selection-cri1.png.data
@@ -0,0 +1,3 @@
+title=selection-cri1
+author=admin
+path=content/selection-cri1
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri2.png b/documentation/18.11/eiffelstudio/_images/selection-cri2.png
new file mode 100644
index 00000000..be7c1137
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/selection-cri2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri2.png.data b/documentation/18.11/eiffelstudio/_images/selection-cri2.png.data
new file mode 100644
index 00000000..4200b9f1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/selection-cri2.png.data
@@ -0,0 +1,3 @@
+title=selection-cri2
+author=admin
+path=content/selection-cri2
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri3.png b/documentation/18.11/eiffelstudio/_images/selection-cri3.png
new file mode 100644
index 00000000..e819ac9c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/selection-cri3.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri3.png.data b/documentation/18.11/eiffelstudio/_images/selection-cri3.png.data
new file mode 100644
index 00000000..5c0f6add
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/selection-cri3.png.data
@@ -0,0 +1,3 @@
+title=selection-cri3
+author=admin
+path=content/selection-cri3
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri4.png b/documentation/18.11/eiffelstudio/_images/selection-cri4.png
new file mode 100644
index 00000000..00767026
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/selection-cri4.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri4.png.data b/documentation/18.11/eiffelstudio/_images/selection-cri4.png.data
new file mode 100644
index 00000000..5c0ba0d6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/selection-cri4.png.data
@@ -0,0 +1,3 @@
+title=selection-cri4
+author=admin
+path=content/selection-cri4
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri5.png b/documentation/18.11/eiffelstudio/_images/selection-cri5.png
new file mode 100644
index 00000000..5058a9da
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/selection-cri5.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri5.png.data b/documentation/18.11/eiffelstudio/_images/selection-cri5.png.data
new file mode 100644
index 00000000..1ee8df6e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/selection-cri5.png.data
@@ -0,0 +1,3 @@
+title=selection-cri5
+author=admin
+path=content/selection-cri5
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri6.png b/documentation/18.11/eiffelstudio/_images/selection-cri6.png
new file mode 100644
index 00000000..b51ddf56
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/selection-cri6.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri6.png.data b/documentation/18.11/eiffelstudio/_images/selection-cri6.png.data
new file mode 100644
index 00000000..162dc74a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/selection-cri6.png.data
@@ -0,0 +1,3 @@
+title=selection-cri6
+author=admin
+path=content/selection-cri6
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri7.png b/documentation/18.11/eiffelstudio/_images/selection-cri7.png
new file mode 100644
index 00000000..e2de4634
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/selection-cri7.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri7.png.data b/documentation/18.11/eiffelstudio/_images/selection-cri7.png.data
new file mode 100644
index 00000000..05cbc251
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/selection-cri7.png.data
@@ -0,0 +1,3 @@
+title=selection-cri7
+author=admin
+path=content/selection-cri7
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri8.png b/documentation/18.11/eiffelstudio/_images/selection-cri8.png
new file mode 100644
index 00000000..6a615ffb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/selection-cri8.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/selection-cri8.png.data b/documentation/18.11/eiffelstudio/_images/selection-cri8.png.data
new file mode 100644
index 00000000..66273652
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/selection-cri8.png.data
@@ -0,0 +1,3 @@
+title=selection-cri8
+author=admin
+path=content/selection-cri8
diff --git a/documentation/18.11/eiffelstudio/_images/set-default-slice-size-dlg.png b/documentation/18.11/eiffelstudio/_images/set-default-slice-size-dlg.png
new file mode 100644
index 00000000..884a5868
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/set-default-slice-size-dlg.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/set-default-slice-size-dlg.png.data b/documentation/18.11/eiffelstudio/_images/set-default-slice-size-dlg.png.data
new file mode 100644
index 00000000..8a289cd7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/set-default-slice-size-dlg.png.data
@@ -0,0 +1,3 @@
+title=set-default-slice-size-dlg
+author=admin
+path=content/set-default-slice-size-dlg
diff --git a/documentation/18.11/eiffelstudio/_images/set-slice-size-dlg.png b/documentation/18.11/eiffelstudio/_images/set-slice-size-dlg.png
new file mode 100644
index 00000000..5faf479e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/set-slice-size-dlg.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/set-slice-size-dlg.png.data b/documentation/18.11/eiffelstudio/_images/set-slice-size-dlg.png.data
new file mode 100644
index 00000000..5491ebb4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/set-slice-size-dlg.png.data
@@ -0,0 +1,3 @@
+title=set-slice-size-dlg
+author=admin
+path=content/set-slice-size-dlg
diff --git a/documentation/18.11/eiffelstudio/_images/shared-library-window.png b/documentation/18.11/eiffelstudio/_images/shared-library-window.png
new file mode 100644
index 00000000..82d06eb2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/shared-library-window.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/shared-library-window.png.data b/documentation/18.11/eiffelstudio/_images/shared-library-window.png.data
new file mode 100644
index 00000000..59eef466
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/shared-library-window.png.data
@@ -0,0 +1,3 @@
+title=shared-library-window
+author=admin
+path=content/shared-library-window
diff --git a/documentation/18.11/eiffelstudio/_images/show-descriptions-icon.png b/documentation/18.11/eiffelstudio/_images/show-descriptions-icon.png
new file mode 100644
index 00000000..0704a548
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/show-descriptions-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/show-descriptions-icon.png.data b/documentation/18.11/eiffelstudio/_images/show-descriptions-icon.png.data
new file mode 100644
index 00000000..292cb5a2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/show-descriptions-icon.png.data
@@ -0,0 +1,3 @@
+title=show descriptions icon
+author=halw
+path=content/show-descriptions-icon
diff --git a/documentation/18.11/eiffelstudio/_images/show-hide-contract-placeholders.png b/documentation/18.11/eiffelstudio/_images/show-hide-contract-placeholders.png
new file mode 100644
index 00000000..69e4581d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/show-hide-contract-placeholders.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/show-hide-contract-placeholders.png.data b/documentation/18.11/eiffelstudio/_images/show-hide-contract-placeholders.png.data
new file mode 100644
index 00000000..517c6f87
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/show-hide-contract-placeholders.png.data
@@ -0,0 +1,3 @@
+title=show-hide-contract-placeholders-icon
+author=halw
+path=content/show-hide-contract-placeholders-icon
diff --git a/documentation/18.11/eiffelstudio/_images/stack-overflow-dlg.png b/documentation/18.11/eiffelstudio/_images/stack-overflow-dlg.png
new file mode 100644
index 00000000..2a0e2155
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/stack-overflow-dlg.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/stack-overflow-dlg.png.data b/documentation/18.11/eiffelstudio/_images/stack-overflow-dlg.png.data
new file mode 100644
index 00000000..2feb5a89
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/stack-overflow-dlg.png.data
@@ -0,0 +1,3 @@
+title=stack-overflow-dlg
+author=admin
+path=content/stack-overflow-dlg
diff --git a/documentation/18.11/eiffelstudio/_images/standard-buttons-toolbar.png b/documentation/18.11/eiffelstudio/_images/standard-buttons-toolbar.png
new file mode 100644
index 00000000..df7189d8
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/standard-buttons-toolbar.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/standard-buttons-toolbar.png.data b/documentation/18.11/eiffelstudio/_images/standard-buttons-toolbar.png.data
new file mode 100644
index 00000000..0c978c8f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/standard-buttons-toolbar.png.data
@@ -0,0 +1,3 @@
+title=standard-buttons-toolbar
+author=halw
+path=content/standard-buttons-toolbar
diff --git a/documentation/18.11/eiffelstudio/_images/startup-dialog.png b/documentation/18.11/eiffelstudio/_images/startup-dialog.png
new file mode 100644
index 00000000..36382b8a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/startup-dialog.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/startup-dialog.png.data b/documentation/18.11/eiffelstudio/_images/startup-dialog.png.data
new file mode 100644
index 00000000..17a58ccf
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/startup-dialog.png.data
@@ -0,0 +1,3 @@
+title=startup-dialog
+author=admin
+path=content/startup-dialog
diff --git a/documentation/18.11/eiffelstudio/_images/subversion-update-command-02_0.png b/documentation/18.11/eiffelstudio/_images/subversion-update-command-02_0.png
new file mode 100644
index 00000000..4670b0f3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/subversion-update-command-02_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/subversion-update-command-02_0.png.data b/documentation/18.11/eiffelstudio/_images/subversion-update-command-02_0.png.data
new file mode 100644
index 00000000..8e2a38ca
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/subversion-update-command-02_0.png.data
@@ -0,0 +1,3 @@
+title=subversion-update-command-02
+author=halw
+path=content/subversion-update-command-02
diff --git a/documentation/18.11/eiffelstudio/_images/subversion-update-console-window.png b/documentation/18.11/eiffelstudio/_images/subversion-update-console-window.png
new file mode 100644
index 00000000..7f60ffe2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/subversion-update-console-window.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/subversion-update-console-window.png.data b/documentation/18.11/eiffelstudio/_images/subversion-update-console-window.png.data
new file mode 100644
index 00000000..91bcfdc0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/subversion-update-console-window.png.data
@@ -0,0 +1,3 @@
+title=subversion-update-console-tool
+author=halw
+path=content/subversion-update-console-tool
diff --git a/documentation/18.11/eiffelstudio/_images/subversion_update_in_tools_menu.png b/documentation/18.11/eiffelstudio/_images/subversion_update_in_tools_menu.png
new file mode 100644
index 00000000..5e0c79f9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/subversion_update_in_tools_menu.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/subversion_update_in_tools_menu.png.data b/documentation/18.11/eiffelstudio/_images/subversion_update_in_tools_menu.png.data
new file mode 100644
index 00000000..8a5211f0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/subversion_update_in_tools_menu.png.data
@@ -0,0 +1,3 @@
+title=subversion-update-in-tools-menu
+author=halw
+path=content/subversion-update-tools-menu
diff --git a/documentation/18.11/eiffelstudio/_images/system-hierarchy.jpg b/documentation/18.11/eiffelstudio/_images/system-hierarchy.jpg
new file mode 100644
index 00000000..d85a0a04
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/system-hierarchy.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/system-hierarchy.jpg.data b/documentation/18.11/eiffelstudio/_images/system-hierarchy.jpg.data
new file mode 100644
index 00000000..104575d1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/system-hierarchy.jpg.data
@@ -0,0 +1,3 @@
+title=system-hierarchy
+author=admin
+path=content/system-hierarchy
diff --git a/documentation/18.11/eiffelstudio/_images/system-options.png b/documentation/18.11/eiffelstudio/_images/system-options.png
new file mode 100644
index 00000000..41cdceff
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/system-options.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/system-options.png.data b/documentation/18.11/eiffelstudio/_images/system-options.png.data
new file mode 100644
index 00000000..0108e513
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/system-options.png.data
@@ -0,0 +1,3 @@
+title=system-options
+author=admin
+path=content/system-options
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_1_0.png b/documentation/18.11/eiffelstudio/_images/target_template_1_0.png
new file mode 100644
index 00000000..a2ed9155
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_1_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_1_1.png b/documentation/18.11/eiffelstudio/_images/target_template_1_1.png
new file mode 100644
index 00000000..47880c63
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_1_1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_1_2.png b/documentation/18.11/eiffelstudio/_images/target_template_1_2.png
new file mode 100644
index 00000000..d50cc3d5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_1_2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_1_3.png b/documentation/18.11/eiffelstudio/_images/target_template_1_3.png
new file mode 100644
index 00000000..970a0a28
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_1_3.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_1_4.png b/documentation/18.11/eiffelstudio/_images/target_template_1_4.png
new file mode 100644
index 00000000..14cf9153
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_1_4.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_with_defaults_overridden_1_1.png b/documentation/18.11/eiffelstudio/_images/target_template_with_defaults_overridden_1_1.png
new file mode 100644
index 00000000..c100144b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_with_defaults_overridden_1_1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_with_defaults_overridden_1_2.png b/documentation/18.11/eiffelstudio/_images/target_template_with_defaults_overridden_1_2.png
new file mode 100644
index 00000000..d4b4e50a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_with_defaults_overridden_1_2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_0.png b/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_0.png
new file mode 100644
index 00000000..577825cd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_1.png b/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_1.png
new file mode 100644
index 00000000..a9bcdd9a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_1.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_2.png b/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_2.png
new file mode 100644
index 00000000..8db2aa86
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/target_template_with_input_parameters_1_2.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/targetless_template_1_3.png b/documentation/18.11/eiffelstudio/_images/targetless_template_1_3.png
new file mode 100644
index 00000000..b8362a8b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/targetless_template_1_3.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/targetless_template_1_4.png b/documentation/18.11/eiffelstudio/_images/targetless_template_1_4.png
new file mode 100644
index 00000000..05c72190
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/targetless_template_1_4.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/task-options.png b/documentation/18.11/eiffelstudio/_images/task-options.png
new file mode 100644
index 00000000..febd620b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/task-options.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/task-options.png.data b/documentation/18.11/eiffelstudio/_images/task-options.png.data
new file mode 100644
index 00000000..01f232e9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/task-options.png.data
@@ -0,0 +1,3 @@
+title=task-options
+author=admin
+path=content/task-options
diff --git a/documentation/18.11/eiffelstudio/_images/terminal-icon.png b/documentation/18.11/eiffelstudio/_images/terminal-icon.png
new file mode 100644
index 00000000..bc1e9a04
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/terminal-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/terminal-icon.png.data b/documentation/18.11/eiffelstudio/_images/terminal-icon.png.data
new file mode 100644
index 00000000..824cec51
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/terminal-icon.png.data
@@ -0,0 +1,3 @@
+title=terminal-icon
+author=halw
+path=content/terminal-icon
diff --git a/documentation/18.11/eiffelstudio/_images/threads-tool.png b/documentation/18.11/eiffelstudio/_images/threads-tool.png
new file mode 100644
index 00000000..51d81ab4
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/threads-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/threads-tool.png.data b/documentation/18.11/eiffelstudio/_images/threads-tool.png.data
new file mode 100644
index 00000000..196ea1aa
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/threads-tool.png.data
@@ -0,0 +1,3 @@
+title=threads-tool
+author=admin
+path=content/threads-tool
diff --git a/documentation/18.11/eiffelstudio/_images/tool-breakpoints-icon.png b/documentation/18.11/eiffelstudio/_images/tool-breakpoints-icon.png
new file mode 100644
index 00000000..6f4ac895
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/tool-breakpoints-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/tool-breakpoints-icon.png.data b/documentation/18.11/eiffelstudio/_images/tool-breakpoints-icon.png.data
new file mode 100644
index 00000000..9bcb5d56
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/tool-breakpoints-icon.png.data
@@ -0,0 +1,3 @@
+title=tool-breakpoints-icon
+author=admin
+path=content/tool-breakpoints-icon
diff --git a/documentation/18.11/eiffelstudio/_images/tool-clusters-icon.png b/documentation/18.11/eiffelstudio/_images/tool-clusters-icon.png
new file mode 100644
index 00000000..03d4a06b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/tool-clusters-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/tool-clusters-icon.png.data b/documentation/18.11/eiffelstudio/_images/tool-clusters-icon.png.data
new file mode 100644
index 00000000..21e26fb2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/tool-clusters-icon.png.data
@@ -0,0 +1,3 @@
+title=tool-clusters-icon
+author=admin
+path=content/tool-clusters-icon
diff --git a/documentation/18.11/eiffelstudio/_images/tool-config-icon.png b/documentation/18.11/eiffelstudio/_images/tool-config-icon.png
new file mode 100644
index 00000000..32eafe67
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/tool-config-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/tool-config-icon.png.data b/documentation/18.11/eiffelstudio/_images/tool-config-icon.png.data
new file mode 100644
index 00000000..a9a0be89
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/tool-config-icon.png.data
@@ -0,0 +1,3 @@
+title=tool-config-icon
+author=admin
+path=content/tool-config-icon
diff --git a/documentation/18.11/eiffelstudio/_images/tool-favorites-icon.png b/documentation/18.11/eiffelstudio/_images/tool-favorites-icon.png
new file mode 100644
index 00000000..d62207f3
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/tool-favorites-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/tool-favorites-icon.png.data b/documentation/18.11/eiffelstudio/_images/tool-favorites-icon.png.data
new file mode 100644
index 00000000..70b62416
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/tool-favorites-icon.png.data
@@ -0,0 +1,3 @@
+title=tool-favorites-icon
+author=admin
+path=content/tool-favorites-icon
diff --git a/documentation/18.11/eiffelstudio/_images/tool-search-icon.png b/documentation/18.11/eiffelstudio/_images/tool-search-icon.png
new file mode 100644
index 00000000..aee620b2
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/tool-search-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/tool-search-icon.png.data b/documentation/18.11/eiffelstudio/_images/tool-search-icon.png.data
new file mode 100644
index 00000000..05cc482d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/tool-search-icon.png.data
@@ -0,0 +1,3 @@
+title=tool-search-icon
+author=admin
+path=content/tool-search-icon
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-close-icon.png b/documentation/18.11/eiffelstudio/_images/toolbar-close-icon.png
new file mode 100644
index 00000000..48a70234
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/toolbar-close-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-close-icon.png.data b/documentation/18.11/eiffelstudio/_images/toolbar-close-icon.png.data
new file mode 100644
index 00000000..bd840003
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/toolbar-close-icon.png.data
@@ -0,0 +1,3 @@
+title=toolbar-close-icon
+author=admin
+path=content/toolbar-close-icon
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-context-menu.png b/documentation/18.11/eiffelstudio/_images/toolbar-context-menu.png
new file mode 100644
index 00000000..616af67c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/toolbar-context-menu.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-context-menu.png.data b/documentation/18.11/eiffelstudio/_images/toolbar-context-menu.png.data
new file mode 100644
index 00000000..17a5400d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/toolbar-context-menu.png.data
@@ -0,0 +1,3 @@
+title=toolbar-context-menu
+author=halw
+path=content/toolbar-context-menu
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-dropdown-icon.png b/documentation/18.11/eiffelstudio/_images/toolbar-dropdown-icon.png
new file mode 100644
index 00000000..ab9af052
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/toolbar-dropdown-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-dropdown-icon.png.data b/documentation/18.11/eiffelstudio/_images/toolbar-dropdown-icon.png.data
new file mode 100644
index 00000000..2f6d8d36
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/toolbar-dropdown-icon.png.data
@@ -0,0 +1,3 @@
+title=toolbar-dropdown-icon
+author=admin
+path=content/toolbar-dropdown-icon
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-head-icon_0.png b/documentation/18.11/eiffelstudio/_images/toolbar-head-icon_0.png
new file mode 100644
index 00000000..e27df32d
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/toolbar-head-icon_0.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-head-icon_0.png.data b/documentation/18.11/eiffelstudio/_images/toolbar-head-icon_0.png.data
new file mode 100644
index 00000000..ea5448dd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/toolbar-head-icon_0.png.data
@@ -0,0 +1,3 @@
+title=toolbar-head-icon
+author=halw
+path=content/toolbar-head-icon
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-maximize-icon.png b/documentation/18.11/eiffelstudio/_images/toolbar-maximize-icon.png
new file mode 100644
index 00000000..6a232635
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/toolbar-maximize-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-maximize-icon.png.data b/documentation/18.11/eiffelstudio/_images/toolbar-maximize-icon.png.data
new file mode 100644
index 00000000..3f706ab0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/toolbar-maximize-icon.png.data
@@ -0,0 +1,3 @@
+title=toolbar-maximize-icon
+author=admin
+path=content/toolbar-maximize-icon
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-minimize-icon.png b/documentation/18.11/eiffelstudio/_images/toolbar-minimize-icon.png
new file mode 100644
index 00000000..280bba1b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/toolbar-minimize-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-minimize-icon.png.data b/documentation/18.11/eiffelstudio/_images/toolbar-minimize-icon.png.data
new file mode 100644
index 00000000..e7b850cc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/toolbar-minimize-icon.png.data
@@ -0,0 +1,3 @@
+title=toolbar-minimize-icon
+author=admin
+path=content/toolbar-minimize-icon
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-options-dropdown.png b/documentation/18.11/eiffelstudio/_images/toolbar-options-dropdown.png
new file mode 100644
index 00000000..473c490c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/toolbar-options-dropdown.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-options-dropdown.png.data b/documentation/18.11/eiffelstudio/_images/toolbar-options-dropdown.png.data
new file mode 100644
index 00000000..94c6aa2f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/toolbar-options-dropdown.png.data
@@ -0,0 +1,3 @@
+title=toolbar-options-dropdown
+author=halw
+path=content/toolbar-options-dropdown
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-restore-icon.png b/documentation/18.11/eiffelstudio/_images/toolbar-restore-icon.png
new file mode 100644
index 00000000..a493244f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/toolbar-restore-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/toolbar-restore-icon.png.data b/documentation/18.11/eiffelstudio/_images/toolbar-restore-icon.png.data
new file mode 100644
index 00000000..d37c90e8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/toolbar-restore-icon.png.data
@@ -0,0 +1,3 @@
+title=toolbar-restore-icon
+author=admin
+path=content/toolbar-restore-icon
diff --git a/documentation/18.11/eiffelstudio/_images/trace_01_off.png b/documentation/18.11/eiffelstudio/_images/trace_01_off.png
new file mode 100644
index 00000000..6cff0ebd
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/trace_01_off.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/trace_01_off.png.data b/documentation/18.11/eiffelstudio/_images/trace_01_off.png.data
new file mode 100644
index 00000000..cc8c774d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/trace_01_off.png.data
@@ -0,0 +1,3 @@
+title=Tracing 01 off
+author=halw
+path=content/tracing-01
diff --git a/documentation/18.11/eiffelstudio/_images/trace_01_on.png b/documentation/18.11/eiffelstudio/_images/trace_01_on.png
new file mode 100644
index 00000000..8c2691ca
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/trace_01_on.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/trace_01_on.png.data b/documentation/18.11/eiffelstudio/_images/trace_01_on.png.data
new file mode 100644
index 00000000..c9dc2bff
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/trace_01_on.png.data
@@ -0,0 +1,3 @@
+title=Tracing 01 on
+author=halw
+path=content/tracing-01-0
diff --git a/documentation/18.11/eiffelstudio/_images/trace_01_with_eiffelbase.png b/documentation/18.11/eiffelstudio/_images/trace_01_with_eiffelbase.png
new file mode 100644
index 00000000..91208759
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/trace_01_with_eiffelbase.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/trace_01_with_eiffelbase.png.data b/documentation/18.11/eiffelstudio/_images/trace_01_with_eiffelbase.png.data
new file mode 100644
index 00000000..db04b133
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/trace_01_with_eiffelbase.png.data
@@ -0,0 +1,3 @@
+title=Tracing 01 with EiffelBase
+author=halw
+path=content/tracing-01-eiffelbase
diff --git a/documentation/18.11/eiffelstudio/_images/un-auto-hide-icon.png b/documentation/18.11/eiffelstudio/_images/un-auto-hide-icon.png
new file mode 100644
index 00000000..4479127e
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/un-auto-hide-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/un-auto-hide-icon.png.data b/documentation/18.11/eiffelstudio/_images/un-auto-hide-icon.png.data
new file mode 100644
index 00000000..0f3d020a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/un-auto-hide-icon.png.data
@@ -0,0 +1,3 @@
+title=auto-hide-off-icon
+author=halw
+path=content/auto-hide-icon-0
diff --git a/documentation/18.11/eiffelstudio/_images/unused-feature-criterion.jpg b/documentation/18.11/eiffelstudio/_images/unused-feature-criterion.jpg
new file mode 100644
index 00000000..c45e153c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/unused-feature-criterion.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/unused-feature-criterion.jpg.data b/documentation/18.11/eiffelstudio/_images/unused-feature-criterion.jpg.data
new file mode 100644
index 00000000..0ab8e83b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/unused-feature-criterion.jpg.data
@@ -0,0 +1,3 @@
+title=unused-feature-criterion
+author=admin
+path=content/unused-feature-criterion
diff --git a/documentation/18.11/eiffelstudio/_images/unused-feature.jpg b/documentation/18.11/eiffelstudio/_images/unused-feature.jpg
new file mode 100644
index 00000000..994d76f1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/unused-feature.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/unused-feature.jpg.data b/documentation/18.11/eiffelstudio/_images/unused-feature.jpg.data
new file mode 100644
index 00000000..6b14bcb3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/unused-feature.jpg.data
@@ -0,0 +1,3 @@
+title=unused-feature
+author=admin
+path=content/unused-feature
diff --git a/documentation/18.11/eiffelstudio/_images/use-cluster-names.png b/documentation/18.11/eiffelstudio/_images/use-cluster-names.png
new file mode 100644
index 00000000..01cb1b7f
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/use-cluster-names.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/use-cluster-names.png.data b/documentation/18.11/eiffelstudio/_images/use-cluster-names.png.data
new file mode 100644
index 00000000..95d6175a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/use-cluster-names.png.data
@@ -0,0 +1,3 @@
+title=use-cluster-names
+author=admin
+path=content/use-cluster-names
diff --git a/documentation/18.11/eiffelstudio/_images/use-full-cluster-names.png b/documentation/18.11/eiffelstudio/_images/use-full-cluster-names.png
new file mode 100644
index 00000000..d03a6dc7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/use-full-cluster-names.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/use-full-cluster-names.png.data b/documentation/18.11/eiffelstudio/_images/use-full-cluster-names.png.data
new file mode 100644
index 00000000..4de1d76f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/use-full-cluster-names.png.data
@@ -0,0 +1,3 @@
+title=use-full-cluster-names
+author=admin
+path=content/use-full-cluster-names
diff --git a/documentation/18.11/eiffelstudio/_images/use-namespace-name.png b/documentation/18.11/eiffelstudio/_images/use-namespace-name.png
new file mode 100644
index 00000000..9372b40a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/use-namespace-name.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/use-namespace-name.png.data b/documentation/18.11/eiffelstudio/_images/use-namespace-name.png.data
new file mode 100644
index 00000000..9fc86c7e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/use-namespace-name.png.data
@@ -0,0 +1,3 @@
+title=use-namespace-name
+author=admin
+path=content/use-namespace-name
diff --git a/documentation/18.11/eiffelstudio/_images/value-of-metric-is.jpg b/documentation/18.11/eiffelstudio/_images/value-of-metric-is.jpg
new file mode 100644
index 00000000..1d8b7ba7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/value-of-metric-is.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/value-of-metric-is.jpg.data b/documentation/18.11/eiffelstudio/_images/value-of-metric-is.jpg.data
new file mode 100644
index 00000000..15995e60
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/value-of-metric-is.jpg.data
@@ -0,0 +1,3 @@
+title=value-of-metric-is
+author=admin
+path=content/value-metric
diff --git a/documentation/18.11/eiffelstudio/_images/value-tester.jpg b/documentation/18.11/eiffelstudio/_images/value-tester.jpg
new file mode 100644
index 00000000..d3fe12a5
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/value-tester.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/value-tester.jpg.data b/documentation/18.11/eiffelstudio/_images/value-tester.jpg.data
new file mode 100644
index 00000000..a81caabe
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/value-tester.jpg.data
@@ -0,0 +1,3 @@
+title=value-tester
+author=admin
+path=content/value-tester
diff --git a/documentation/18.11/eiffelstudio/_images/variable-options.png b/documentation/18.11/eiffelstudio/_images/variable-options.png
new file mode 100644
index 00000000..9f1bd83b
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/variable-options.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/variable-options.png.data b/documentation/18.11/eiffelstudio/_images/variable-options.png.data
new file mode 100644
index 00000000..441aaa6a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/variable-options.png.data
@@ -0,0 +1,3 @@
+title=variable-options
+author=admin
+path=content/variable-options
diff --git a/documentation/18.11/eiffelstudio/_images/view-buttons.png b/documentation/18.11/eiffelstudio/_images/view-buttons.png
new file mode 100644
index 00000000..24b902ee
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-buttons.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-buttons.png.data b/documentation/18.11/eiffelstudio/_images/view-buttons.png.data
new file mode 100644
index 00000000..b2c63183
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-buttons.png.data
@@ -0,0 +1,3 @@
+title=view-buttons
+author=halw
+path=content/view-buttons
diff --git a/documentation/18.11/eiffelstudio/_images/view-clickable-feature-icon.png b/documentation/18.11/eiffelstudio/_images/view-clickable-feature-icon.png
new file mode 100644
index 00000000..c7d23162
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-clickable-feature-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-clickable-feature-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-clickable-feature-icon.png.data
new file mode 100644
index 00000000..1ebba67c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-clickable-feature-icon.png.data
@@ -0,0 +1,3 @@
+title=view-clickable-feature-icon
+author=admin
+path=content/view-clickable-feature-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-clickable-icon.png b/documentation/18.11/eiffelstudio/_images/view-clickable-icon.png
new file mode 100644
index 00000000..d20d2c93
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-clickable-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-clickable-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-clickable-icon.png.data
new file mode 100644
index 00000000..6d86e6a4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-clickable-icon.png.data
@@ -0,0 +1,3 @@
+title=view-clickable-icon
+author=admin
+path=content/view-clickable-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-contracts-icon.png b/documentation/18.11/eiffelstudio/_images/view-contracts-icon.png
new file mode 100644
index 00000000..447fcf03
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-contracts-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-contracts-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-contracts-icon.png.data
new file mode 100644
index 00000000..8147de96
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-contracts-icon.png.data
@@ -0,0 +1,3 @@
+title=view-contracts-icon
+author=admin
+path=content/view-contracts-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-editor-feature-icon.png b/documentation/18.11/eiffelstudio/_images/view-editor-feature-icon.png
new file mode 100644
index 00000000..002c17e1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-editor-feature-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-editor-feature-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-editor-feature-icon.png.data
new file mode 100644
index 00000000..cb0eecf5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-editor-feature-icon.png.data
@@ -0,0 +1,3 @@
+title=view-editor-feature-icon
+author=admin
+path=content/view-editor-feature-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-editor-icon.png b/documentation/18.11/eiffelstudio/_images/view-editor-icon.png
new file mode 100644
index 00000000..42fdb468
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-editor-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-editor-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-editor-icon.png.data
new file mode 100644
index 00000000..050a1a5f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-editor-icon.png.data
@@ -0,0 +1,3 @@
+title=view-editor-icon
+author=admin
+path=content/view-editor-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-flat-contracts-icon.png b/documentation/18.11/eiffelstudio/_images/view-flat-contracts-icon.png
new file mode 100644
index 00000000..4528a839
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-flat-contracts-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-flat-contracts-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-flat-contracts-icon.png.data
new file mode 100644
index 00000000..138adde0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-flat-contracts-icon.png.data
@@ -0,0 +1,3 @@
+title=view-flat-contracts-icon
+author=admin
+path=content/view-flat-contracts-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-flat-icon.png b/documentation/18.11/eiffelstudio/_images/view-flat-icon.png
new file mode 100644
index 00000000..d8afecee
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-flat-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-flat-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-flat-icon.png.data
new file mode 100644
index 00000000..f14d4545
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-flat-icon.png.data
@@ -0,0 +1,3 @@
+title=view-flat-icon
+author=admin
+path=content/view-flat-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-next-icon.png b/documentation/18.11/eiffelstudio/_images/view-next-icon.png
new file mode 100644
index 00000000..75804537
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-next-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-next-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-next-icon.png.data
new file mode 100644
index 00000000..a60c1a1a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-next-icon.png.data
@@ -0,0 +1,3 @@
+title=view-next-icon
+author=admin
+path=content/view-next-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-previous-icon.png b/documentation/18.11/eiffelstudio/_images/view-previous-icon.png
new file mode 100644
index 00000000..4c76a32c
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-previous-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-previous-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-previous-icon.png.data
new file mode 100644
index 00000000..10882021
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-previous-icon.png.data
@@ -0,0 +1,3 @@
+title=view-previous-icon
+author=admin
+path=content/view-previous-icon
diff --git a/documentation/18.11/eiffelstudio/_images/view-unmodified-icon.png b/documentation/18.11/eiffelstudio/_images/view-unmodified-icon.png
new file mode 100644
index 00000000..57bf3d8a
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/view-unmodified-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/view-unmodified-icon.png.data b/documentation/18.11/eiffelstudio/_images/view-unmodified-icon.png.data
new file mode 100644
index 00000000..f2905272
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/view-unmodified-icon.png.data
@@ -0,0 +1,3 @@
+title=view-unmodified-icon
+author=admin
+path=content/view-unmodified-icon
diff --git a/documentation/18.11/eiffelstudio/_images/visible-metric.jpg b/documentation/18.11/eiffelstudio/_images/visible-metric.jpg
new file mode 100644
index 00000000..a075ffb0
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/visible-metric.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/visible-metric.jpg.data b/documentation/18.11/eiffelstudio/_images/visible-metric.jpg.data
new file mode 100644
index 00000000..657ad140
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/visible-metric.jpg.data
@@ -0,0 +1,3 @@
+title=visible-metric
+author=admin
+path=content/visible-metric
diff --git a/documentation/18.11/eiffelstudio/_images/visible-metric2.jpg b/documentation/18.11/eiffelstudio/_images/visible-metric2.jpg
new file mode 100644
index 00000000..37e2a175
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/visible-metric2.jpg differ
diff --git a/documentation/18.11/eiffelstudio/_images/visible-metric2.jpg.data b/documentation/18.11/eiffelstudio/_images/visible-metric2.jpg.data
new file mode 100644
index 00000000..89b8dd9c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/visible-metric2.jpg.data
@@ -0,0 +1,3 @@
+title=visible-metric2
+author=admin
+path=content/visible-metric2
diff --git a/documentation/18.11/eiffelstudio/_images/warning-options.png b/documentation/18.11/eiffelstudio/_images/warning-options.png
new file mode 100644
index 00000000..5382e4f9
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/warning-options.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/warning-options.png.data b/documentation/18.11/eiffelstudio/_images/warning-options.png.data
new file mode 100644
index 00000000..2e63e694
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/warning-options.png.data
@@ -0,0 +1,3 @@
+title=warning-options
+author=admin
+path=content/warning-options
diff --git a/documentation/18.11/eiffelstudio/_images/warning.png b/documentation/18.11/eiffelstudio/_images/warning.png
new file mode 100644
index 00000000..0a0366d1
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/warning.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/warning.png.data b/documentation/18.11/eiffelstudio/_images/warning.png.data
new file mode 100644
index 00000000..1df19ffd
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/warning.png.data
@@ -0,0 +1,3 @@
+title=warning
+author=admin
+path=content/warning-0
diff --git a/documentation/18.11/eiffelstudio/_images/windows-minimize-all-icon.png b/documentation/18.11/eiffelstudio/_images/windows-minimize-all-icon.png
new file mode 100644
index 00000000..1e8fcdea
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/windows-minimize-all-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/windows-minimize-all-icon.png.data b/documentation/18.11/eiffelstudio/_images/windows-minimize-all-icon.png.data
new file mode 100644
index 00000000..e31b682f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/windows-minimize-all-icon.png.data
@@ -0,0 +1,3 @@
+title=windows-minimize-all-icon
+author=admin
+path=content/windows-minimize-all-icon
diff --git a/documentation/18.11/eiffelstudio/_images/windows-raise-all-icon.png b/documentation/18.11/eiffelstudio/_images/windows-raise-all-icon.png
new file mode 100644
index 00000000..5a1c21de
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/windows-raise-all-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/windows-raise-all-icon.png.data b/documentation/18.11/eiffelstudio/_images/windows-raise-all-icon.png.data
new file mode 100644
index 00000000..70647803
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/windows-raise-all-icon.png.data
@@ -0,0 +1,3 @@
+title=windows-raise-all-icon
+author=admin
+path=content/windows-raise-all-icon
diff --git a/documentation/18.11/eiffelstudio/_images/windows-tool.png b/documentation/18.11/eiffelstudio/_images/windows-tool.png
new file mode 100644
index 00000000..fcfc0dbb
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/windows-tool.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/windows-tool.png.data b/documentation/18.11/eiffelstudio/_images/windows-tool.png.data
new file mode 100644
index 00000000..0636379f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/windows-tool.png.data
@@ -0,0 +1,3 @@
+title=windows-tool
+author=admin
+path=content/windows-tool
diff --git a/documentation/18.11/eiffelstudio/_images/windows-windows-icon.png b/documentation/18.11/eiffelstudio/_images/windows-windows-icon.png
new file mode 100644
index 00000000..7c096a06
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/windows-windows-icon.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/windows-windows-icon.png.data b/documentation/18.11/eiffelstudio/_images/windows-windows-icon.png.data
new file mode 100644
index 00000000..a3cddf19
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/windows-windows-icon.png.data
@@ -0,0 +1,3 @@
+title=windows-windows-icon
+author=admin
+path=content/windows-windows-icon
diff --git a/documentation/18.11/eiffelstudio/_images/xmi-wizard-cluster-selection.png b/documentation/18.11/eiffelstudio/_images/xmi-wizard-cluster-selection.png
new file mode 100644
index 00000000..be7eeeb7
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/xmi-wizard-cluster-selection.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/xmi-wizard-cluster-selection.png.data b/documentation/18.11/eiffelstudio/_images/xmi-wizard-cluster-selection.png.data
new file mode 100644
index 00000000..208b08aa
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/xmi-wizard-cluster-selection.png.data
@@ -0,0 +1,3 @@
+title=xmi-wizard-cluster-selection
+author=halw
+path=content/xmi-wizard-cluster-selection
diff --git a/documentation/18.11/eiffelstudio/_images/xmi-wizard-path-selection.png b/documentation/18.11/eiffelstudio/_images/xmi-wizard-path-selection.png
new file mode 100644
index 00000000..186d0632
Binary files /dev/null and b/documentation/18.11/eiffelstudio/_images/xmi-wizard-path-selection.png differ
diff --git a/documentation/18.11/eiffelstudio/_images/xmi-wizard-path-selection.png.data b/documentation/18.11/eiffelstudio/_images/xmi-wizard-path-selection.png.data
new file mode 100644
index 00000000..10462190
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/_images/xmi-wizard-path-selection.png.data
@@ -0,0 +1,3 @@
+title=xmi-wizard-path-selection
+author=halw
+path=content/xmi-wizard-path-selection
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/index.wiki
new file mode 100644
index 00000000..03712f47
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|Browsing]]
+[[Property:weight|1]]
+[[Property:uuid|62242eb2-a02d-32f0-e357-6ed0e3966066]]
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/opening-new-windows.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/opening-new-windows.wiki
new file mode 100644
index 00000000..abe1e364
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/opening-new-windows.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Opening new windows]]
+[[Property:weight|2]]
+[[Property:uuid|1d3066d2-f1ad-9287-ecd2-5341d3c24b61]]
+There are several ways to open a new window. First, you can use the pick and drop shortcut. Then, you can use new window menu items and the corresponding icons. There are three such commands:
+* Clicking on '''New window''' in the '''File''' menu or on [[Image:new-window-icon]] make an new window appear. In this window, the editor and the context tool will be visible.
+* Clicking on '''New editor window''' in the '''File''' menu or on [[Image:new-editor-icon]] does the same as the previous command but the context tool is minimized in the new window.
+* Clicking on '''New context window''' in the '''File''' menu make this time a new window with a minimized editor appear.
+
+
+{{note|Icons mentioned above are droppable: instead of simply clicking on them, you can drop a stone on them. The tools in the new window will then be centered on the corresponding component.}}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/index.wiki
new file mode 100644
index 00000000..1b8a45f9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|Searching]]
+[[Property:weight|0]]
+[[Property:uuid|655fd717-159f-43f0-00ec-9a804790283f]]
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-class.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-class.wiki
new file mode 100644
index 00000000..3dac47ff
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-class.wiki
@@ -0,0 +1,7 @@
+[[Property:title|Looking for a class]]
+[[Property:weight|1]]
+[[Property:uuid|d3f517bc-46a8-2181-e9fb-ce0430e04261]]
+There are two simple ways to find a class if you know its name or a part of it :
+* You may use the [[Groups tool|groups tool]] . This tool presents the entire universe of your project. By developing the [[System tree representation|cluster tree]] , you will be able to find what you are looking for. This method is quick if you already have an idea of where the class is in the universe.
+* Using [[Address bars|address bars]] will be quicker if you do not have this information or if the size of your project is important. If you type the name of the searched class (you can use wildcards, i.e."*" and "?") in the [[Main address bar|main address bar]] - and then select the right class in the displayed list if there are several possibilities - the editor will be centered on the class you are looking for. The information about the class location will be displayed in the title bar of the window. If you need more complete information about the class location, you can [[Pick-and-drop mechanism|pick]] the name of the class in the editor and drop it on the [[Locate command|view icon ]] [[Image:general-search-icon]] of the [[Groups tool|groups tool]] . This tool will then show where the class is in the universe.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-cluster.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-cluster.wiki
new file mode 100644
index 00000000..4ededde9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-cluster.wiki
@@ -0,0 +1,7 @@
+[[Property:title|Looking for a cluster]]
+[[Property:weight|0]]
+[[Property:uuid|95175328-cc1b-0b0f-974d-5be7fde40e92]]
+If you know the name of a cluster but not where it is located in the system, there are two ways to find this out:
+* You can try to find it in the [[Groups tool|groups tool]] by expanding the cluster tree.
+* In a window where the context tool is independent from the editor, you can type the name of the cluster in [[Context tool address bar|context tool address bar]] . You may use wildcards ("*" or "?") if you know only a part of the name. You can then locate the cluster in the system by [[Pick-and-drop mechanism|picking]] the cluster stone in the [[Context tool address bar|address bar]] and dropping it on the [[Locate command|view icon ]] [[Image:general-search-icon]] of the [[Groups tool|groups tool]] .
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-expression-text.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-expression-text.wiki
new file mode 100644
index 00000000..bba648c3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-expression-text.wiki
@@ -0,0 +1,14 @@
+[[Property:title|Looking for an expression in text]]
+[[Property:weight|3]]
+[[Property:uuid|d71e4302-3f44-5cd8-7a26-365af4a6ecf6]]
+To find a word or an expression in a text, you can use the [[Search tool|search tool]] . If it is not displayed, you can make it appear by clicking on its icon [[Image:tool-search-icon]] in the tool bar. This tool will allow you to search a word or a regular expression and to replace it if you want to. It can be case sensitive and look for isolated words.
+'''Note''': The [[Search tool|search tool]] will look for the wanted word in the editor or in the context tool, depending on which one has the focus.
+
+
+{{tip|There are several accelerators that will make it even easier to perform a search. They are detailed in the [[Search functionality|editor help]] . }}
+
+
+{{tip|You can use the quicksearch to search in the current text. Press CTRL + F to get the quick search bar. }}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-feature.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-feature.wiki
new file mode 100644
index 00000000..1980c5d0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/searching/looking-feature.wiki
@@ -0,0 +1,8 @@
+[[Property:title|Looking for a feature]]
+[[Property:weight|2]]
+[[Property:uuid|5ea97cae-9001-7d9d-2dbb-2b632b05fb75]]
+There are many ways to find a feature in a class. In particular :
+* You can use the [[Features tool|Features tool]] and search the tree by expanding feature clauses. This tool, however, displays only the features that are defined or redefined in the current class text. If you do not know if the feature is inherited or not, you may therefore not find what you are looking for with this method.
+* You can also use the [[Viewing Classes|class tab]] in the context tool. It will allow you to see all the [[Attributes| attributes]] or [[Routines|routines]] , or all the [[Exported features|public features]] for instance. If you do not know if the feature you seek is an attributes or a function and if it is public, this may not be the right method either.
+* If you know the name or a part of the name of the feature you are looking for, the easier and faster way will probably be to use the [[Main address bar|address bar]] . If you type this name in the feature field of the bar (using "*" and "?" wildcards if you want to), the editor will be centered on the right class if necessary (i.e. if the feature is inherited) and scroll to the position of the text of the feature.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/viewing-information-about-component/centering-tools-component.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/viewing-information-about-component/centering-tools-component.wiki
new file mode 100644
index 00000000..9b646759
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/browsing/viewing-information-about-component/centering-tools-component.wiki
@@ -0,0 +1,10 @@
+[[Property:title|Centering tools on a component]]
+[[Property:weight|0]]
+[[Property:uuid|513b0d4a-78b6-30c3-fdde-b00c3072d8d3]]
+There are three kind of tools directly available in a default development tool : [[Browsing tools]] on the right, the [[EiffelStudio Editor]] on the upper left and context tools on the lower left. No browsing tool, except the feature tool, displays information about a particular component. On the contrary, the editor and context tools display information about a given cluster, class or feature : they are centered on this component. There are several ways to center the editor on an element:
+* use the [[Main address bar|address bar]] on the top of the editor. It allows you to set which class (and even which feature in the class) you want the editor to display. You may use wildcards ("?" or "*") as you type the names of these components.
+* use [[Pick-and-drop mechanism|pick and drop]]. Pick a cluster, class or feature stone anywhere in EiffelStudio and drop it in the editor. It will center it on the component automatically.
+* find it in the [[Groups tool|groups]], [[Features tool|features]], or [[Favorites tool|favorites]] tool and click it.
+The context tool can be [[Change data share mode|independent]] from the editor. If it is not, both the editor and the context tool will be centered on the same component. If it is, there is a [[Context tool address bar|second address bar]] , in the context tool title bar. You may then center the context tool on a component by using the three methods described for the editor. You can also center the context tool on the same component as the editor ( the context tool remaining independent): Just click [[Image:context-sync-icon]] or select '''Synchronize Context Tool''' tool in the '''View''' menu. indexing was replaced by a new keyword note. This meant two things. First that if you had used the keyword indexing in your classes (and who hadn't?), then at some point you would want to change those occurrences to note. Second, if you had used the word '''note''' as an identifier, then at some point you would have to change your code to use a different identifier it its place.
+
+The Eiffel compiler is savvy enough in some cases to delay the necessity of these changes by considering code in its current context. For example, if a particular keyword is not appropriate in a certain context, then it is only reasonable that when the word is used in that context, it is used as an identifier. But sometimes ambiguities arise that the compiler cannot resolve by analyzing context. It is in these cases that the syntax variants are useful.
+
+So, considering the transition from '''indexing''' to '''note''', here are the effects of the first three variants:
+
+:If '''Obsolete syntax''' is selected, then '''indexing''' is used as a keyword. '''note''' is allowed as an identifier, but with the warning that it will become a keyword in the future.
+
+:If '''Transitional syntax''' is selected, both '''indexing''' and '''note''' are recognized as keywords, and a warning is issued that '''indexing''' is an obsolete keyword and should be replaced with '''note'''.
+
+:If '''Standard syntax''' is selected, then '''indexing''' is free to be used as an identifier, and '''note''' is recognized as a keyword.
+
+When '''Provisional syntax''' is selected, it allows the use of certain language constructs which, although supported by the Eiffel Software compiler, may not yet be stamped into the standard (or at least approved for the standard by a consensus of the standard committee). For example, version 6.6 of EiffelStudio includes support for the [[ET: Instructions#A closer look at the iteration form|iteration form]] of the Eiffel loop construct, which at the time of the release is not yet approved for inclusion in the ISO/ECMA standard ... although it is expected, with reasonable confidence, to become standard in the future. Of course, there is always the risk that, once standardized, the syntax may change some, so selecting '''Provisional syntax''' is an acknowledgment of this risk when non-standard language elements are being used.
+
+To set the syntax variant, open [[General Target Options|Project Settings]]. Then find the general setting '''Syntax''' for the target or group of interest. The value field for '''Syntax''' will give you a choice of the available variants when clicked. Select the appropriate variant, then, click '''OK'''.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/compiling/tuning-program.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/compiling/tuning-program.wiki
new file mode 100644
index 00000000..1e832260
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/compiling/tuning-program.wiki
@@ -0,0 +1,25 @@
+[[Property:title|Tuning a program]]
+[[Property:weight|6]]
+[[Property:uuid|74d7c168-c9c1-2d43-fb76-4854cf4b69c7]]
+The best way to speed up a program is of course to improve the algorithms and data structures you are using. Spotting the functions that slow down the execution and improving can change a lot in a program. [[Profiling|Profiling]] can be used for this.
+
+Try to keep the number of classes and objects in your system as low as possible to ensure maximum efficiency. This should never hinder the design of the system, though.
+
+You can also use the functionality provided by the [[ref:libraries/base/reference/memory_chart|MEMORY]] class to tweak the garbage collector behavior according to your needs. However, be careful with this, since providing erroneous parameters might lead to memory leaks, huge memory consumption, or on the contrary a dramatic slow down of the application. If you are not entirely sure what a parameter is for, avoid changing it. The default values should fit for most standard applications.
+
+On top of that, EiffelStudio provides powerful optimizations, some being done automatically, others being configurable. To obtain a maximum efficiency, it is recommended to [[Generating executables|Finalize]] your program from scratch and without using precompiled libraries.
+
+In the [[Advanced Options|Project Settings dialog advanced section]] , try experimenting with the '''Inlining''' option, and setting the maximum size of features that should be inlined. Only Eiffel features are inlined by this option, to see how to inline the C functions you may be using in your program, please refer to your C compiler documentation.
+
+In the [[Advanced Options|Project Settings dialog advanced section]] , enabling the '''Dead code removal''' will help produce smaller executables.
+
+Removing the '''Execution Trace''' will optimize the executable in size and speed, but in case of crash no information will be available.
+
+All these options are located in the [[Advanced Options|Project Settings]] dialog, in the '''Advanced''' section. They are only effective during finalizations.
+
+{{seealso|feature clauses.
+* the type of callers and suppliers displayed in the corresponding views.
+* the views that are selected by default.
+* the note clauses that should not be displayed.
+These properties are set in the [[EiffelStudio preferences]]. You can modify them in the [[Preference window overview|preferences window]]. To open this window, select '''Preferences...''' in the '''Tool''' menu. Then select the "Context tool" sub-category of the "Tools" category in the preferences tree. Click then on a preference on the right to modify its value.
+Click on '''save and exit''' to complete the changes.
+
+{{seealso|
+svn up $file_name
+
+invokes Subversion and executes the ''update'' command. The placeholder '''$file_name''' substitutes the name of the file associated with the class currently targeted in the editor pane. So if you were editing class MY_CLASS which exists in file my_class.e, then that file name would be used in the Subversion update command executed.
+
+Once the command is defined, it will be accessible through EiffelStudio's Tools menu, either by selecting it explicitly or by using its associated keyboard short cut, Alt+0, in the case of this example.
+
+
+[[Image:subversion-update-in-tools-menu|Subversion update command in the tools menu]]
+
+
+===Other Subversion commands===
+
+You can use this same technique to add external commands for other Subversion commands that require only a basic form. For example, to create a command that will add the file for the currently edited class to the repository, add a new external command with the command line:
+
+svn add $file_name
+
+
+or, to revert local changes to the file associated with the class which is currently the target of the editor:
+
+svn revert $file_name
+
+
+===The option to confirm execution of a command===
+
+It's possible that in some cases, for example that of ''svn revert'', you might want to have the command provide you with a chance to back out of the deal before the command actually executes. You can do this by adding a little more to the command line:
+
+
+[[Image:subversion-update-command-02|Confirmable svn update command]]
+
+
+Here the command line:
+
+
+echo Revert changes to $class_name? && pause && svn revert $file_name
+
+
+first asks for confirmation before executing the command.
+
+When you execute this command you will see the confirmation prompt in EiffelStudio's [[Console tool|Console tool]]:
+
+
+[[Image:subversion-update-console-tool|Subversion update command with confirmation]]
+
+
+If you choose to execute the command, then just press return. If you have second thoughts and want to cancel the command, then do so by clicking the Console tool's stop button ( [[Image:metrics-tool--debug-stop-icon|Stop command]] ).
+
+
+==Defining commands for TortoiseSVN==
+
+If you are using the TortoiseSVN GUI client for Subversion on Microsoft Windows, you may prefer to have TortoiseSVN execute the Subversion commands for you from EiffelStudio. You can do this by starting '''tortoiseproc.exe''', and providing the specifics for each command as shown in [http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-automation.html Appendix D of the TortoiseSVN documentation].
+
+
+Some common Subversion command invocations are shown with their respective command lines below:
+
+
+{| border="1"
+|-
+| '''Subversion command'''
+| '''Command line'''
+|-
+| revert
+| start tortoiseproc /command:revert /path:"$file_name" /notempfile
+|-
+| commit
+| start tortoiseproc /command:commit /path:"$file_name" /notempfile
+|-
+| log
+| start tortoiseproc /command:log /path:"$file_name" /notempfile
+|-
+| diff
+| start tortoiseproc /command:diff /path:"$file_name" /notempfile
+|}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/customizing-eiffelstudio/customizing-toolbars.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/customizing-eiffelstudio/customizing-toolbars.wiki
new file mode 100644
index 00000000..3a9bc416
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/customizing-eiffelstudio/customizing-toolbars.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Customizing toolbars]]
+[[Property:weight|2]]
+[[Property:uuid|583811a0-abcc-e26f-60e9-0cd6d4f9a8a8]]
+There may be up to 26 buttons in the [[Main toolbars|standard toolbar]] and up to 17 in the [[Main toolbars|project toolbar]] . All those buttons are not shown by default though. Only 16 icons are displayed in the default standard toolbar for instance.
+It is possible to choose which button are shown and in which order they appear in the toolbars. To do so, use [[Toolbar customization|toolbar customization]] windows. they appear when you choose '''Customize standard toolbar...''' or '''Customize project toolbar...''' in the toolbars sub-menu of the View menu or in the contextual menu of the toolbars (which is displayed when you right-click in the empty space on the right of the toolbars).
+
+{{seealso|
+ local
+ ps: PROFILING_SETTING
+ -- Other local variables if necessary.
+ do
+ create ps.make
+ ps.stop_profiling
+ -- Real program execution.
+ ps.start_profiling
+ end
+
+
+And in the feature(s) that needs to be profiled:
+
+
+ local
+ ps: PROFILING_SETTING
+ -- Other local variables if necessary.
+ do
+ create ps.make
+ ps.start_profiling
+ -- What needs to be profiled.
+ ps.stop_profiling
+ end
+
+
+{{note|Even if the profiler should only work in certain sections of code, the '''Profiling''' check box of the [[General Target Options|Projects Settings]] dialog must be checked or the '''profile''' option must be set on certain clusters. }}
+
+Once the profiler has been enabled and the program has been recompiled, it is necessary to launch the program.
+
+{{tip|It is possible to profile debuggable(frozen/melted) executables as well as finalized ones. It is more interesting to profile finalized executables, though, since the execution speed is more representative of what will be obtained by your end users. }}
+
+When the program exits, a file named 'profinfo' should be generated next to it.
+
+All that's left to do is launch the [[Profiler wizard]] and follow the instructions.
+
+{{seealso|Execution > Execution Parameters ..
+* In this dialog, you can change the current arguments, working directory, and add, change or remove environment variables.
+** Use the [Add] button to add a new execution profile.
+** Select the '''Arguments''' line, and press '''[Enter]''' to set the arguments value (or double click on the related grid cell).
+** Same for Working directory
+** To change the environment variable, follow the instructions, i.e double click or press enter to Add a variable, or right click to select from existing variable list. Once the variable line is added, by Right-clicking on the variable line, it is possible to:
+*** fill with current variable value (if any),
+*** unset it (this way, at execution time, the variable will not be set)
+* Click '''[Run]''' to launch the execution in the EiffelStudio debugger.
+* It is also possible to launch the execution outside EiffelStudio using the '''[Run Workbench]''' button.
+
+{{tip|To get the command line arguments in a program, it is possible to either define the root feature as taking an array of [[ref:libraries/base/reference/string_8_chart|STRING_8]] objects, or to use the [[ref:libraries/base/reference/arguments_chart|ARGUMENTS]] class, which provides a lot of functionality linked with command line arguments. }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/tracing.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/tracing.wiki
new file mode 100644
index 00000000..5ffaa81a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/tracing.wiki
@@ -0,0 +1,220 @@
+[[Property:title|Tracing]]
+[[Property:weight|8]]
+[[Property:uuid|ecb9dd1e-52a9-25c4-b27b-4b5ec806b115]]
+=Introduction=
+
+The '''tracing facility''' allows you to see a structured log of the flow of control through your system, feature by feature. By default, execution traces are written to standard output.
+
+
+{{note|The tracing facility is not supported on the Microsoft .NET platform.}}
+
+
+=The "Trace" project setting=
+
+You can make tracing usable for a particular cluster by setting the '''Trace''' setting to '''True''' in your project settings for a particular cluster.
+
+To do this:
+* Open the [[Group Options|Project Settings]] dialog.
+* Under '''Clusters''' select the cluster you want to see traced.
+* Set the value of '''Trace''' to '''True'''.
+* Click '''Apply''' or '''OK'''.
+* You must [[Generating executables|recompile]] your project for the changes to take effect.
+
+This will cause a trace entry to be written to the console for any feature execution on a class in the cluster(s) you selected for tracing. To get a feel for this, look at the following trace outputs, built on the default Eiffel application ("Hello Eiffel World!).
+
+First, here's what the "Hello Eiffel World!" output looks like without using the tracing facility.
+
+
+[[Image:Tracing 01 off]]
+
+
+Next, here's the output when the '''Trace''' project setting is set to '''True''' on the root cluster.
+
+
+[[Image:Tracing 01 on]]
+
+
+Last, here's the output when '''Trace''' is '''True''' for both the root cluster and EiffelBase.
+
+
+[[Image:Tracing 01 with EiffelBase]]
+
+
+=Dynamic control=
+
+It is also possible to enable and disable the trace dynamically. To do this:
+* Create an object of type [[ref:libraries/base/reference/tracing_setting_chart|TRACING_SETTING]] .
+* Call [[ref:libraries/base/reference/tracing_setting_flatshort|enable_tracing]] on this object to start the trace.
+* Call [[ref:libraries/base/reference/tracing_setting_flatshort|disable_tracing]] on this object to stop the trace.
+
+{{tip|To enable tracing on only part of a system, disable tracing at the very beginning of the program, enable it just before the part of the code that should be traced, and then disable it again after this section. The code below illustrates this tip. }}
+
+
+In the root feature:
+
+
+ local
+ ts: TRACING_SETTING
+ -- Other local variables if necessary.
+ do
+ create ts.make
+ ts.disable_tracing
+ -- Program execution continues.
+ ...
+
+ -- Restore tracing before exiting for proper cleanup.
+ ts.enable_tracing
+ end
+
+
+
+Then, in a feature in which tracing is desired:
+
+
+ local
+ ts: TRACING_SETTING
+ -- Other local variables if necessary.
+ do
+ create ts.make
+ ts.enable_tracing -- Enable trace
+ -- Section needing trace.
+ ...
+ ts.disable_tracing -- Disable trace
+ end
+
+
+{{warning| Enabling/disabling tracing as shown above has to be done within the same routine otherwise the computed depth would be inaccurate and this would cause some unpredictable results.}}
+
+=Using a trace handler=
+
+You can do more complex tracing tasks by using a trace handler. The deferred class TRACE_HANDLER contains a deferred feature trace which you can effect in a descendant of TRACE_HANDLER. Your effective version of trace will be called whenever a trace event occurs. {TRACE_HANDLER}.trace looks like this:
+
+
+ trace (a_type_id: INTEGER; a_c_class_name, a_c_feature_name: POINTER; a_depth: INTEGER; a_is_entering: BOOLEAN)
+ -- Trigger a trace operation from a feature represented by `a_c_feature_name' defined in
+ -- class `a_c_class_name' and applied to an object of type `a_type_id' at a call depth `a_depth'.
+ -- If `a_is_entering' we are entering the routine, otherwise we are exiting it.
+ require
+ a_type_id_non_negative: a_type_id >= 0
+ a_depth_non_negative: a_depth >= 0
+ deferred
+ end
+
+
+You may notice in the specification for trace above that the arguments representing the class and feature names are of type POINTER (versus some variant of STRING).
+
+To make this facility more approachable for common tasks, EiffelBase also contains another class, a deferred descendant of TRACING_HANDLER, called STRING_TRACING_HANDLER in which the trace feature's arguments for class and feature names are strings, and the argument for type is an instance of TYPE rather than an integer type id as in TRACING_HANDLER. {STRING_TRACING_HANDLER}.trace looks like this:
+
+
+ trace (a_type: TYPE [detachable ANY]; a_class_name, a_feature_name: detachable STRING; a_depth: INTEGER; a_is_entering: BOOLEAN)
+ -- Trigger a trace operation from a feature represented by `a_feature_name' defined in
+ -- class `a_class_name' and applied to an object of type `a_type' at a call depth `a_depth'.
+ -- If `a_is_entering' we are entering the routine, otherwise we are exiting it.
+ require
+ a_depth_non_negative: a_depth >= 0
+ deferred
+ end
+
+
+Suppose we wanted to write trace long entries in a private log file for the entry and exit of a number of routines during the run of a simple application. We could create a descendant of STRING_TRACING_HANDLER that looks like this:
+
+
+class
+ EXAMPLE_HANDLER
+inherit
+ STRING_TRACING_HANDLER
+
+feature
+
+ trace (a_type: TYPE [ANY]; a_class_name, a_feature_name: STRING_8; a_depth: INTEGER_32; a_is_entering: BOOLEAN)
+ --
+ do
+ trace_log_file.put_string (create {STRING}.make_filled ('>', a_depth))
+ if a_is_entering then
+ trace_log_file.put_string (" Is entering " + "{" + a_class_name + "}." + a_feature_name + "%N")
+ else
+ trace_log_file.put_string (" Is leaving " + "{" + a_class_name + "}." + a_feature_name + "%N")
+ end
+ end
+
+ trace_log_file: PLAIN_TEXT_FILE
+ -- Log file
+ once
+ create Result.make_open_write ("my_log_file.txt")
+ end
+
+ close_log_file
+ -- Close log file
+ do
+ trace_log_file.close
+ end
+end
+
+
+In EXAMPLE_HANDLER the procedure trace is effected to write the desired information to the log_file.
+
+Then we could use EXAMPLE_HANDLER in a class that might look like this:
+
+
+class
+ APPLICATION
+
+create
+ make
+
+feature
+
+ make
+ -- Run application.
+ local
+ tracing_setting: TRACING_SETTING
+ tracing_handler: EXAMPLE_HANDLER
+ do
+ create tracing_setting
+ tracing_setting.enable_tracing
+ create tracing_handler
+ tracing_handler.activate
+
+ call_depth_one
+
+ tracing_handler.deactivate
+ tracing_handler.close_log_file
+ tracing_setting.disable_tracing
+ end
+
+ call_depth_one
+ -- Call depth one routine
+ do
+ call_depth_two
+ end
+
+ call_depth_two
+ -- Call depth two routine
+ do
+ call_depth_three
+ end
+
+ call_depth_three
+ -- Call depth three routine
+ do
+
+ end
+end
+
+
+In {APPLICATION}.make, the instances of TRACING_SETTING and EXAMPLE_HANDLER are created. Tracing is enabled and the handler is activated. After the section of interest, the handler is deactivated, the log file closed, and tracing disabled.
+
+Now consider a system in which {APPLICATION}.make is the root, APPLICATION is the only class in the root cluster, and that the project setting '''Trace''' is true for the root cluster only. After running the system, the content of my_log_file.txt would be:
+
+
+> Is entering {APPLICATION}.call_depth_one
+>> Is entering {APPLICATION}.call_depth_two
+>>> Is entering {APPLICATION}.call_depth_three
+>>> Is leaving {APPLICATION}.call_depth_three
+>> Is leaving {APPLICATION}.call_depth_two
+> Is leaving {APPLICATION}.call_depth_one
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/using-breakpoints.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/using-breakpoints.wiki
new file mode 100644
index 00000000..d27a9d66
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-how-tos/running-and-debugging/using-breakpoints.wiki
@@ -0,0 +1,15 @@
+[[Property:title|Using breakpoints]]
+[[Property:weight|3]]
+[[Property:uuid|f25c8058-8278-7ee3-79cb-ff97e224e74a]]
+To change the status of one breakpoint, it is possible to use the [[Breakpoint editing|breakpoints menu]] , which changes the state of a single breakpoint at a time.
+
+To change the status of several breakpoints at the same time, the easiest way is to use the [[Breakpoint commands|breakpoints-related commands]] , which have actions at feature-scope, class-scope and system-scope.
+
+{{seealso|
+
+#ifdef MY_DEBUG_FLAG/* Debug code is here */ #endif
+
+
+The corresponding construct in Eiffel is provided by the debug keyword. It is possible to wrap code inside a debug clause like this:
+
+
+ debug("MY_DEBUG_FLAG")
+ -- Debug code is here.
+ end
+
+
+It is then possible to enable or disable debug clauses globally.
+
+To modify the debug clauses status:
+* Open the [[Debug Options|Project Settings]] dialog.
+* In the '''Debug''' section, you can enable/disable the debug clauses.
+* Click '''OK'''.
+* You must [[Generating executables|recompile]] your project for the changes to take effect.
+
+{{tip|Debug clauses make it easy to remove all debug messages when finalizing a system. }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/autotest-interface.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/autotest-interface.wiki
new file mode 100644
index 00000000..1019339c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/autotest-interface.wiki
@@ -0,0 +1,114 @@
+[[Property:title|The AutoTest Interface]]
+[[Property:weight|0]]
+[[Property:uuid|6eec11df-9ea0-6834-d41b-a0c23b87c485]]
+[[Image:AutoTest interface annotated 01]]
+
+
+The AutoTest interface consists of four primary components:
+# The toolbar
+# The tests pane
+# The test filtering box
+# The tabbed creation and results reporting pane
+
+==Toolbar==
+
+The toolbar allows you to create new tests using the '''[[#The New Eiffel test wizard|New Eiffel test wizard]]''' and to run existing tests.
+
+The '''Create new tests''' command ( [[Image:Create new tests]] ) invokes the '''New Eiffel test wizard'''.
+
+The '''Run filtered tests''' command ( [[Image:debug-run-icon]] ) will, by default, run all tests that are visible in the Tests pane. Whether or not a test is visible depends upon any test [[#Filtering|filtering]] currently in effect. The '''Run filtered tests''' allows other options for running tests through its drop-down icon ( [[Image:toolbar-dropdown-icon]] ).
+
+
+[[Image:AutoTest run all drop down]]
+
+
+The '''Debug filtered tests''' command ( [[Image:AutoTest debug all icon]] ) functions in a similar manner to '''Run filtered tests''' with the exception that each test is paused at its starting point in the EiffelStudio debugger. '''Debug filtered tests''' has a drop-down icon providing the same options as '''Run filtered tests'''.
+
+
+[[Image:AutoTest debug all drop down]]
+
+
+The '''Stop all test related tasks''' command ( [[Image:debug-stop-icon]] ) will halt all tests which were started by the '''Run filtered tests''' or '''Debug filtered tests''' commands.
+
+
+==Tests==
+
+The Tests pane presents tests in one or more expandable tree views. The structures of the trees depend upon the [[#Filtering|filter]] criteria that you have specified for organizing the view. For example, if you look at tests based on the test classes in which they exist (tag root "''class''"), the structure of the tree view(s) will reflect the clusters in which the test classes exist.
+
+
+[[Image:AutoTest interface test view class]]
+
+
+Likewise, if you look at tests based on their target classes (tag root "''covers''"), the structure of the display will be based on the target classes.
+
+
+[[Image:AutoTest interface test view covers]]
+
+
+Tests and test classes are pickable in the Tests pane.
+
+
+==Filtering==
+
+The '''Filter''' box allows you to limit which tests are visible in the Tests pane (and, by consequence, the tests run when '''Run filtered tests''' is clicked) by entering filter text in the box and pressing the Enter key. Filter text can be a string of characters that is contained in a test class or test routine name, or it can be a [[Create a manual test#About Tags|tag]] or a portion of a tag hierarchy.
+
+In fact, filter text fully supports [http://www.regular-expressions.info/ regular expressions], so you can craft more complex and precise filters. (You will notice below when the '''Results''' choice is selected from the Filter box drop-down, that the filter text used is the regular expression "^result".)
+
+Clicking the '''Clear filter''' icon ( [[Image:general-reset-icon]] ) to the right of the filter box will clear any filter contents and enable the viewing of all tests. The Tests pane is depicted below after clicking the '''Clear filter''' icon and expanding some of the items:
+
+
+[[Image:AutoTest tests pane null filter]]
+
+
+The '''Filter''' box has a drop down icon on its right end. By default this icon provides views of the tests in the Tests pane based on tag criteria.
+
+
+[[Image:AutoTest filter drop down]]
+
+
+The criteria are associated with the roots of their respective tag trees. So for example, if '''Results''' is chosen the Tests pane shows tests grouped by their latest results.
+
+
+[[Image:AutoTest filter result]]
+
+
+{{note|The '''result''' tag hierarchy is, as you may have guessed, virtual and dynamic. A test falling into the '''fail''' subtree may later become part of the '''pass''' subtree without any change to the '''"testing:"''' notes in the test routine code, where tags are established. But for filtering purposes '''result''' tags work like other tags. }}
+
+
+If the '''fail''' subtree name were appended to the '''result''' filter, only the failed tests would be visible in the Tests pane:
+
+
+[[Image:AutoTest filter result fail]]
+
+
+If the filter text is a character string that occurs in a test name, test class name, or a tag path, tests with any match will be visible:
+
+
+[[Image:AutoTest filter withdraw]]
+
+
+==Results==
+
+This pane supports a tabbed display that provides information about the creation and execution of tests.
+
+After creation of one or more tests, the creation is logged under the '''Creation''' tab.
+
+After execution, the tests executed and the status of those tests are shown in the '''Execution''' tab.
+
+
+[[Image:AutoTest interface results execution]]
+
+
+After executing a set of tests, the Testing pane of the Outputs tool shows a chronology of the executions and the results of the tests executed.
+
+
+[[Image:AutoTest testing pane execution results]]
+
+
+You can view more detail about a test's execution by clicking the '''Information''' icon ( [[Image:AutoTest information icon]] ) to the right of the test's entry in '''Results''' when the '''Execution''' tab is selected.
+
+
+[[Image:AutoTest test results details]]
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/eiffel-test-wizard.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/eiffel-test-wizard.wiki
new file mode 100644
index 00000000..8a25599a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/eiffel-test-wizard.wiki
@@ -0,0 +1,99 @@
+[[Property:title|The Eiffel Test Wizard]]
+[[Property:weight|1]]
+[[Property:uuid|305a8288-cb6a-df2a-1515-e23138e21566]]
+==Introduction==
+
+The '''New Eiffel test wizard''' creates new tests based on information entered by a developer on a series of wizard panes. Each of the three test types supported by AutoTest requires certain unique information. Therefore, there is a unique sequence of wizard panes corresponding to each test type, but you will notice that some of the same wizard panes are used in more than one sequence.
+
+The '''New Eiffel test wizard''' is invoked by clicking the '''Create new test''' button ( [[Image:create new tests]] ) on the AutoTest interface toolbar. By default, clicking '''Create new test''' invokes the wizard sequence for a manual test. To choose a different type of test, click the triangle to the right of '''Create new test''' button and use the drop-down menu to select the specific test type you want.
+
+
+[[Image:AutoTest create new test]]
+
+
+Once you begin the process or creation of a new test, you will be shown the sequence of wizard panes. The wizard panes are ordered in such a way that the information most likely to change from the creation of one test to the next appears in the earliest panes. This means that if you need only to change information on the first wizard pane, and the information on later panes can remain as it was when you created a previous test, then you can click the '''Launch''' button directly from the first wizard pane. In this way, you avoid having to re-enter the information on the later panes.
+
+
+==The manual test wizard sequence==
+
+
+Creating manual tests will involve using the following wizard panes. For a guided tour of this process, see [[Create a manual test]].
+
+
+===The "Manual Test" pane===
+
+
+In this pane you provide a name for the new test that will be created. This name will be a feature name of the created test class. In this pane you can also indicate that the created class should include redefined versions of features + and - buttons, to declare a list of one or more classes as target classes for generated tests.
+
+Other information necessary for creating generated tests is:
+
+*'''Cutoff (minutes)''' -- How long AutoTest will execute random invocations of the routines in the classes to be tested, specified in minutes.
+*'''Cutoff (invocations)''' -- How long AutoTest will execute random invocations of the routines in the classes to be tested, specified by invocation count.
+*'''Routine timeout (seconds)''' -- How long AutoTest will wait for completion of any invocation.
+*'''Random number generation seed''' -- The seed used for random number generator used during the process. A value of zero instructs AutoTest to use a seed derived from the system clock.
+*'''Slice minimization''' -- Designate '''slicing''' as the approach for minimizing the size of generated tests.
+*'''DDMin for minimization''' -- Designate '''DDMin''' as the approach for minimizing the size of generated tests.
+*'''HTML statistics''' -- Output history and statistics from the synthesizing process in html format.
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/index.wiki
new file mode 100644
index 00000000..751550aa
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/autotest/index.wiki
@@ -0,0 +1,31 @@
+[[Property:title|AutoTest]]
+[[Property:weight|-1]]
+[[Property:uuid|1d8cc843-238e-feaa-cfa6-629f080ffba7]]
+==Introduction==
+
+AutoTest is a facility within EiffelStudio that helps developers create, manage, and execute software tests.
+
+This documentation is intended to describe the AutoTest interface and capabilities. In addition to this material, you will find a tutorial entitled [[Using AutoTest]] in [[Introducing EiffelStudio]]. The tutorial employs a simple example that is used to work step-by-step through AutoTest's different facilities. The tutorial also explains testing basics and recommendations for using AutoTest. Lastly, the tutorial contains definitions for terminology used in both the tutorial and in these reference pages. It is recommended that you become familiar with these definitions, specifically:
+
+#[[Testing: Background and basics#Test classes and tests|Test classes and tests]]
+#[[Testing: Background and basics#Types of tests|The types of test supported by AutoTest]]
+#[[Testing: Background and basics#Anatomy of a test|Target classes and target routines]]
+#[[Execute tests#About test results|Test results]]
+
+
+
+==Components==
+
+When you use AutoTest, you control things by using two components: '''[[The AutoTest Interface]]''' and '''[[The Eiffel Test Wizard]]'''. The interface is used to access, manage, execute, and monitor tests. The New Eiffel test wizard is used to help you create new tests.
+
+
+{{Caution|At this time, AutoTest will work only for project targets in the classic Eiffel environment. This means that projects targeted to Microsoft .Net will not be able to use AutoTest.}}
+
+
+{{Recommended|During the transition to void-safe Eiffel, projects can be built using '''experimental''' mode. This mode is as stable as '''non-experimental''' mode, but includes some facilities that might break existing code in a few circumstances. However, since version 6.5, EiffelStudio itself is built in experimental mode, so '''we recommend that you use AutoTest only on projects also built using experimental mode'''. Experimental mode can be invoked by using the "-experiment" option from the command line, or on Microsoft Windows by following the '''Start''' menu path to EiffelStudio and selecting experimental mode. }}
+
+
+{{SeeAlso|View -> Go to
+
+* '''Current class and feature name fields'''
+** These fields display the names of the class and/or feature currently active in the editor pane.
+** It is possible to type a class or feature name to center the editor on it.
+** Typing a class name that does not exist in the set of known classes pops up a dialog to create a class of that name.
+** The "wildcard" characters '''*''' and '''?''' may be used in these fields.
+
+* '''View icons''' [[Image:view-editor-icon]] , [[Image:view-clickable-icon]] , [[Image:view-flat-icon]] , [[Image:view-contracts-icon]] and [[Image:view-flat-contracts-icon]]
+** Click to change the view currently displayed in the editor.
+** Drop a pebble to retarget the editor to a class or feature using the selected view.
+
+* '''Viewpoints selector'''
+** The Viewpoints selector can only be active if you have used [[Group Options#Renaming|renaming and/or prefixing]] in your project settings to specify alternate class names for some classes used by your project. Otherwise it is inactive. In a project with renaming and/or prefixing, the Viewpoints selector becomes active when both of the following are true:
+*** The editor window is focused on a class that has been renamed or prefixed in project settings.
+*** The class is being viewed in a formatted view, i.e., a view other than the '''Basic text view'''.
+** The Viewpoints selector allows you to select how you would like to view renamed or prefixed classes:
+*** As they really exist, i.e., as if you are their producer, or
+*** Using the alternative names that you have specified in your project settings.
+
+
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/favorites-menu.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/favorites-menu.wiki
new file mode 100644
index 00000000..69d962c8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/favorites-menu.wiki
@@ -0,0 +1,15 @@
+[[Property:title|Favorites menu]]
+[[Property:weight|2]]
+[[Property:uuid|8157cc25-a299-3af6-8218-e5dfd094793d]]
+The '''favorites''' menu is composed of two parts.
+
+First, there are three commands:
+* The '''Add to Favorites''' command, that adds the currently edited class to the root of the favorites tree.
+* The '''Show/Hide Favorites''' command, that shows or hides the [[Favorites tree|favorites tree]] .
+* The '''Organize Favorites''' command, that displays the [[Organize favorites dialog|Organize Favorites dialog]] .
+
+After the separator, the favorites are displayed in a menu representation. Clicking on any of these menu items will send the selected favorite class to the editor.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/favorites-tree.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/favorites-tree.wiki
new file mode 100644
index 00000000..a853cf1d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/favorites-tree.wiki
@@ -0,0 +1,14 @@
+[[Property:title|Favorites tree]]
+[[Property:weight|1]]
+[[Property:uuid|642c0a65-971e-b399-3e15-74af6dada046]]
+The favorites tree gives a graphical representation of the favorite classes of the system, as opposed to the favorites menu.
+
+[[Image:favorites-tree]]
+
+In this tree, the folders are user-definable through the [[Organize favorites dialog|Organize Favorites dialog]] . They have no other goal than ordering the favorites. In particular, they are entirely independent from the clusters of the system.
+
+Clicking a class in the favorites tree edits it. Keyboard navigation is also available. Favorite classes are [[Pick-and-drop mechanism|pickable]] too, so that it is possible to send them to all interface components that accept classes.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/index.wiki
new file mode 100644
index 00000000..2fc3a100
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/index.wiki
@@ -0,0 +1,9 @@
+[[Property:title|Favorites tool]]
+[[Property:weight|4]]
+[[Property:uuid|75cfeda2-3823-ef29-130a-39e686116f40]]
+The favorites tool ( [[Image:tool-favorites-icon]] ) gives a quick access to often used classes and features. These may be either classes of a library or classes that are often being modified. They are project-wide, which means they are shared by all development windows working on the same project.
+
+[[Image:favorites-tool]]
+
+The favorites tool mainly consists of [[Favorites menu|the favorites menu]] and of the left-panel tool, giving a [[Favorites tree|tree representation]] of the favorite classes.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/create-favorite-folder-command.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/create-favorite-folder-command.wiki
new file mode 100644
index 00000000..0949f486
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/create-favorite-folder-command.wiki
@@ -0,0 +1,12 @@
+[[Property:title|Create favorite folder command]]
+[[Property:weight|2]]
+[[Property:uuid|a6d2f458-81ad-bc62-6476-2aabb3900a80]]
+This command [[Image:favorites-dialog-new-folder]] is accessible in the Organize favorites dialog. When clicked, a dialog is popped up that prompts for a name for the new folder:
+
+[[Image:favorites-new-folder-dialog]]
+
+After typing the name of the new folder, pressing '''OK''' adds it to the root of the favorites.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/index.wiki
new file mode 100644
index 00000000..67657924
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/index.wiki
@@ -0,0 +1,16 @@
+[[Property:title|Organize Favorites dialog]]
+[[Property:weight|3]]
+[[Property:uuid|3e47cb30-c974-b0f4-1624-4bba035bd906]]
+The organize favorites dialog provides a way of sorting the favorites.
+
+
+[[Image:favorites-dialog]]
+
+
+The left part of this dialog is composed of a [[Favorites tree|tree representation]] of the favorites identical to the one in the [[Favorites tool|favorites tool]] .
+With it, it is possible to [[New favorite class command|add classes]] and [[Create favorite folder command|folders]] to the favorites or [[Remove favorite command|remove some]] , and also to [[Move to Folder command|spread]] the favorite classes among the favorite folders.
+
+{{warning|Since the favorites are project-wide, any modifications made in this dialog are reported in all development windows. }}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/move-folder-command.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/move-folder-command.wiki
new file mode 100644
index 00000000..c75d1025
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/favorites-tool/organize-favorites-dialog/move-folder-command.wiki
@@ -0,0 +1,23 @@
+[[Property:title|Move to Folder command]]
+[[Property:weight|3]]
+[[Property:uuid|087439e6-dc0c-d394-b3ed-ffaaf5928b39]]
+The Move to Folder command [[Image:favorites-dialog-move-to]] , located in the [[Organize favorites dialog|Organize Favorites dialog]], makes it possible to move favorite items (classes and folders) to specific folders. It is enabled only when an item is selected in the left-hand tree in this dialog. The source is the selected item that could be moved. You can select a different source item by clicking it in the tree, or by using the keyboard.
+
+When pressed, a dialog is popped up, that prompts for the favorite folder the selected item should be moved to.
+
+[[Image:favorites-choose-folder-dialog]]
+
+Select the destination folder by expanding the tree and by clicking it. The top tree item, named Favorites, represents the root of the favorites.
+
+Pressing '''OK''' moves the source item to the destination folder. Pressing '''Cancel''' discards the dialog box and does not move the source item.
+
+{{tip|You can also move items around by picking them in the favorites tree and dropping them where you want. }}
+
+
+{{seealso|
+ View -> Tools -> Search
+
+or
+
+ Edit -> Find
+
+
+==The Search panel==
+
+[[Image:search-tool]]
+
+Fig. 1: Search panel
+
+The search panel has two tabs. The '''search tab''' allows you to define how and for what strings and patterns you want to search (or search and replace). The '''scope tab''' allows you to define the limits of your search.
+
+===The Search tab===
+
+On the '''search tab''' of the search panel (shown in Fig. 1), you will find two combo boxes, labeled '''Search for:''' and '''Replace with:'''. These are used to enter the string or pattern for which you want to search and the word or phrase, if any, which you want the editor to use to replace matches resulting from the search.
+
+Also in the Search tab, there are buttons that control whether you want to '''search''', to '''replace''' the most recently found match, or '''replace all''' matches.
+
+====Using sub-patterns and back references====
+
+If you are searching using '''regular expressions''' (see [[#The options group|The options group]] below), you can use '''sub-patterns''' in your search pattern. This allows you to capture the portion of a "match" that satisfies a sub-pattern the search. Then, in the replacement, you can make a '''back reference''' to that captured part of the match. You can create more than one sub-pattern in any search pattern.
+
+To create a sub-pattern, in the '''Search for:''' combo box, enclose in parentheses any parts of the search that you want to capture for use in the replacement. Then, in the '''Replace with:''' combo box, you can back reference each capture by its index enclosed in backslashes. The following example should help make this clear.
+
+Assume that the text you are searching contains the following:
+
+ -- The dog is chasing the cat
+
+Then, you enter values into the '''Search for:''' and '''Replace with:''' boxes so that it looks like this:
+
+
+[[Image:Search capture boxes]]
+
+After the replacement, your text will look like this:
+
+ -- The cat is being chased by the dog
+
+
+====The options group====
+
+There are four search options, each of them represented by a check box:
+
+* '''Match case:''' If this option is selected, the search will be case-sensitive, which means that if you search for "example", the tool will highlight "example" but not "EXAMPLE" or "Example", as there are no capital letters in the searched pattern.
+
+* '''Whole word:''' If this option is selected, the tool will look for isolated words. A word is isolated if it is surrounded by spaces or if it is at the beginning or the end of a line.
+
+* '''Use regular expressions:''' You can enter a regular expression as a pattern for matching. In Fig. 1, the regular expression in the '''Search for:''' box describes very simple quoted strings. Regular expressions give you the ability to create powerful pattern-oriented searches. If you are not familiar with regular expressions, you might check out the tutorial at [http://www.regular-expressions.info/ www.regular-expressions.info].
+
+{{note|It might be good advice to temper your expectations of using regular expressions with these words, [http://www.devtopics.com/101-more-great-computer-quotes/ attributed] to Jamie Zawinski: "Some people, when confronted with a problem, think `I know, I'll use regular expressions.' Now they have two problems."}}
+
+* '''Search backwards:''' If this option is selected, the tool will highlight the previous occurrence of the searched pattern instead of the next occurrence when you click the '''Search button'''.
+
+{{note|If the search tool hits one end of the text, it will automatically continue from the other end. }}
+
+===The Scope tab===
+
+[[Image:search-tool-scope-tab]]
+
+Fig. 2 Scope tab
+
+In the scope tab, you can choose how wide a search you would like to make.
+
+* '''Current editor''' Your search will be confined to the class which is the current target of the Editor pane.
+* '''Whole project''' The entire project universe will be searched.
+* '''Custom''' You are given the opportunity to choose which classes and clusters you would like to be included in the search scope.
+
+When you make certain choices, one or both of the check boxes become enabled.
+
+If you choose '''Whole project''', the '''Only compiled classes''' check box becomes enabled. If you check the box, then the search is confined to classes which are actually included in your system (i.e., reachable via relationships from your root class ... the classes shown with blue ovals). If you leave '''Only compiled classes''' unchecked, all classes in your project's universe are included in the search (blue and grey ovals). With '''Whole project''', the '''Recursive''' check box remains disabled.
+
+If you choose '''Custom''', both the '''Only compiled classes''' check box and the '''Recursive''' check box become enabled. The '''Recursive''' check box allows the search to include recursively subclusters of any cluster included in the search.
+
+==The Search Report panel==
+
+[[Image:search-report-01]]
+
+Fig. 3 Search Report panel
+
+The search report panel will be visible whenever your search returns matches on multiple classes. The '''collapsed''' view of the search results shows the class name of classes in which matches were found, and the number of matches. When you '''expand''' and entry, you see the line number at which the match occurs, and the exact string that caused the match. If you have used [[#Using sub-patterns and back references|'''sub-patterns''']] in your search, then the captures for each sub-pattern will also be shown in the search report panel when the entries are completely expanded.
+
+The items in the search report panel can be [[Pick-and-drop mechanism|picked and dropped]] into the editor or other appropriate targets in EiffelStudio.
+
+
+
+
+{{seealso|The [[Search functionality]] part of the EiffelStudio Editor section to learn keyboard shortcuts and menu entries to launch searches without using the search tool directly. }}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/index.wiki
new file mode 100644
index 00000000..9deb10a7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/index.wiki
@@ -0,0 +1,16 @@
+[[Property:title|Windows tool]]
+[[Property:weight|5]]
+[[Property:uuid|57b14a4b-8694-12f6-06c8-24411e331559]]
+The windows tool ( [[Image:windows-windows-icon]] ) gives a list of opened development windows.
+
+[[Image:windows-tool]]
+
+Its main component is the [[Window list|Window list]] .
+
+It is also linked to the [[Window menu|Window menu]] menu.
+
+[[Window related commands|Window related commands]] provide global management of windows.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-list.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-list.wiki
new file mode 100644
index 00000000..66a3a5b3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-list.wiki
@@ -0,0 +1,14 @@
+[[Property:title|Window list]]
+[[Property:weight|1]]
+[[Property:uuid|95058f0f-7c1b-841d-03df-dde4494afaf4]]
+The window list is the main part of the [[Windows tool|window tool]] .
+
+[[Image:windows-tool]]
+
+It displays all opened development windows. Left-clicking a development window in the list raises it so that it becomes the top-level window. Right-clicking one pops up a context menu.
+
+The four first commands, '''Close''', '''Minimize''', '''Maximize''' and '''Raise''', are relative to the clicked development window. The last command, '''New window''', creates a new development window.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-menu.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-menu.wiki
new file mode 100644
index 00000000..f6035199
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-menu.wiki
@@ -0,0 +1,8 @@
+[[Property:title|Window menu]]
+[[Property:weight|2]]
+[[Property:uuid|539ef2b0-ed6b-3cfb-5c9f-535fb25a987d]]
+The '''window''' menu is divided into two parts. The first one is composed of the [[Window related commands|window-related commands]] . The second one is the list of all opened development windows. Clicking any of these raises the selected development window, so that it becomes the top-level window.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-related-commands.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-related-commands.wiki
new file mode 100644
index 00000000..3cf7b838
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/browsing-tools/windows-tool/window-related-commands.wiki
@@ -0,0 +1,12 @@
+[[Property:title|Window related commands]]
+[[Property:weight|3]]
+[[Property:uuid|2c8c28d2-7690-dbe2-a264-798d5ad256f7]]
+A few commands give the possibility to manage the development windows globally. They are located both in the [[Window menu|Window menu]] and in the main toolbar.
+* '''New window''': this command ( [[Image:new-window-icon]] ) creates a new empty development window. Note that it is also possible to [[Pick-and-drop mechanism|drop]] a class or a feature on it to create a development window that is immediately centered on the dropped item.
+* '''Minimize all''': this command ( [[Image:windows-minimize-all-icon]] ) iconifies all development windows.
+* '''Raise all''': this command ( [[Image:windows-raise-all-icon]] ) raises all minimized development windows.
+* '''Raise unsaved windows''': this command raises all the development windows that have not been saved. It may be combined with the '''Minimize all''' command to find easily which development windows need to be saved.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/Errors-and-warnings/Legacy-code/VWMA--1-.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/Errors-and-warnings/Legacy-code/VWMA--1-.wiki
new file mode 100644
index 00000000..ac224169
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/Errors-and-warnings/Legacy-code/VWMA--1-.wiki
@@ -0,0 +1,27 @@
+[[Property:modification_date|Mon, 19 Nov 2018 16:49:36 GMT]]
+[[Property:publication_date|Fri, 06 Jul 2018 13:19:54 GMT]]
+[[Property:uuid|26E32CD7-7C68-4CDD-A29A-81343EC0DD3B]]
+[[Property:weight|0]]
+[[Property:title|VWMA(1)]]
+[[Property:link_title|VWMA(1)]]
+In legacy code, before EiffelStudio [[/doc/uuid/73F20392-AB22-4CD6-BFE5-83296B8BD64B|18.07]], the target of a reattachment could be used to determine the type of a manifest array. For example, with the declaration
+```eiffel
+ x: ARRAY [READABLE_STRING_GENERAL]
+```
+the reattachment
+```eiffel
+ x := <<"abc", "def">>
+```
+led to creation of an array of type x: T is treated like x: attached T
+| [[Release notes for EiffelStudio 7.0 | 7.0]] and [[EiffelStudio release notes | more recent]]
+|-
+| False
+| x: T is treated like x: detachable T
+| [[Release notes for EiffelStudio 6.8 | 6.8]], [[Release notes for EiffelStudio 6.7 | 6.7]], [[Release notes for EiffelStudio 6.6 | 6.6]], [[Release notes for EiffelStudio 6.5 | 6.5]]
+|-
+| colspan="4" style="background: #E8E8E8" |
+|-
+| rowspan="6" style="text-align: center" | [[Creating a new void-safe project#Project settings for void-safe projects|Void-safety]]
+|-
+| No
+| No checking against any void-safety validity rules.
+| [[Release notes for EiffelStudio 7.2 | 7.2]], [[Release notes for EiffelStudio 7.1 | 7.1]], [[Release notes for EiffelStudio 7.0 | 7.0]], [[Release notes for EiffelStudio 6.8 | 6.8]], [[Release notes for EiffelStudio 6.7 | 6.7]], [[Release notes for EiffelStudio 6.6 | 6.6]], [[Release notes for EiffelStudio 6.5 | 6.5]]
+|-
+| Conformance
+| The attachment marks are not ignored for type conformance checks (with respect to VJAR/VBAR and related validity rules).
+|
+|-
+| Initialization
+| Validity rules are selectively checked. The initialization rule (VEVI) and the target rule (VUTA) are checked only for attached entities and attached call targets -- i.e., detachable cases are not checked.
+|
+|-
+| Transitional
+| Checking against all void-safety validity rules using some potentially unsafe CAPs, assuming that all assertions are satisfied, and ignoring some complex cases like passing incompletely initialized Current from a creation procedure or creating agents when Current is not completely initialized.
+| [[Release notes for EiffelStudio 13.11 | 13.11]], [[Release notes for EiffelStudio 7.3 | 7.3]]
+|-
+| Complete
+| Complete checking against all void-safety validity rules ignoring any unsafe CAPs.
+| [[Release notes for EiffelStudio 14.05 | 14.05]] and [[EiffelStudio release notes | more recent]]
+|}
+
+
+=Discussion of compatibility issues=
+
+==Eiffel Software and the wheels of progress==
+
+The Eiffel analysis, design, and programming language has remained relatively static since its original specification in the mid-1980's. However, periodically it has become necessary to make certain changes in order to make certain language improvements and to enable new facilities. It is the policy of Eiffel Software, when such changes are made, to ensure that the changes have minimum impact upon existing software. For some changes, that means no impact at all, but for others it means that the new Eiffel is incompatible with the old Eiffel (the so-called "breaking changes" … those changes that break existing code). And that means that existing software will have to be changed to take advantage of the recent changes to Eiffel. Even so, Eiffel Software has been able to ease the transition from old to new by implementing certain compatibility options which allow existing software still to run as in previous versions during periods of transition.
+
+==Sources of changes==
+
+The Eiffel programming language is standardized under the [http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO] and [http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA] standardization organizations. So, it is not surprising that many of the changes that are implemented by Eiffel Software are driven by the work of the Eiffel standardization committee.
+
+Still, the standard itself is a moving target, and there are always differences between what is in the current standard and what has been implemented by Eiffel Software. Also, only immediately after publication of the standard might there be complete agreement between the standard document itself and the perception of Eiffel by the standard committee. That is to say that a new version of the standard may be published once every few years, but the process of moving the language forward continues in the committee in the meantime.
+
+The diagram below attempts to characterize the relationship among the various factors that define Eiffel.
+
+
+[[Image:Eiffel implementation venn diagram]]
+
+
+It is easy to see the overlapping areas. The centermost represents that part of Eiffel that is at once implemented by Eiffel Software, exists in the current published version of the standard, and is anticipated to remain in the standard for the next version.
+
+The other areas represent Eiffel features that are supported by only one or a combination of two of these factors.
+
+
+==Types of changes==
+
+There are many different types of changes that can effect existing code. Here are some examples of these.
+
+# '''Changes to the Eiffel library classes'''
+## Removal or obsoleting of classes or features. Example: {SPECIAL}.make is removed as void-unsafe.
+## Changing conformance. Example: ARRAYED_LIST no longer conforms to ARRAY.
+## Changing feature types. Example: {ARRAYED_LIST}.count and {ARRAYED_LIST}.area were changed from attributes to functions.
+# '''Language keyword changes'''
+## A word that was once a keyword is no longer a keyword (potentially allowing the word to be used as an identifier, and affecting software using it as a keyword). Example: indexing is no longer a keyword.
+## A word that was not a language keyword in previous versions, becomes one in the current version (potentially breaking any code that used that word as an identifier). Example: attached
+## A keyword (or notation) used in a particular context is retired from that context in favor of a more appropriate keyword. (potentially affecting all software using the old keyword in that context). Example: indexing is retired in favor of note.
+## The usage of an existing keyword in a new context (usually has no effect on existing software). Example: as used in attached syntax for object test (in addition to its traditional role in the rename part of the inherit clause.)
+# '''Language construct changes'''
+## Addition of new constructs or extensions to existing constructs. Example: [[ET: Instructions#Loop|iteration form]] of the loop construct.
+## Changes to existing constructs. Example: Object test syntax change: attached {T} expr as u versus {u: T} expr
+## Removal of obsolete constructs.
+
+==Types of compatibility options==
+
+===EiffelStudio and Eiffel compiler options===
+
+These "mode" options are selected when EiffelStudio is started up or when the command line Eiffel compiler is invoked. The following two mode options were introduced in version 6.3 on the eve of implementing [[Void-safe programming in Eiffel|void-safety]] as an integral feature of Eiffel. The mode options were intended to help developers deal with the [[Void-safe changes to Eiffel libraries|changes to the Eiffel libraries for void-safety]].
+
+* '''-compat''' runs EiffelStudio or the Eiffel compiler in "compatibility mode" so that compilation will use libraries that are compatible with older versions of Eiffel.
+* '''-experiment''' runs EiffelStudio or the Eiffel compiler in "experimental mode" so that compilation will use libraries based on an upcoming version of Eiffel.
+
+Implicit here is that there is also a "default" mode which is invoked when neither of compatibility nor experimental mode is used. Default mode assumes a "current" set of libraries.
+
+Also, implied by these modes is a progression of their meanings over time. That is, as time passes and language changes are reflected in Eiffel Software's products, the "experimental" mode of today will likely be the "default" mode of tomorrow. And the "default" mode of today may become the "compatible" mode of tomorrow.
+
+===Project settings===
+
+These options are set in the EiffelStudio Project Settings dialog box.
+
+The most important of these is the '''[[Setting the syntax variant|Syntax]]''' level variant setting. You can choose among a set of syntax level variants that let you control how the compiler views certain language changes. So, for example, if you are compiling classes that contain obsolete keywords, you would set the '''Syntax''' setting to the '''Obsolete syntax''' variant.
+
+Bear in mind that the detail meanings of the various syntax variants may change from version to version. So, it's a good idea periodically to check the [[Syntax level variant settings by version|syntax level variant settings by version]].
+
+==Compatibility tools==
+
+===The syntax updater===
+
+The syntax updater is located in the EiffelStudio "tools" folder. It is a command line utility that will update certain syntax elements from obsolete syntax to current syntax. The syntax updater was introduced with EiffelStudio version 6.4.
+
+The tool makes the following updates to existing code:
+# Replaces obsolete "!!" syntax with create keyword syntax.
+# Replaces obsolete keyword creation with create.
+# Removes obsolete keyword is after routine signatures.
+# Replaces obsolete keyword is in constants with "=" (e. g., "i: INTEGER is 5" becomes i: INTEGER = 5").
+# Replaces obsolete keyword indexing with note.
+# Replaces the June 2006 Standard object test syntax (e. g., "{x: T} exp") with the committee-approved provisional standard syntax (e. g., "attached {T} exp as x").
+# Replaces obsolete non-object feature call syntax with current syntax (e. g., "feature {X}.f" becomes "{X}.f").
+# Replaces attached and detachable type markers from June 2006 Standard with committee-approved provisional standard syntax (e. g., "x: !T" becomes "x: attached T" and "x: ?T" becomes "x: detachable T").
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/batch-compilation.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/batch-compilation.wiki
new file mode 100644
index 00000000..5c335277
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/batch-compilation.wiki
@@ -0,0 +1,47 @@
+[[Property:title|Batch compilation]]
+[[Property:weight|2]]
+[[Property:uuid|18958db6-dafc-57b7-cdef-aca01bc13661]]
+In order to launch a compilation without user intervention you need to specify the `-batch` switch in the '''ec''' command line, otherwise the Eiffel compilation will be blocked. We will present below a typical example of batch processing on both Unix and Windows platforms where we want to compile a project in both frozen and finalized mode, then to launch the C compilations. At the same time we want to save the output of '''ec''' and the C compilations.
+
+===Unix===
+In a file called `launch_ec` you can have the following:
+
+#!/bin/sh
+output_file="/output_path/OUTPUT"
+
+cd /your_project_path
+
+#Launch Eiffel compilation
+ec -batch -config config.ecf -finalize -c_compile 2> $output_file
+
+#Since only C compilation for finalized code is done
+#Launch C compilation for frozen code
+
+cd EIFGENs/target_name/W_code
+finish_freezing > $output_file
+
+
+It will go the directory where your project is located and compile your Eiffel code using the `config.ecf` file located in your project directory and compile automatically the C code. All outputs will be stored in the file `/output_path/OUTPUT`.
+
+{{note|All output from '''ec''' are going to the error output, so do not forget to redirect the error output when you want to see the result. }}
+
+===Windows===
+In a file called `launched_ec.bat` you can have the following:
+
+rem Launch Eiffel compilation
+ec -batch -config config.ecf -finalize -c_compile > c:\output_path\OUTPUT
+
+rem Since only C compilation for finalized code is done
+rem Launch C compilation for frozen code
+cd EIFGENs\target_name\W_code
+finish_freezing > c:\output_path\OUTPUT
+
+
+It will go the directory where your project is located and compile your Eiffel code using the `config.ecf` file located in your project directory and compile automatically the C code. All outputs will be stored in the file `c:\output_path/OUTPUT`.
+
+{{seealso|
+ (A) Ancestors : show the ancestors of a class.
+ (B) Attributes : show the attributes of a class.
+ (C) Clients : show the clients of a class.
+ (E) Deferred : show the deferred features of a class.
+ (D) Descendants : show the descendants of a class.
+ (V) Edit : edit the text of a class.
+ (P) Exported : show the exported features of a class.
+ (X) Externals : show the external features of a class.
+ (F) Flat : show the flat form of a class.
+ (I) Flatshort : show the flat-short form of a class.
+ (O) Once : show the once & constant features of a class.
+ (R) Routines : show the routines of a class.
+ (S) Short : show the short form of a class.
+ (U) Suppliers : show the suppliers of a class.
+ (T) Text : show the text of a class.
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+
+Each command will prompt you for the name of a class and a filter to use; you can also include the class name and the filter name after the command, separated by a space, as in:
+
+Command => a linked_list ascii
+to obtain the ancestors of the
+ -- Automatic generation produced by ISE Eiffel --
+LINKED_LIST [G]
+ DYNAMIC_LIST [G]
+ LIST [G]
+ CHAIN [G]
+ CURSOR_STRUCTURE [G]
+ ACTIVE [G]
+ BAG [G]
+ COLLECTION [G]
+ CONTAINER [G]
+ ANY
+ INDEXABLE [G, H -> INTEGER]
+ TABLE [G, H]
+ BAG [G]...
+ SEQUENCE [G]
+ ACTIVE [G]...
+ BILINEAR [G]
+ LINEAR [G]
+ TRAVERSABLE [G]
+ CONTAINER [G]...
+ LINEAR [G]...
+ FINITE [G]
+ BOX [G]
+ CONTAINER [G]...
+ SEQUENCE [G]...
+ DYNAMIC_CHAIN [G]
+ CHAIN [G]...
+ UNBOUNDED [G]
+ FINITE [G]...
+ DYNAMIC_CHAIN [G]...
+
+ -- Generated by ISE Eiffel --
+ -- For more details: http://www.eiffel.com --
+
+Command =>
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/compile-and-run-menu.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/compile-and-run-menu.wiki
new file mode 100644
index 00000000..a09dd87e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/compile-and-run-menu.wiki
@@ -0,0 +1,29 @@
+[[Property:title|Compile (and run) menu]]
+[[Property:weight|1]]
+[[Property:uuid|58af783e-7fc4-9fa3-2374-4143204948bb]]
+The Compile command (i or I) in the main menu yields the following item menu:
+
+ (A) Arguments : set the arguments.
+ (C) F-compile : (re)compile the C code generated by finalize.
+ (Z) Finalize : finalize the system (discard assertions by default).
+ (F) Freeze : freeze the system.
+ (L) Melt : melt the system.
+ (K) Quick melt : quick melt the system.
+ (R) Run : execute the system.
+ (W) W-compile : (re)compile the C code generated by freeze.
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+
+The most common compiling option is L (Melt): recompile the system, melting recent changes. The other compilation possibilities are F (Freeze) and Z (Finalize). After a Freeze you will need to C-compile the result using the W (W-compile) command; similarly, you can C-compile the result of a Finalize using C (F-compile).
+
+{{caution|You cannot select a different project from within ec loop; also, you cannot select a different configuration file from within the command, although you may of course change the contents of the configuration file (for example by using an editor in an other window). }}
+
+The R option (Run) runs the application. You will be prompted for the arguments if the application needs any.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/documentation-menu.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/documentation-menu.wiki
new file mode 100644
index 00000000..323ac9a7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/documentation-menu.wiki
@@ -0,0 +1,21 @@
+[[Property:title|Documentation menu]]
+[[Property:weight|7]]
+[[Property:uuid|4ed93bc4-07eb-57ed-b339-4890b5f58fcc]]
+The Documentation Menu enables you to generate documentation about the classes of your system:
+
+ (I) Documentation (Flat/Short): Generate flat/short form of all classes in system.
+ (S) Documentation (Short): Generate short form of all classes in system.
+ (F) Documentation (Flat): Generate flat form of all classes in system.
+ (T) Documentation (Text): Generate text form of all classes in system.
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+
+The four documentation commands will trigger the creation of documentation files corresponding to requested information using the specified filter. These files will then be located in the Documentation subdirectory of your project directory.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/feature-menu.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/feature-menu.wiki
new file mode 100644
index 00000000..5d0befda
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/feature-menu.wiki
@@ -0,0 +1,45 @@
+[[Property:title|Feature menu]]
+[[Property:weight|3]]
+[[Property:uuid|a662251b-777d-5e28-0e52-ba4932195528]]
+The Feature Menu enables you to find properties of a feature:
+
+ (A) Ancestors : show the ancestor versions of a feature.
+ (C) Callers : show the callers of a feature.
+ (D) Descendants : show the descendant versions of a feature.
+ (F) Flat : show the flat form of a feature.
+ (O) Homonyms : shown the homonyms of a feature.
+ (I) Implementers : show the classes implementing a feature.
+ (T) Text : show the text of a feature.
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+
+Each command will prompt you for the name of a class, the name of a feature in that class and a filter name; you can specify these names (or just the class name) after the command.
+{| border="1"
+|-
+| Ancestors
+| All the versions of a feature that appeared in ancestors.
+|-
+| Callers
+| The list of classes which contains calls to the feature. Modifiers:
+* All senders - include all callers rather than only those in the specified class
+* Only assigners - restrict callers to those that use given feature only as a target of an assignment instruction
+* Only creators - restrict callers to those that use given feature only as a target of a creation instruction
+
+|-
+| Descendants
+| All the versions of a feature that appeared in descendants.
+|-
+| Implementers
+| The list of classes where the feature is redeclared.
+|}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/index.wiki
new file mode 100644
index 00000000..a0192afb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/index.wiki
@@ -0,0 +1,25 @@
+[[Property:title|Command line interactive mode]]
+[[Property:weight|3]]
+[[Property:uuid|3a0acea6-c6d1-c7b9-c2f9-88021cad26b6]]
+If you need to use '''ec''' to execute a number of successive operations on a system, you do not need to restart the command each time; instead you may use the '''-loop''' option, which will interactively prompt you for successive operations.
+If you launch '''ec''' with this option, you will get the interactive version's Main Menu:
+
+==== ISE EiffelStudio - Interactive Batch Version (v5.5.0926 Enterprise Edition) ===
+ (C) Class : class formats and information.
+ (I) Compile : compile or run the system.
+ (F) Feature : feature formats and information.
+ (S) System : Config and cluster details.
+ (T) Testing : manage and run tests.
+ (P) Profile : information about a profiled run.
+ (D) Documentation: create documents from the system.
+
+ (H) Help : show list of commands.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+Command =>
+
+ (S) Switches : show the output switches
+ #Call-E Name-E Total-D
+ Self-D Desc-D %Time-D.
+ (U) Query : manipulate subqueries.
+ (I) Input : specify input file (filename or last_output)
+ [*.pfi].
+ (L) Language : specify language (eiffel, c, cycles)
+ [eiffel].
+ (R) Run : run the query.
+ (G) Generate : generate profile information for latest run.
+ (E) Defaults : reset all values to their defaults.
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+==Switches submenu==
+The (S) Switches submenu enables you to set global options. It leads you to the following set of choices:
+
+ (N) Calls : disable output of number of calls to a feature [enabled].
+ (F) Feature name : disable output of feature names [enabled].
+ (T) Total : enable output of time spent in both the function and its descendants [disabled].
+ (S) Self : enable output of time spent in a function itself [disabled].
+ (D) Descendants : enable output of time spent in descendants of a function [disabled].
+ (P) Percentage : enable output of percentage of time spent in a feature [disabled].
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (U) Parent menu : go back to parent menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+Each one of these commands switches on or off the corresponding column output. The default is set on for the first two, off for the others. To enable or disable a column, type the name with a toggle effect.
+
+==Query submenu==
+The (U) Query submenu enables you to define a set of queries. The result will be a Total Query; by default it is the boolean and all the queries you have entered individually, but you may deactivate some of these and choose other boolean operators.
+
+ (A) Add : add a sub query.
+ (I) Inactivate : inactivate sub query.
+ (R) Reactivate : reactivate sub query.
+ (C) Operator : change the boolean operator.
+ (S) Show : show the list of queries.
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (U) Parent menu : go back to parent menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+To get useful information, you should add the appropriate queries through (A) Add. Each individual query has the following form: ''attribute operator value'', where ''attribute'' is one of:
+* feature name
+* calls
+* total
+* self
+* descendants
+* percentage
+''operator'' is one of:
+* <
+* >
+* <=
+* >=
+* =
+* /=
+* in
+Command => a
+--> Subquery: featurename = put*
+
+Command => a
+--> Subquery: calls = 3
+ -- Here we change our mind and deactivate the second query
+ -- to replace it by calls = 3:
+
+Command => s
+[1] featurename = put* is active
+[2] calls = 3 is active
+
+The total active query:
+featurename = put* and
+calls >
+
+Command => i
+--> Subquery index: 2
+
+Command => a
+--> Subquery: calls > 5
+
+Command => s
+All subqueries:
+[1] featurename = put* is active
+[2] calls = 3 is inactive
+[3] calls > 5 is active
+
+The total active query:
+featurename = put* and
+calls > 5
+
+To change the boolean operator to 'or' rather than 'and', use the (C) Operator command. It will prompt you for the index of the operator and the new value:
+
+Command => c
+--> Operator index followed by operator ('and' or 'or'): 1 or
+
+Command => s
+All subqueries:
+[1] featurename = put* is active
+[2] calls = 3 is inactive
+[3] calls > 5 is active
+
+The total active query:
+featurename = put* or
+calls > 5
+
+==Input command==
+The (I) Input command serves to load Execution Profiles. It is initially set to *.pfi meaning that it will load all files with extension pfi. By calling the command repeatedly with new arguments, you are able to load more Execution Profiles. If you use the command without any argument, and the set of input files contained just one file, then the queries will use the last generated output. This avoids explicitly loading a file.
+==Language command==
+The (L) Language command enables you to specify the languages to which profiling should be applied. You can specify Eiffel only, C only, or both. If you specify only one language, the query results will not contain any information about routines written in the other language.
+The default is Eiffel only. To switch to both Eiffel and C, use
+
+Command => L eiffel and c
+
+To return to just Eiffel, simply type L .
+
+==Run Command==
+To run the current total query, use (R) Run.
+==Generate command==
+To run the profile converter under the command-line interface, use the (G) Generate command. This will generate an Execution Profile, stored in a file with the extension .pfi.
+When running the Generate command with no arguments, you will be prompted for the following information:
+* Name of file to be converted (default: profinfo).
+* Compilation mode: workbench or finalized (default: workbench).
+* Name of profiler tool (default: eiffel).
+
+You can also type in the arguments directly without waiting to be prompted, as in
+
+Command => g profinfo finalize eiffel
+
+
+{{seealso|
+ (A) Config : show the config file.
+ (L) Classes : show the classes in alphabetic order.
+ (S) Cluster hierarchy: display the cluster hierarchy of the system.
+ (C) Clusters : show the system's classes, cluster by cluster.
+ (V) Edit : edit the config file.
+ (I) Indexing : show indexing clauses of classes.
+ (O) Modifications: show classes modified since last compilation.
+ (T) Statistics : show system statistics.
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+The A (Config) command shows the configuration file; the E (Edit) command enables you to edit the configuration file; the C (Clusters) command is useful to display the entire list of classes, cluster by cluster.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/testing-menu.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/testing-menu.wiki
new file mode 100644
index 00000000..6a27a1a4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/command-line-interactive-mode/testing-menu.wiki
@@ -0,0 +1,21 @@
+[[Property:title|Testing menu]]
+[[Property:weight|5]]
+[[Property:uuid|a6a0cf9d-ac10-4473-80e1-470acd461610]]
+The AutoTest Menu gives information about the autotest entries:
+
+
+ (L) List view : Display tests in a list.
+ (T) Tree view : Display tests in a tree structure.
+ (E) Execute : run tests.
+ (A) AutoTest : AutoTest.
+
+ (H) Help : show list of commands.
+ (M) Main : go back to main menu.
+ (Q) Quit : terminate session.
+ (Y) Yank : yank (save) output of last command to a file.
+
+
+The L and T displays the test cases in list or tree.
+
+The E execute the existing test cases.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/eiffelstudio-using-command-line-options.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/eiffelstudio-using-command-line-options.wiki
new file mode 100644
index 00000000..6acdc484
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/eiffelstudio-using-command-line-options.wiki
@@ -0,0 +1,402 @@
+[[Property:title|EiffelStudio: Using command line options]]
+[[Property:link_title|Using command line options]]
+[[Property:weight|1]]
+[[Property:uuid|a6b6a676-8660-ce2d-6f37-03de7f23a78e]]
+==Compiling and viewing==
+
+The Eiffel Compiler line mode command '''ec''' has many options, as you can see from the tables below. It may be helpful to think of any one '''ec''' command as either a command to compile or a command to view software text.
+
+
+==Getting help==
+
+You can get details of the usage and options of the '''ec''' command by executing the command with the '''-help''' option.
+
+
+ ec -help
+
+
+The usage and options display gives you information about which options are valid in a particular command context. Use this display along with the table below to choose the options that meet your needs.
+
+Usage and options of the command line compiler vary from version to version in order to accommodate new and changed features. Here is an example of the command line help from the latest version of EiffelStudio:
+
+
+ISE EiffelStudio version 14.05.9.5158 GPL Edition - win64
+
+Usage:
+ ec [-help | [-compat | -experiment] | -version | -full
+ -batch | -clean | -verbose | -use_settings |
+ -freeze | -finalize [-keep] | -precompile [-finalize [-keep]] | -c_compile |
+ -loop | -debug | -quick_melt | -melt | -clients [-filter filtername] class |
+ -suppliers [-filter filtername] class |
+ -flatshort [-filter filtername] [-all | -all_and_parents | class] |
+ -flat [-filter filtername] [-all | -all_and_parents | class] |
+ -short [-filter filtername] [-all | -all_and_parents | class] |
+ -pretty input_filename [output_filename] |
+ -filter filtername [-all | class] |
+ -descendants [-filter filtername] class |
+ -ancestors [-filter filtername] class |
+ -aversions [-filter filtername] class feature |
+ -dversions [-filter filtername] class feature |
+ -implementers [-filter filtername] class feature |
+ -callers [-filter filtername] [-show_all] [-assigners | -creators] class feature |
+ -callees [-filter filtername] [-show_all] [-assignees | -creators] class feature |
+ [[-config config.ecf] [-target target] |
+ -ace Ace (obsolete) | -project Project_file_name (obsolete)] |
+ [class_file.e [-library library_name]] |
+ -stop | -no_library |
+ -project_path Project_directory_path | -file File |
+ -code-analysis [-cadefaults | -caloadprefs pref_file | -caclasses class ...] |
+ -gc_stats]
+
+Options:
+ default (no option): quick melt the system.
+
+ -ace: specify the Ace file (obsolete).
+ -ancestors: show the ancestors of a class.
+ -aversions: show the ancestor versions of a feature.
+ -batch: launch the compilation without user request.
+ -c_compile: launch C compilation if needed.
+ -callees: show the callees of a feature.
+ -callers: show the callers of a feature.
+ -class_file.e: specify a class file for single file compilation.
+ -clean: delete existing project if any and perform a fresh compilation.
+ -clients: show the clients of a class.
+ -compat: enable pre-attached type compatibility.
+ -config: specify the configuration (ECF) file.
+ -debug: debug the system as a command loop.
+ -descendants: show the descendants of a class.
+ -dversions: show the descendant versions of a feature.
+ -experiment: enable experimental functionalities.
+ -file: save the output to a file.
+ -filter: show a filtered form (troff, ...) of the class text.
+ -finalize: finalize the system (discard assertions by default).
+ -flat: show the flat form of a class.
+ -flatshort: show the flat-short form of a class.
+ -freeze: freeze the system.
+ -full: with full class checking regardless of ECF settings.
+ -gc_stats: Show GC statistics.
+ -gui: start the graphical environment.
+ -help: show this help message.
+ -implementers: show the classes implementing a feature.
+ -library: specify a library for single file compilation.
+ -loop: run ec as a command loop.
+ -melt: melt the system.
+ -no_library: do not convert clusters into libraries.
+ -overwrite_old_project: overwrite any existing old project.
+ -precompile: precompile the system.
+ -pretty: show the pretty form of a class.
+ -project: specify the project file to load (obsolete).
+ -project_path: specify the compilation directory.
+ -quick_melt: quick melt the system.
+ -short: show the short form of a class.
+ -stop: stop on error.
+ -suppliers: show the suppliers of a class.
+ -target: specify the target.
+ -use_settings: use settings for project location.
+ -version: show compiler version number.
+
+
+
+==Commands for compiling==
+
+The simplest compiling command you can enter is:
+
+
+ ec
+
+
+The command does not include any of the ''Compiling options'' shown below, so the default option "-melt" is used. The "-config" is omitted, so '''ec''' will try to find a configuration file named Ace.ecf in the current directory.
+
+The command:
+
+
+ ec -config my_config_file.ecf
+
+
+melts the system having the configuration file in the current directory my_config_file.ecf .
+
+To freeze or finalize that system, you would just include the appropriate ''Compiling option'':
+
+
+ ec -freeze -config my_config_file.ecf
+
+
+You can specify the name of a file which contains the root class of a system in the current directory:
+
+
+ ec application.e
+
+
+This command will compile a system with the class in application.e as its root. If there is no configuration file named application.ecf in the current directory, then '''ec''' will create one. It will also use any classes in the current working directory and by default the library EiffelBase.
+
+
+{{tip|This "configuration-less" form of compilation is convenient to use for a quick compile. But you should understand that because it does create a configuration file with default names for the configuration file itself, the project, and the root cluster, using it against a root class file in a folder in which a configuration file with another name already exists could lead to confusion. }}
+
+
+You can add additional libraries to the configuration by using the "-library" option and specifying either the short name of one of the EiffelStudio libraries or a path to a library configuration file. To include EiffelTime in the compilation of application.e, you could use this command:
+
+
+ ec application.e -library time
+
+
+This immediately adds the EiffelTime library to the configuration file application.ecf, so if you compile again, it is not necessary to respecify the library.
+
+
+==Commands for viewing==
+
+By selecting certain options on the '''ec''' command, you can generate advanced views of your software much like those provided by EiffelStudio. In the table below you will see the set of ''Viewing options''. These options take arguments that are either a class name or a class name and feature name. The following examples will give you an idea of how to use the ''Viewing options''.
+
+To see the "flat" form of class APPLICATION in the example used above:
+
+
+ ec -flat application -config application.ecf
+
+
+To save the output, add the "-file" option with a file name:
+
+
+ ec -flat application -config application.ecf -file application_flat_form.txt
+
+
+Feature-oriented options, like "-implementers", take a class name and feature name:
+
+
+ ec -implementers application some_feature -config application.ecf
+
+
+
+===Commands for generating documentation===
+
+You can use variations of the viewing commands to generate documentation for your Eiffel system much like [[Producing and Exporting Documentation|you can from EiffelStudio]].
+
+The following command will produce the ''Chart'', ''Relations'', and ''Text'' documentation for the "application" system in html-stylesheet format in the "Documentation" subfolder of the project folder.
+
+
+ ec -filter html-stylesheet -all -config application.ecf
+
+
+To produce documentation for a view other than ''Text'', use its option in the command. The following generates ''Chart'', ''Relations'', and ''Flat Short'' documentation:
+
+
+ ec -flatshort -filter html-stylesheet -all -config application.ecf
+
+
+==Commands for Eiffel Inspector==
+To start the Eiffel Inspector you need to pass the '''-code-analysis''' command line options. If no other options are given, it will analyze the whole system. To specify some preferences, enable specific rules or analyze part of a system, you will need to provide some more options described below:
+
+
+ ec -config project.ecf -code-analysis [-cadefaults | -caloadprefs pref_file | -caclasses "CLASS1 CLASS2" |
+ -caforcerules "RULE1 (First preference=1, Second preference=2) RULE2"]
+
+
+; -cadefaults : If provided, all preferences regarding the analysis will be reset to their default values (before the analysis is run). For example this leads to enabling all rules that are enabled by default, no matter whether they have been disabled before.
+
+; -caloadprefs : Use preferences from ''pref_file'', an XML file containing the code analysis preferences. ''pref_file'' can be generated by exporting the current preferences in the GUI.
+
+; -caclass : Followed by a list of class names (without file extension ''.e'') of the classes that shall be analyzed. If omitted then the whole system will be analyzed. If more than one class is to be specified, the list must be wrapped in double quotes. The class names can optionally be separated by semicolons ("CLASS1; CLASS2").
+
+; -caforcerules: Followed by a list of rules, enables those rules for the analysis and disables all the others, overriding the current preferences. Specific rule preferences can also be provided in parentheses. Preferences must be separated by commas. The class names can optionally be separated by semicolons. The following example summarizes the syntax of this option:
+
+
+ -caforcerules "RULE1; RULE2 (Maximum length threshold=20, Enable something=False); RULE3"
+
+
+==Command options==
+
+The table below lists the available ''options'', the arguments they require, and their effect:
+
+
+{| border="1"
+|-
+| width="175pt" | '''OPTION'''
+| '''ARGUMENTS'''
+| '''EFFECT'''
+|-
+| ''Compiling options''
+|-
+| -melt
+|
+| [[Melting Ice Technology#Melting|Melt]] compilation. This is the default option, if no other compiling or viewing option is specified.
+|-
+| -freeze
+|
+| [[Melting Ice Technology#Freezing|Freeze]] system.
+|-
+| -finalize
+|
+| [[Melting Ice Technology#Finalizing|Finalize]] system. See note below.
+|-
+| -precompile
+|
+| [[Melting Ice Technology#Precompiling|Precompile]] system, treating it as a library.
+|-
+| -full
+|
+| Full class checking. Rechecks features of the parent classes for validity in heirs. See example in [[Converting existing software to void-safety#Enable full class checking|Converting existing software to void-safety]]. NOTE: Full class checking increases compile times, which may be noticeable in large systems.
+|-
+| -compat
+|
+| Compile using facilities that are [[Eiffel compatibility options#EiffelStudio and Eiffel compiler options|compatible with older versions]] of Eiffel.
+|-
+| -experiment
+|
+| Compile using facilities that are [[Eiffel compatibility options#EiffelStudio and Eiffel compiler options|compatible with an upcoming version]] of Eiffel.
+|-
+| ''Viewing options''
+|-
+| -ancestors
+| class_name
+| Print the ancestors of the class.
+|-
+| -aversions
+| class_name, feature_name
+| Print the ancestor versions of the feature.
+|-
+| -callers
+| class_name, feature_name
+| Print all the routines that call the feature.
+|-
+| -clients
+| class_name
+| Print the clients of the class
+|-
+| -descendants
+| class_name
+| Print the descendants of the class.
+|-
+| -dversions
+| class_name, feature_name
+| Print all the versions of the feature in the descendant versions of the class.
+|-
+| -flat
+| class_name
+| Print the flat view of the class.
+|-
+| -flatshort
+| class_name
+| Print the Flat Contract view (previously called flat-short form) of the class.
+|-
+| -implementers
+| class_name, feature_name
+| Print all the classes that declare or redeclare the feature.
+|-
+| -short
+| class_name
+| Print the Contract view (previously called short form) of the class.
+|-
+| -suppliers
+| class_name
+| Print all the suppliers of the class.
+|-
+| ''Other options''
+|-
+| -batch
+|
+| Launch the compilation without user request.
+|-
+| -clean
+|
+| Delete project if already compiled and compile project as if it was the first time.
+|-
+| -config
+| file_name
+| Use the file as configuration.
+|-
+| -c_compile
+|
+| Launch C compilation, if needed, after Eiffel compilation.
+|-
+| -file
+| file_name
+| Save the output to the file.
+|-
+| -filter
+| filter_file_name
+| Print text as processed by the [[Appendix: Writing Documentation Filters with EFF, the Eiffel Filter Format|filter]] defined in the file named "''filter_file_name''.fil"
+|-
+| -help
+|
+| Print the help.
+|-
+| -keep
+|
+| Keep assertions in final mode. Useful with -finalize only.
+|-
+| -library
+| library_name
+| Library is included in the configuration when a file name for the root class is given.
+|-
+| -loop
+|
+| Enter interactive mode. See: [[Command line interactive mode]].
+|-
+| -metadata_cache_path
+| directory_name
+| Specify location of Metadata Cache used for .NET compilation. This overrides any settings from your configuration file.
+|-
+| -no_library
+|
+| When converting an old configuration file format, do not convert clusters into libraries.
+|-
+| -project_path
+| directory_name
+| Use this directory as compilation directory. (Default: current directory.)
+|-
+| -stop
+|
+| Stop on errors. (Default: no.)
+|-
+| -target
+| target_name
+| Act on the system target named ''target_name''.
+|-
+| -use_settings
+|
+| Use the project global settings to retrieve the project location for the last compilation of this project.
+|-
+| -verbose
+|
+| Display detail progress report during compile.
+|-
+| -version
+|
+| Print compiler version number.
+|}
+
+
+{{note|In the third column, to '''print''' means to produce the requested information on the default output of the '''ec''' command.}}
+
+
+{{note|When using '''-finalize''', assertions will be discarded (unlike in EiffelStudio which asks first). The assertion disposition specified in the project configuration file can be retained in finalization by combining the '''-keep''' option with '''-finalize'''.}}
+
+
+Some options can have modifiers that can affect their results. The modifiers are listed in the table below:
+{| border="1"
+|-
+|
+finish_freezing [-location ] [-generate_only] [-nproc ] [-low]
+[-x86] [-library] [-version] [-nologo]
+
+
+Options:
+:Options should be prefixed with: '-' or '/'
+
+{| border="1"
+|-
+! style="text-align: center" | Option
+! style="text-align: center" | Arguments
+! style="text-align: center" | Effect
+|-
+|-
+| -location
+| ''directory''
+| Alternative location to compile C code in.
+|-
+| -generate_only
+|
+| Informs tool to generate only a Makefile.
+|-
+| -nproc
+| ''n''
+| Maximum number of processors to use.
+|-
+| -low
+|
+| Executes finish freezing in low-execution priority mode.
+|-
+| -x86
+|
+| Generate 32bit lib DLLs for .NET projects.
+|-
+| -library
+|
+| Compiles the C code of an Eiffel library.
+|-
+| -?
+|
+| Display usage information.
+|-
+| -version
+|
+| Displays version information.
+|-
+| -nologo
+|
+| Supresses copyright information.
+|}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/index.wiki
new file mode 100644
index 00000000..7c800c69
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/command-line/index.wiki
@@ -0,0 +1,11 @@
+[[Property:title|Command line]]
+[[Property:weight|-13]]
+[[Property:uuid|e1a93995-38bf-14fa-421e-e6fe1f07b9f6]]
+==Using the command line compiler==
+
+It is possible to compile from outside of the graphical environment, by using the command '''ec'''. The form of compilation's results are the same in both cases. You may therefore alternate between the two techniques. '''ec''' will enable you to [[EiffelStudio: Using command line options|melt or freeze]] a project and therefore to use [[Batch compilation|batch compilation]] . It will also enable you to produce [[EiffelStudio: Using command line options|information about a class]] such as its Flat and Flat Contract views.
+
+The [[EiffelStudio: Using command line options|-loop option]] makes it possible to start '''ec''' just once and then repeatedly request any of the available operations.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-between-ISE-Eiffel-15.01-and-ISE-Eiffel-15.08.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-between-ISE-Eiffel-15.01-and-ISE-Eiffel-15.08.wiki
new file mode 100644
index 00000000..a44f23f3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-between-ISE-Eiffel-15.01-and-ISE-Eiffel-15.08.wiki
@@ -0,0 +1,40 @@
+[[Property:uuid|C86C3894-2FBC-443E-8E19-FD4A442642CA]]
+[[Property:weight|6]]
+[[Property:title|Major changes between ISE Eiffel 15.01 and ISE Eiffel 15.08]]
+[[Property:link_title|15.08]]
+==What's new==
+* Supported a new inline separate instruction that allows making feature calls on uncontrolled separate targets inline rather than calling dedicated routines:
+
+ separate
+ some_expression_of_separate_type as x,
+ other_expression_of_separate_type as y
+ do
+ x.foo
+ y.bar
+ end
+
+* Supported creation of passive regions in SCOOP that execute all logged calls on caller's processors:
+
+ create foo.make -- Creation instruction.
+ bar := create {separate BAZ}.make -- Creation expression.
+
+A side effect is that all calls on passive regions are synchronous.
+
+==Improvements==
+* runtime: Improved memory management by performing O(log N) lookups when looking for a large block of memory instead of O(N). This would occur after allocating many large objects whose size is greater than 512 bytes (on 32-bit platform) and 1024 bytes on 64-bit platform and then freeing all those objects. Next time you look for a large object it might have to go through all those large objects without finding one that is large enough.
+* code generation: Made code slightly more compact (2 to 6% size reduction on some platform).
+* Optimized `expr and False` and `expr and then False` to just False if `expr` is a local, a argument, Result, Current, an attribute access or if it is the `and` boolean op.
+
+==Changes==
+
+==Bug fixes==
+
+===Compiler issues===
+* Fixed eweasel test#final122 and bug#19028 where we would incorrectly optimize `expr and False` or `expr and then False` into just `expr` which is wrong if `expr` is True (as the whole expression would be True and not False).
+
+===SCOOP issues===
+* The SCOOP runtime is now fully written in C to avoid portability issues.
+* Corrected access to tuple fields in SCOOP mode that now follow the validity rules and the semantics of ordinary attributes of a class.
+* test#scoop034 - Fixed a code generation bug in finalized mode for a generic derivation with an actual generic of a basic type.
+* test#term216 - Fixed a crash when processing conversion queries defined as constant attributes.
+* Changed agent creation rules for separate targets. This change makes it possible to introduce library features that help users to avoid writing small little wrapper features in SCOOP to control an object. It is now possible to create agents on separate, uncontrolled target. The newly created agent object is placed on the same processor as the target, and it inherits the 'is_controlled' status.
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-between-ISE-Eiffel-15.08-and-ISE-Eiffel-15.12.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-between-ISE-Eiffel-15.08-and-ISE-Eiffel-15.12.wiki
new file mode 100644
index 00000000..021e315d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-between-ISE-Eiffel-15.08-and-ISE-Eiffel-15.12.wiki
@@ -0,0 +1,27 @@
+[[Property:uuid|A4F3EBA0-0E2B-4CF4-86A9-4757F7401A63]]
+[[Property:weight|5]]
+[[Property:title|Major changes between ISE Eiffel 15.08 and ISE Eiffel 15.12]]
+[[Property:link_title|15.12]]
+==What's new==
+* Agents have a new type declaration. Instead of
+ foo: X
+ local
+ r: detachable X
+ do
+ r := something
+ if not attached r then
+ r := something_else_attached
+ end
+ Result := r
+ end
+
+ foo: X
+ do
+ if attached something as r then
+ Result := r
+ else
+ Result := something_else_attached
+ end
+ end
+
+
+into
+
+ foo: X
+ do
+ Result := something
+ if not attached Result then
+ Result := something_else_attached
+ end
+ end
+
+
+The change does not allow previously void-unsafe code to be treated as void-safe, but may affect errors reported by the compiler, in particular:
+# VEVI errors may be now reported as VUTA(2) when a local of an attached type is used as a target of call before it is attached.
+# VEVI errors may be now reported as VJAR (or the counterpart for argument passing) when a local of an attached type is used as a source expression before it is attached.
+
+
+==Improvements==
+* Improve reporting for errors in regular expressions used in include and exclude file rules in ECF by adding position information and providing error description all the time.
+
+* Improve performance of code using across iterator. {{Inline-Warning|Breaking change:}} custom descendants of READABLE_INDEXABLE may need to be updated in one of the following ways:
+*# By removing index_set, if no backward compatibility with earlier versions of EiffelStudio is required
+*# By adding an explicit redeclaration clause for index_set, if backward compatibility with [[Release notes for EiffelStudio 15.12|EiffelStudio 15.12]] is required:
+
+ inherit
+ READABLE_INDEXABLE
+ redefine
+ index_set
+ end
+
+*:The specific changes in the compiler and cursor classes include:
+** Optimized code generation for iteration instruction calls to after and forth by rechecking the code with the actual type of a cursor variable.
+** Added lower and upper to READABLE_INDEXABLE to be used instead of index_set by iteration cursor.
+** Marked {READABLE_INDEXABLE}.index_set as obsolete in favor of lower and upper to avoid object creation, especially when implementing external cursors for iterative forms of a loop.
+** Provided implementation of index_set in READABLE_INDEXABLE so that it can be removed in descendants.
+** Made lower_defined and upper_defined in INTEGER_INTERVAL always True because this was the case for all created objects and clients almost never checked if boundaries were defined.
+** Provided specialized versions of iteration cursors for SPECIAL, ARRAY, ARRAYED_LIST, READABLE_STRING_8, READABLE_STRING_32 to improve performance of across loops for these containers.
+
+
+==Changes==
+* Change code analysis command-line arguments to report errors immediately instead of trying to run code analysis and improve error reporting by providing more details (such as option name, rule name, kind of syntax error).
+* Add support of position-independent code analysis options (still retaining old code analysis options) that act like regular EiffelStudio command-line options:
+** -ca_default
+** -ca_setting ''preference_file_name''
+** -ca_class
+ failure
+ local
+ i: INTEGER
+ do
+ -- Comment out next line to fix the bug.
+ bar (Void).make_from_array (Void)
+ across
+ <<1, 2, 3>> as c_i
+ loop
+ i := c_i.item -- Error here.
+ end
+ end
+
+
+* Fix .NET code generation to generate verifiable code when converting a manifest integer constant compatible with a NATURAL_64 (see eweasel test#dotnet118)
+* Fix invalid .NET code generation when you inherit from a .NET class where one of the following routines is frozen: Equals, Finalize, ToString and/or GetHashCode (see eweasel test#dotnet119)
+* Fix invalid inlining of routine involving an object test local, an iteration cursor or a separate instruction local (see bug#18028, test#final114, test#final123, test#bench019).
+* Fix test#scoop077 by applying SCOOP semantics rules and checking SCOOP validity rules for iteration cursors.
+* Fix an issue when extracting a type ID from a string involving the separate keyword.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-with-ISE-Eiffel-18.07.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-with-ISE-Eiffel-18.07.wiki
new file mode 100644
index 00000000..818479ae
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/Major-changes-with-ISE-Eiffel-18.07.wiki
@@ -0,0 +1,6 @@
+[[Property:modification_date|Wed, 04 Jul 2018 09:15:02 GMT]]
+[[Property:publication_date|Wed, 04 Jul 2018 09:13:19 GMT]]
+[[Property:uuid|C7E5CC3E-D942-4970-A6C3-CCF560F84E1F]]
+[[Property:weight|-1]]
+[[Property:title|Major changes with ISE Eiffel 18.01 and 18.07]]
+[[Property:link_title|18.07]]
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/index.wiki
new file mode 100644
index 00000000..a6402f47
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|EiffelStudio 5 compiler history]]
+[[Property:link_title|5.x]]
+[[Property:weight|15]]
+[[Property:uuid|6fc4449c-889f-521d-4f80-69245fbd5f54]]
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/assertions-checking-configuration-changes.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/assertions-checking-configuration-changes.wiki
new file mode 100644
index 00000000..f017905f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/assertions-checking-configuration-changes.wiki
@@ -0,0 +1,24 @@
+[[Property:title|Assertions checking configuration changes]]
+[[Property:weight|0]]
+[[Property:uuid|45e5cc54-cc3d-9f21-b73f-462430ae845e]]
+One of the major differences between 4.5 and 5.0 is how to specify the assertion checking in the ace file or in the project settings window. In 4.5, assertions of a certain type where checked if their level was below the requested level. Here is what the level hierarchy looked like:
+# require
+# ensure
+# loop
+# check
+# invariant
+# all
+
+Meaning that you could not just check one type of assertions. With 5.0 this is now possible and we changed the presentation to follow the cost to evaluate a given type of assertions, the first one being the less expensive:
+# check
+# require
+# ensure
+# loop
+# invariant
+# all
+
+The default assertion level has changed too. Not specifying any assertion level used to be equivalent to selecting the 'require' level. This is not the case any more in 5.0 it will be not checking assertions.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/compiler-differences-45-50.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/compiler-differences-45-50.wiki
new file mode 100644
index 00000000..69313839
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/compiler-differences-45-50.wiki
@@ -0,0 +1,32 @@
+[[Property:title|Compiler differences from 4.5 to 5.0]]
+[[Property:weight|1]]
+[[Property:uuid|0937ae2f-0959-ca89-e851-2c8ccbf4f3aa]]
+==What's new==
+* Implementation of new external syntax.
+* Implementation of verbatim strings.
+* Implementation of agents.
+* Implementation of agent creations on `Result` and `Current` object.
+* Improved incrementality of the C compilation: fewer directories will have their C files changed after a freeze.
+* New MSIL generation.
+* Introduction of 4 new basic classes: INTEGER_8, INTEGER_16, INTEGER_64, WIDE_CHARACTER.
+* Changed the storable mechanism so that we do not store POINTER objects with their value, instead we store a NULL value. As a consequence it is safe to store on disk objects that have references to C objects. Upon retrieval those references will be equal to `default_pointer`. This is now the default behavior, if someone wants to have the previous behavior, simply call `set_keep_pointer_value` from STORABLE.
+
+==Improvements==
+* New run-time speed improvement (between 30 to 100% faster than the 4.5 release).
+* Compiler that is much faster (between 200 and 300% faster than 4.5).
+* Compiler now detects unused local variables (at freeze/finalize time only)
+
+==Bug fixes==
+* Compiler now fixes incrementality issues with frozen/melted code.
+* Degree 4/Degree 3 crash on *_SERVER when doing an incremental recompilation has been fixed.
+* Fixed crash when using creation expression that includes a feature call.
+* Fixed creation of an ARRAY of BIT type.
+* CHARACTER has been extended to support the extended ASCII which means that the following expressions are now True instead of being False as it was in our previous version:
+** '%/127/' < '%/128/'
+** '%/127/' < '%/128/'
+** When using `independent_store`, in case of retrieval error due to a name change in one of the class attributes we will display the original attribute name that was used to make the storable file. This will help when managing many storable files.
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/eiffelthread-differences-45-50.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/eiffelthread-differences-45-50.wiki
new file mode 100644
index 00000000..3eb8ac5e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/eiffelthread-differences-45-50.wiki
@@ -0,0 +1,17 @@
+[[Property:title|EiffelThread differences from 4.5 to 5.0]]
+[[Property:weight|0]]
+[[Property:uuid|f95360f9-3b02-5f1b-9667-68846d0e0a7d]]
+Users of EiffelThread in 4.5 will notice a few changes that we made to make their life easier.
+
+==Object sharing==
+
+Indeed one aspect of EiffelThread in 4.5 that was not easy to implement was object sharing between threads. Most of the difficulty came from our special implementation of the Eiffel Software GC (Garbage Collector) where each thread had its own GC.
+A consequence was that an object in thread A referencing an object in thread B needed to let the GC of B that it had a reference to an object that belongs to him. This was done by using the PROXY class and instead of referencing the object directly you were referencing the PROXY object. Another limitation of this approach was that the referred object could not hold reference to other objects, it could only hold values of basic expanded types (also previously called flat objects)
+Now, there is a global GC and therefore you do not need to use the PROXY class anymore and you can reference any kind of objects. The PROXY class is still available for backward compatibility, but it is now obsolete and its implementation has been reduced to a bare minimum.
+The class OBJECT_CONTROL has been removed altogether and the class OBJECT_OWNER is now obsolete as well.
+
+==Global onces==
+
+In 4.5, you would have to use a special tricky way to create once per process feature by using an existing once per thread feature and an external C feature that we were providing to achieve a once per process behavior.
+In 5.0, this has been simplified and you can now specify at the level of the source code if it will be a once per process or once per thread. Click [[Once features in multithreaded mode|here]] for more details on how this is done.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/index.wiki
new file mode 100644
index 00000000..5a03291e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-45-and-ise-eiffel-50/index.wiki
@@ -0,0 +1,11 @@
+[[Property:title|Major changes between ISE Eiffel 4.5 and ISE Eiffel 5.0]]
+[[Property:link_title|5.0]]
+[[Property:weight|-7]]
+[[Property:uuid|82179716-24e3-0aa1-7562-bf0a87c05749]]
+* [[Assertions checking configuration changes|Assertions checking]]
+* [[EiffelThread differences from 4.5 to 5.0|EiffelThread]]
+* [[Compiler differences from 4.5 to 5.0|Miscellaneous]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-50-and-ise-eiffel-51.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-50-and-ise-eiffel-51.wiki
new file mode 100644
index 00000000..75797435
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-50-and-ise-eiffel-51.wiki
@@ -0,0 +1,62 @@
+[[Property:title|Major changes between ISE Eiffel 5.0 and ISE Eiffel 5.1]]
+[[Property:link_title|5.1]]
+[[Property:weight|-8]]
+[[Property:uuid|bdb0c46b-2774-f348-f8e8-9932cda47722]]
+==What's new==
+
+
+* .NET generation now includes:
+** Support for multiple inheritance.
+** Support for generics.
+** Partial implementation of generic conformance (same as what was supported up to and including ISE Eiffel 4.2).
+** Support for tuples and agents.
+** Support for any existing Eiffel code that does not use C externals.
+** Partial support for compiling Eiffel libraries using C externals (e.g. WEL)
+
+And the following limitations:
+** Eiffel classes cannot inherit from non-Eiffel .NET classes (but they can be clients).
+** The compiler performances are rather poor now (both in terms of memory usage and speed)
+
+Those limitations should disappear with 5.2 which will be the official release that fully supports .NET
+** Support for INTEGER_64 constants. Now a manifest integer value that is written in decimal or hexadecimal format that can't fit into an INTEGER_32 will be automatically promoted to an INTEGER_64 constant value.
+** New feature access syntax for accessing constants, C/C++ externals and IL static externals. [[Differences between ETL 2nd printing and Eiffel Software implementation|Check out more here]] .
+
+
+==Improvements==
+* Compiler that is about 20% faster than 5.0.
+
+==Bug fixes==
+* Fixed VAPE errors that were not previously reported. Now VAPE errors are checked against arguments of a feature used in a precondition and are also checked for a qualified call.
+* Fixed a conformance bug that made a manifest array not conform to ANY.
+* Fixed a generic conformance bug where an assignment attempt would change the behavior of the execution.
+* Fixed a wrongly reported error by the compiler in the following case:
+In a system that has a generic class CLIENT with constraint `G -> SUPPLIER create make end', where the creation procedure of SUPPLIER is exported to {CLIENT}. If another class has an attribute `x: CLIENT [SUPPLIER]' the compiler reports a VTCG error, though it should accept the classes.
+
+* Fixed a crash when one of the following command lines was used in a directory with no existing project that contains no default configuration file:
+ec -flat -all
+ec -short -all
+ec -flatshort -all
+ec -flat -all_and_parents
+ec -short -all_and_parents
+ec -flatshort -all_and_parents
+
+* Fixed a bug in output display between standard output and error output. Doing the following:
+io.put_string ("foo%N")
+io.error.put_string ("bar%N")
+
+you get the following output when simply launched from the command line:
+foo
+bar
+
+however if you do:
+my_program >& RESULT
+
+to redirect both standard and error outputs to RESULT you get in the RESULT file this incorrect content:
+bar
+foo
+
+* Fixed a non reported VTEC or VTCG error when an invalid type used as actual generic parameters in an explicit type in a creation instruction.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-51-and-ise-eiffel-52.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-51-and-ise-eiffel-52.wiki
new file mode 100644
index 00000000..bf2fda3a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-51-and-ise-eiffel-52.wiki
@@ -0,0 +1,37 @@
+[[Property:title|Major changes between ISE Eiffel 5.1 and ISE Eiffel 5.2]]
+[[Property:link_title|5.2]]
+[[Property:weight|-9]]
+[[Property:uuid|f08242d4-d472-142c-7f92-f2c043bc5fa6]]
+==What's new==
+* .NET generation now includes support for the following language features:
+** Support for multiple inheritance.
+** Support for generics.
+** Partial implementation of generic conformance
+** Support for tuples and agents.
+** Support for any existing Eiffel code that does not use C externals.
+** Support for compiling Eiffel libraries using C externals that are not related to the Eiffel Software C runtime.
+
+And the following limitations:
+** Eiffel classes cannot inherit from non-Eiffel .NET classes (but they can be clients).
+** No support for `expanded` keyword.
+
+
+* .NET generation now supports assembly signing in enterprise edition.
+* .NET generation now supports precompiled libraries.
+* Supports for manifest integer constants of different sizes, i.e. you can now assign for example the value `8` to a location of type VGCC(6) error. Instead directly assign to it, or create an instance of its corresponding _REF class.
+
+==Bug fixes==
+* Fixed memory corruption issue when trying to access an VAPE errors that were not previously reported in 5.1. Now VAPE errors are checked against call to infix and prefix features.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-52-and-ise-eiffel-53.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-52-and-ise-eiffel-53.wiki
new file mode 100644
index 00000000..af821fa7
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-5-compiler-history/major-changes-between-ise-eiffel-52-and-ise-eiffel-53.wiki
@@ -0,0 +1,165 @@
+[[Property:title|Major changes between ISE Eiffel 5.2 and ISE Eiffel 5.3]]
+[[Property:link_title|5.3]]
+[[Property:weight|-10]]
+[[Property:uuid|c4a7cbf4-da42-791d-cc80-862692233ed9]]
+==What's new==
+* Finalized executable with option `exception trace' enabled will now display the instruction number (usually equivalent to the line number in the routine) being executed when a failure occurred. It was already displaying this information in workbench/melted mode, we have just extended this feature to finalize mode.
+* Incremental compilation is now available for .NET code generation. Meaning that if you modify one class, only this class is being recompiled. It dramatically improves development time when targeting .NET.
+* In .NET code generation, assertions can be turned on or off on a class per class basis without having to recompile those classes.
+* Implemented [[EiffelBase, The Kernel|recoverable storable]] to enable the retrieval of slightly different version of an object. It only applies for classic Eiffel.
+
+==Improvements==
+* Enabled support for Borland C compiler in .NET.
+* Removed too many warnings during C compilation on Tru64.
+* Improved formatting of exception traces so that class names, feature names, exception tags are not truncated. Display limit has been pushed at about 256 characters.
+
+==Changes==
+* Made `\\' follow the balancing rules for various integer types.
+* Precompiled libraries now precompiles all classes reachable from clusters defined in project settings only if root class is ANY, otherwise it will only precompile classes reachable from the root class. In 5.1 and prior version it was precompiling all classes reachable from clusters.
+
+==Bug fixes==
+
+===Language issues===
+* Fixed semantic of object creations to strictly follow definition given in "Eiffel: The Language". Namely, if you have x of type create x.make is equivalent to x := create {X}.make
+It implies some bug fixes which might break existing code. For example:
+
+x: X is
+ once
+ -- If make calls back to x then it used to return
+ -- a non-Void value for x, where it should have been Void.
+ create Result.make
+ end
+
+x: X
+
+ -- If make accesses back the x attribute then it used to return
+ -- new value of x rather than the old value.
+create x.make
+Or in melted code only the following code now works properly, i.e. create x.make (x)
+
+* Fixed undetected VDRD(3) errors: compiler was not strict enough and accepted ensure where only ensure then was valid.
+
+===Store/Retrieve issues===
+* Fixed issue in storable mechanism when retrieving expanded objects.
+* Fixed issue with independent_store where storing arrays of objects whose count was greater than 65536 will cause a memory corruption.
+* Added f (g: STRING): ANY is
+ do
+ Result := create {STRING}.make_from_string (g)
+ end
+
+* Fixed issue with False where it should have returned True .
+* Fixed code generation issue with double constants where code below was not producing the expected result of 1e+030:
+ value: DOUBLE is 1.0e15
+ print (value * value)
+
+* Fixed issue in melted code where computation such as local
+ i: INTEGER
+ do
+ i := << 1 >> @ 2
+ end
+
+* Fixed a crash in finalized mode with invariant checking enabled with following code and when checking the invariant triggers a garbage collection cycle: value: INTEGER
+ is_value_required: BOOLEAN is
+ do
+ Result := value = 1
+ end
+
+
+* Fixed crash of compiler at degree 4 while trying to compile this incorrect class:
+class CRASH
+
+inherit
+ CHAIN -- Missing generic parameter
+
+create
+ make
+
+feature -- Initialization
+
+ make is
+ do
+ end
+
+ index: INTEGER is
+ do
+ end
+
+ duplicate (n: INTEGER): like Current is
+ do
+ end
+
+end
+
+* Fixed issue with pathological memory allocation scheme that could trigger an `out of memory' exception where enough memory is still available.
+* Fixed incorrect allocation of expanded arrays where creation routine of expanded class was not called on all items of the newly created array.
+* Fixed incorrect creation type of attribute where attribute's type has some generic parameter. In some cases, instead of creating an a: ARRAY [like f]
+ f: STRING is
+ do
+ end
+Then you could neither load nor execute the generated code.
+* Fixed incorrect C file naming when generating a .NET system that uses a C++ external (it should be .cpp, not just .c).
+* Fixed incorrect .NET code generation with following assignment attempts whose source is expanded:
+ local
+ a: ANY
+ o: SYSTEM_OBJECT
+ do
+ a ?= 12
+ o ?= 12
+ end
+
+* Fixed incorrect code generation in .NET for assertions checking with following code where precondition of make is
+ do
+ test_which_fail_and_rescued
+ test
+ end
+
+ test is
+ require
+ should_be_checked: False
+ do
+ end
+
+ test_which_fail_and_rescued is
+ local
+ retried: BOOLEAN
+ do
+ if not retried then
+ failure
+ end
+ rescue
+ retried := true;
+ retry
+ end
+
+ failure is
+ require
+ should_be_checked: False
+ do
+ end
+
+* Fixed .NET verification issue where sometimes you could get the following message when checking an Eiffel assembly against peverify: [IL]: Error: Unverifiable PE Header/native stub.
+* Fixed incorrect code generation when creating and accessing a convert keyword (only on argument passing and assignments. Not supported when used with infix routines).
+
+==Improvements==
+* Improved speed of compilation by about 20-30%
+* Improved run-time memory allocation speed and footprint so that it has a 15%-20% faster allocation scheme and takes less memory than before.
+* Reduced waiting time at the end of the degree 6 when performing a compilation from scratch (reduced to about 50% or more of the time it used to take)
+* Improved speed of sleep (m: INTEGER) is
+ external
+ "C blocking"
+ end
+Not doing it could generate dead-lock during the execution of a multithreaded system.
+* Static access on externals is now only authorized when external is a frozen external without assertions.
+* Compiler will now report a warning for assignments like those: td: TUPLE [DOUBLE]
+ti: TUPLE [INTEGER]
+
+td := ti
+The warning will help you correct code using this pattern, because in the next release this will be rejected in order to conform to the Eiffel programming language specification.
+* Now we do not generate by default the .NET attribute agent agent is "rdsf"
+* Fixed bug in error reporting for incompatible agent agent Current . l_time: TIME_SPAN
+print (l_time.total_milliseconds.out)
+
+* Fixed incorrect code generation with code accessing attributes of .NET expanded types.
+* Fixed incorrect computation of equal when used with basic types, e.g. equal (1, 1) would return False instead of True.
+
+===Store/Retrieve issues===
+* Fixed memory corruption bug with recoverable storable when a mismatch was detected
+* Fixed issue where mismatch was not detected if attributes were dropped
+* Fixed issue with independent store when storing convert keyword.
+* Made Void, previously a feature of reference keyword used in generic constraints (See next point).
+* Added support for reference and expanded constraints on a formal generic parameter. In other word, one can now write:
+class A [reference G] ... end
+class B [expanded G] ... end
+to say that the valid actual generic parameters for class A
+inherit
+ APPLICATION_EXCEPTION
+ undefine
+ finalize,
+ equals,
+ to_string,
+ get_hash_code
+ end
+
+ ANY
+by the much simpler inheritance clause:
+class A
+inherit
+ APPLICATION_EXCEPTION
+
+
+** If you were using a feature of e: EIFFEL_CLASS
+o: SYSTEM_OBJECT
+...
+o := e
+o.feature_of_system_object
+
+** The following assignment attempt will succeed whereas it failed before because a: ANY
+o: SYSTEM_OBJECT
+...
+check o /= Void and a = Void end
+a ?= o
+check o /= Void and a /= Void end
+
+
+* New format of the independent storable files which takes into account internal changes made for a better generic conformance in classic mode.
+* New validity rule for expanded types: It is valid to use an expanded type of base class
+class A [G]
+feature
+ bug is
+ local
+ l_any: LIST [ANY]
+ l_g: LIST [G]
+ do
+ l_any := l_g
+ l_g := l_any
+ end
+
+The workaround is to use the reference keyword to guarantee that the formal generic parameter will always be instantiated with a reference type. For example the code below is correct:
+
+class A [reference G]
+feature
+ bug is
+ local
+ l_any: LIST [ANY]
+ l_g: LIST [G]
+ do
+ l_any := l_g
+ l_g ?= l_any
+ end
+
+
+
+===Compiler issues===
+* Enabled creation of my_special: SPECIAL [INTEGER]
+create my_special.make (10)
+
+* Fixed incrementality issues with strip and static calls on external routines which could fail after a class has been added to or removed from the system.
+
+===Runtime/code generation issues===
+* Fixed incorrect code generation which would result in a C compiler error in classic mode when assigning a Void entity to a formal generic parameter that will be instantiated as a basic type.
+* In multithreaded mode, fixed dead lock on Unix platforms when evaluating global onces.
+* In multithreaded mode, prevented dead lock when a thread is exiting.
+* In multithreaded mode, prevented memory corruption which could occur if the first thing that a thread performs when launched is to trigger a GC collection.
+* Fixed incorrect generic conformance data when manipulating expanded generic types. For example, the following code:
+class A [G, H]
+feature
+ item: H
+end
+
+class C [G]
+end
+
+class ROOT_CLASS
+create
+ make
+feature
+ make is
+ local
+ l_a: A [STRING, expanded C [ANY]]
+ do
+ create l_a
+ io.put_string (l_a.item.generating_type)
+ end
+end
+
+would print
+expanded C [STRING]
+instead of
+expanded C [ANY]
+
+* Fixed issue where you could get a bogus reference when trying to get a reference to the object associated to an ID (obtained through the s := once "abc"
+io.put_string (once "Hello World!")
+Once manifest strings are not created every time they are accessed. Instead one instance is created at the first access and then it is reused for subsequent accesses.
+
+==What's new==
+
+{{seealso|[[Differences between standard ECMA-367 and Eiffel Software implementation|Differences between standard ECMA-367 and Eiffel Software implementation]] }}
+* Implemented once manifest strings. They can be used at the same places where normal manifest strings can be used, e.g.:
+s := once "abc"
+io.put_string (once "Hello World!")
+Once manifest strings are not created every time they are accessed. Instead one instance is created at the first access and then it is reused for subsequent accesses. In multithreaded application one instance is created for one thread.
+* Supported aligned and non-aligned verbatim strings. Aligned verbatim strings use characters [ and ] in opening and closing sequence respectively, non-aligned verbatim strings use { and }.
+* Added support for manifest type expression "{1 is of type negate alias "-": like Current ...
+multiply alias "*" (other: like Current): like Current ...
+item alias "[]" (index: INTEGER): G ...
+The first two declarations can be used similar to features prefix "-" and infix "*". The last one can be used to make feature calls with bracket expressions like
+letter := letters [i]
+Operator and bracket aliases can also be used in rename subclause to change an alias name associated with a feature.
+* Supported new feature assigner syntax to associate feature with an assigner command:
+item alias "[]" (index: INTEGER): G assign put ...
+put (value: G; index: INTEGER) ...
+Given the declaration above the following instructions become equivalent:
+x.put (x.item (i + 1), i)
+x.item (i) := x.item (i + 1)
+x [i] := x [i + 1]
+
+
+==Improvements==
+* Optimized .NET code generated for inspect instruction.
+* Optimized access to process-relative once routines to avoid heavy-weight synchronization primitives when possible.
+* Speed-up access to once routines in finalized multi-threaded applications.
+* Improved some error messages to be more precise.
+* Removed the requirement to freeze code that declares process-relative once routine.
+* Improved multi-threaded application performance in classic mode by using built-in support for thread-local storage provided by some ''C'' compilers.
+* Allowed underscores in hexadecimal literals.
+* Provided syntax highlighting for hexadecimal literals in editor.
+* Slightly improved reporting of syntax errors.
+* Made keyword operator names clickable in flat view.
+
+==Changes==
+* Void does not conform to expanded types. As a consequence, assignments of Void to expanded entities will be rejected rather than throwing an exception at run-time. And comparison of expanded entities to Void will cause a VWEQ validity error.
+* Changed default behavior of once routines in .NET mode from once-per-process to once-per-thread to match behavior in classic mode.
+* Provided project options (old_verbatim_strings and old_verbatim_strings_warning) to support semantics of verbatim strings as in previous versions when they were not left-aligned.
+* Changed processing of hexadecimal integer literals to be consistent for different integer types. For example, 0xFF gives 255 when assigned to a variable of type -1 as before.
+* Due to the new {} syntax, a few older syntax constructs have been removed:
+** "{Precursor (..)" is rejected and should be replaced by "Precursor {agent agent BIT type declaration and extended VTBT rule to cover this change.
+* To evaluate the type of a manifest array we now use the first item of the manifest array instead of the last one as a first guessed type.
+* Allowed for integer literals with intermediate underscores at arbitrary positions.
+* To ensure same behavior on various platforms, the standard output is now unbuffered (it previously was unbuffered on Windows and line buffered on Unix platforms).
+
+==Bug fixes==
+
+===Language issues===
+* Used '%N' as an end of line in verbatim strings regardless of the end of line sequence in source code.
+* Fixed incorrect handling of negative hexadecimal integer literals when sign before the literal was not taken into account. For example, -0x1 could be interpreted as 1.
+* Implemented checks for input ranges of integer constants and fixed issue with inability to assign minimum integer values to variables of the corresponding integer types.
+{|
+|+ Allowed integer values
+|-
+| Type
+| Integer interval
+| Unsigned hexadecimal representation
+|-
+| -128 .. 127
+| 0x0 .. 0xFF
+|-
+| -32768 .. 32767
+| 0x0 .. 0xFFFF
+|-
+| -2147483648 .. 2147483647
+| 0x0 .. 0xFFFFFFFF
+|-
+| -9223372036854775808 .. 9223372036854775807
+| 0x0 .. 0xFFFFFFFFFFFFFFFF
+|}
+
+* Excluded nonsignificant leading zeroes from determination of allowed integer constant type, so that 00000000000000123 is now a valid like VTCT errors at the end of degree 5, rather than during degree 5, so that you can collect all the VTCT errors at once.
+* Thanks to the improvement in VTCT errors reporting, now compiler will not generate an incorrect VTCT errors during an incremental recompilation for a class which has actually been removed from the system.
+* Supported recompilation of once routines when their status is changed from "process-relative" to "thread-relative" or back.
+* Supported output of multi-line obsolete messages.
+* Fixed a recompilation bug that resulted in incorrect (or even, in case of .NET, in invalid) generated code when incrementally finalizing a system without explicitly specified root creation procedure.
+* Fixed a bug with resolving some generic-like types (i.e., types that are processed in a special way: tuple, native array, typed pointer) that depend on anchored types: before they were converted to "normal" generic types thus loosing their special properties.
+* Fixed a bug that caused compiler to crash when finalizing a code that looks like
+if true then [else(if) ...] end
+i.e. has empty compound for a primary condition which is a constant true.
+* Fixed a bug in processing configuration option precompiled that caused a compiler to crash when no option value was provided.
+* Fixed a bug in incremental recompilation when multi-branch validity rules are violated in one class because constant attribute used in the multi-branch instruction is changed in another class, that declares them, into a non-constant feature.
+* Fixed multiple bugs in feature basic text view that caused truncated or extraneous output.
+* Fixed bug where if an actual generic parameter was an anchor, then if the type containing this actual was used for assignment attempt or for creation we would use an incorrect type for the actual generic. We were using the type of the anchor in the class were the code was written, instead of actually re-evaluating the type of the anchor for each descendant class.
+
+===Runtime/code generation issues===
+* Fixed bug in -2147483648 and -1 could be processed as positive 64-bit values.
+* Fixed incorrect C and IL code generation for i := (i + i) |>> 1
+assigned -128 to i of type i was -128. Now this instruction assigns 0.
+* Synchronized access to data of process-relative once routines to avoid race conditions when two or more threads simultaneously access the same once routine.
+* Avoided permanent blocking of a thread accessing process-relative once routine when this routine is concurrently evaluated in some other thread and raises an exception.
+* Fixed bugs in memory allocation in C code for result of a once function that returns basic type:
+** it might cause memory corruption when memory size required to store the result is greater than size of a pointer;
+** there was a memory leak.
+
+* Fixed a bug in classic mode that caused last exception to be cleared after returning from a routine that has a rescue clause but returns normally.
+* Fixed several bugs related to handling of nested exceptions in classic mode.
+* Changed a limit of maximum class name length in melted byte code from 256 bytes to 32767 bytes.
+* Changed C code generation for long strings (that result from long manifest strings, identifiers, etc.) to avoid restrictions imposed by some C compilers on long string literals (in particular, by the Microsoft C compiler cl that issued error C2026).
+* Fixed a bug in finalized C code generation when calling Precursor in a routine which is recursively calling itself before the call to Precursor. Instead of generating the call to Precursor we would generate a recursive call to the routine.
+* Fixed a bug where calls to False where it should have been True.
+
+===.NET issues===
+* Corrected processing of literal floating point fields from external assemblies (such as ..MissingMethodException to be raised on startup of such an application.
+* Fixed a bug in code generation when solely inheriting from a .NET interface.
+* Fixed a bug in code generation when inheriting from a .NET class which has a routine whose name is identical to one of the routine of is keyword in the feature declaration.
+* Allowed bracket expressions to be used as a target of a qualified feature call (this is an extension to ECMA standard that does not permit this syntax at the moment).
+* Added checks for VYCP(2,3) and VYCQ(2,3) (validity rules for conversion features to prohibit conversion to conforming types).
+
+==Changes==
+* VWEQ is not an error, but a warning that can be triggered or not depending on your configuration.
+* Inherited assertions are rechecked each time that a feature is redefined, meaning that some errors that were not previously detected by the compiler can now be found.
+
+==Bug fixes==
+* Fixed an issue with x2c if you had inlined C code which contains comments with single or double quote. Then it will not properly convert .x into .c file.
+* Fixed bugs in code generation for once manifest strings that caused "index out of bounds" exception, void results.
+* Fixed a bug in processing synonyms of a routine with an indexing clause that might cause a compiler crash, in particular this could happen for synonyms of a global once routine.
+* Fixed a bug in recompilation of a once routine that changes its process-relative status into thread-relative one or back in multithreaded finalized mode that can cause C compilation to fail due to unresolved externals.
+* Corrected inlining of routines redeclared into attributes or into routines with a different internal/external status.
+* Fixed a bug in incremental recompilation of queries with assigner commands.
+* Added detection of a VUEX error for static feature calls used in intervals of a multibranch instruction.
+
+===Compiler issues===
+* Added a new validity error VTEC(3) to report unsupported inheritance hierarchy under .NET when an expanded type is based on a class with an external ancestor.
+* Not supported reverse attachment of boxed built-in .NET value types to Eiffel reference types such as a: !A -- a cannot be used before it is attached
+b: ?A -- b can be used before it is attached
+Default attachment status (for types without an attachment mark) is controlled by the option ''is_attached_by_default''.
+* Object test expression is a replacement for the reverse assignment construct with a new notion of scope:
+if {o: !A} e then do_something_with (o) end
+
+* Attached variables are subject to the new check that they are properly set before use, in particular, attached attributes must be set by a creation procedure and all attached local variables must be set before they are used. The checks are performed when the option ''is_void_safe'' is turned on.
+* A feature call can be performed only on an attached target if the option ''is_void_safe'' is turned on.
+* Certified attachment patterns (CAP) are used to identify additional cases when an entity is attached (controlled by the option ''is_void_safe''). In particular, the following code is considered void-safe:
+f (a: ?ANY)
+ do
+ if a /= void then
+ x := a.out
+ end
+ end
+
+
+==Improvements==
+* Improved speed of degree 3. Improvements are even more visible when the checking of inherited features in their descendants is enabled.
+
+==Changes==
+* No major known changes.
+
+==Bug fixes==
+* Fixed an issue where the version of Result), and can take into account execution paths as well as some obvious void-safe patterns.
+
+==Improvements==
+* Improved speed of compiler by a significant factor for large system.
+* Generated code is about 3-4% faster with a size reduction of about 2-3%.
+* Improved number of dynamic to static bindings in finalized code. Improved quality of inlined code for reducing even more of the dynamic calls.
+* Reduced the size of the AST stored in memory during a compilation by 20/25% which results in a memory usage reduction for EiffelStudio of about 15%. For example when compiling EiffelStudio on Windows 64-bit, it was taking 920MB with the previous version, and now it would be 800MB.
+* Fixed performance issue with {VUOT(2) that required that the type of an object test local is attached.
+
+==Changes==
+* Protected several calls to `eif_wean` on the same EIF_OBJECT. This will prevent a memory corruption for people using it incorrectly with a minor slow down since in a typical application there should not be too many protected objects.
+* Removed VFAV(4) validity error that is no longer specified in the standard.
+* Due to new meaning of ~, the old syntax for agents is not being supported anymore. If you still have some code using the old agent syntax, compile it with 6.1 with syntax warning enabled to fix your code before upgrading to 6.2.
+
+==Bug fixes==
+
+===Language issues===
+* Fixed various limitations with support of attached types in 6.1, including support for
+** attachment marks for tuple types and formal generics
+** object tests in class invariants
+
+
+===Compiler issues===
+* Fixed eweasel test#final046 by avoiding useless creation of temporary objects during dynamic dispatch. It can also dramatically speed up certain kinds of code; on the compiler itself, the speed up is about 8-10%. In the worst case scenario it is 400% or more. Note this bug was introduced in version 6.0. Compared to 5.7, in 6.2 the worst case scenario is still about 10% slower.
+* Fixed an incorrect code generation for `is_equal` in ANY when exception trace is off which could cause a memory corruption.
+* Fixed various issues with compiler when inlining is enabled.
+* Fixed compiler crash when compiling a class where a type used in a signature of a feature has the wrong number of generic parameters. Fixed eweasel test#incr285.
+* Fixed an incorrect code generation for the dynamic binding of routines defined in generic classes and attribute access in general. Fixed eweasel test#exec272 and test#final039.
+* Fixed eweasel test#melt081 where having a redefined routine involving an anchor to a non-existing feature would crash the compiler instead of reporting a VEEN error.
+* Various bug fixes with respect of handling of expanded generic classes used in generic classes.
+
+===Runtime/code generation issues===
+* Changed the usage of `eif_adopt`, `eif_protect`, `eif_wean`, `eif_freeze` and `eif_unfreeze` so that they can be used in concurrent thread, meaning that it is safe to use them as long as the argument is different in various threads.
+
+===Store/Retrieve issues===
+* Fixed some issues with the storing or retrieving of generic expanded types.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-6-compiler-history/major-changes-between-ise-eiffel-62-and-ise-eiffel-63.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-6-compiler-history/major-changes-between-ise-eiffel-62-and-ise-eiffel-63.wiki
new file mode 100644
index 00000000..9f87d26d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/compiler-history/eiffelstudio-6-compiler-history/major-changes-between-ise-eiffel-62-and-ise-eiffel-63.wiki
@@ -0,0 +1,62 @@
+[[Property:title|Major changes between ISE Eiffel 6.2 and ISE Eiffel 6.3]]
+[[Property:link_title|6.3]]
+[[Property:weight|-10]]
+[[Property:uuid|55a1c34d-5313-1bcc-924e-3a3a68905665]]
+==What's new==
+
+{{seealso|[[Differences between standard ECMA-367 and Eiffel Software implementation|Differences between standard ECMA-367 and Eiffel Software implementation]] }}
+
+* Implemented proper runtime conformance for attached types, that is to say A [!ANY] will conform to A [!ANY] or A [?ANY], but A [?ANY] will only conform to A [?ANY].
+* Added support for the new {u: T} expr".
+* Added free syntax for '''stable''' attributes; the final syntax is being discussed by the ECMA committee. Stable attribute is an attribute of a detachable type that is never assigned void. This property makes it possible to apply to it most of the CAP rules suitable for read-only entities. The stable attributes can be declared using value '''stable''' of the VTCT error and VTCM warning reports.
+* Fixed several recompilation issues.
+* Fixed several cases that could lead to a compiler crash.
+* Corrected checks for attachment status of variables to include not only a body of a loop, but also its invariant, variant and exit condition when a variable may be detached in the loop body.
+* Taken into account attachment status of Precursor
+* reference: new keyword to specify that a type is used as a reference type.
+* agent: new keyword used by the agent mechanism.
+* create: Instead of using the famous exclamation mark to create an instance of a class, you can use the keyword create. Below you will find a correspondence table between the old and the new syntaxes. The old syntax is still valid, but at some points Eiffel Software will remove it from its implementation:
+{|
+|-
+| Old syntax
+| New syntax
+|-
+| !! a
+| create a
+|-
+| !! a.make
+| create a.make
+|-
+| !create {create {note: replacement for the keyword indexing.
+* attribute: new keyword to declare attribute body.
+* attached: new keyword to specify attached types and object tests.
+* detachable: new keyword to specify detachable types.
+
+
+==Added semantics==
+* [[ET: Genericity and Arrays|Generic creation]]
+* Expression creation: you can now create an object within an expression. For example, you want to create an object and pass it as an argument to a function. Whereas you had to create a local variable, create the object and pass it to the function, you now simply need to pass to the function the creation expression. Here is a small example:
+{|
+|-
+| Old method
+| New method
+|-
+|
+
+local
+ a: STRING
+do
+ !! a.make (10)
+ f (a)
+end
+
+
+|
+
+do
+ f (create {STRING}.make (10))
+end
+
+
+|}
+This is also very useful since it can improve the power of assertions.
+* Mutually recursive constraints: one can now write class A [H, G->H] or class B [H -> C, G -> ARRAY [H]]. As a result, the declaration A [D, E] is valid only if E is a descendant of D. Similarly, the declaration B [E, ARRAY [D]] is not valid, if E is a descendant of D.
+* [[ET: Other Mechanisms|Tuples]]
+* [[ET: Agents|Agents]]
+* Feature access:
+local
+ value: INTEGER
+do
+ value := {MY_CLASS}.value
+end
+
+infix "+"
+| Yes
+| No
+| Yes, marked as obsolete
+|-
+| Operator and bracket aliases
+| add alias "+"
+| No
+| Yes
+| Yes, except for new rules
+for free operator names
+|-
+| Assigner command
+| item alias "[]" (index: INTEGER): G assign put
+| No
+| Yes
+| Yes
+|}
+
+==Design by Contract==
+{| class="doctable"
+|-
+! A [H, G -> H]B [H -> C, G -> ARRAY [H]]
+| No
+| Yes
+| Yes
+|-
+| Full mutually recursive constraints
+| A [H -> G, G -> H]A [reference G]B [expanded H]
+| No
+| No
+| Yes
+|}
+
+==Creating objects==
+{| class="doctable"
+|-
+! ANY.default_create)
+| class A feature ... end-- The following instructions are equivalent:create {A} acreate {A} a.default_create
+| No
+| Yes
+| Yes
+|-
+| Bang-bang syntax
+| !! a!! a.make!B! a!B! a.make
+| Yes
+| No
+| Yes, marked as obsolete
+|-
+| Keyword syntax
+| create acreate a.makecreate {B} acreate {B} a.make
+| No
+| Yes
+| Yes
+|-
+| Creation expression
+| print (create {TIME}.make_now)
+| No
+| Yes
+| Yes
+|-
+| [[ET: Genericity and Arrays|Generic creation]]
+| create {G} x.make
+| No
+| Yes
+| Yes
+|}
+
+==Attachment==
+{| class="doctable"
+|-
+! x := y
+| No, object is copied to new
+object of the corresponding
+reference type
+| Yes
+| Yes, except for TYPED_POINTER
+that is converted to POINTER before
+reattachment
+|-
+| Reverse assignment (assignment attempt)
+| x ?= y
+| Yes
+| No
+| Yes. Marked as obsolete (V7.1).
+|}
+
+==Feature calls==
+{| class="doctable"
+|-
+! Precursor
+| No
+| Yes
+| Yes
+|-
+| Non-object call
+| c := {COLOR}.green
+| No
+| Yes
+| Yes
+|-
+| Assigner call
+| x [i] := x [i] + 1
+| No
+| Yes
+| Yes
+|-
+| Bracket expression as call target
+| x [i].a: attached ANY b: detachable ANY
+| No
+| Yes, attached by default
+| Yes, attached by default
+|-
+| Object test
+| attached {STRING} e as o
+| No
+| Yes
+| Yes
+|-
+| Attached target of a call
+| x.f
+| No
+| Yes
+| Yes, by option ''void_safety''
+|-
+| Properly set variable
+| x := value use (x)
+| No
+| Yes
+| Yes, by option ''void_safety''
+|}
+
+==[[Concurrent programming with SCOOP|SCOOP]]==
+{| class="doctable"
+|-
+! a: separate ANY
+| No
+| No. separate reserved but not used
+| Yes. Object attached to a may be handled by different SCOOP processor.
+|}
+
+==Expressions==
+{| class="doctable"
+|-
+! y := x [i]
+| No
+| Yes
+| Yes
+|-
+| Creation expression
+| set_buffer (create {STRING}.make (100))
+| No
+| Yes
+| Yes
+|-
+| Manifest type
+| {MY_TYPE}
+| No
+| Yes
+| Yes
+|-
+| Manifest [[ET: Other Mechanisms|tuple]]
+| [a, b, c]
+| No
+| Yes
+| Yes
+|-
+| [[ET: Agents|Agent]]
+| list.do_all (agent print (?))
+| No
+| Yes
+| Yes
+|-
+| Once manifest string
+| once "abc"
+| No
+| Yes
+| Yes
+|}
+
+==Constants==
+{| class="doctable"
+|-
+! x := "[
+ This string is left-adjusted.
+]"
+y := "{
+ This string is used "as is".
+}"
+
+| No
+| Yes
+| Yes
+|-
+| Manifest type qualifier
+| {INTEGER_8} 123
+| No
+| Yes
+| Yes
+|-
+| Non-decimal integer
+| 0xFF
+| No
+| Yes
+| Yes
+|-
+| Integer with intermediate underscores
+| 1_000 0xFFFF_0000
+| In groups by 3 digits
+| Yes
+| Yes
+|}
+
+==Interfacing with external software==
+{| class="doctable"
+|-
+!
+ROOT_CLASS (make): foo @ 4 Alias my_foo call_type __stdcall
+
+===Constraints===
+; on the class: The class cannot be deferred or generic.
+; on the feature: It could be any feature except an attribute, an external feature or a deferred feature.
+; on the creation procedure: It must have zero argument, and no return type.
+; on the alias name: It must be a valid name for a C function.
+; on the index: It must be strictly positive.
+; on the call type: It must be a valid call type for the targeted platform (useful for Windows only). For Visual C++, the valid calling conventions are __stdcall, __cdecl and __fastcall.
+
+For each feature the required fields are the '''class''', the '''creation procedure''', and of course the '''feature''' itself.
+* If the feature is a creation procedure then do not specify any creation, it will use the feature as creation. For example '''ROOT_CLASS: make'''.
+* If the class has no creation procedure, do not specify any creation. default_create will be automatically used.
+
+===A definition file===
+
+
+-- EXPORTED FEATURE(s) OF THE SHARED LIBRARY
+-- SYSTEM : demo
+
+-- CLASS [BAR]
+-- Here get_string uses make_b as creation
+BAR (make_b) : get_string
+-- Here print_bar uses make_a as creation
+BAR (make_a) : print_bar
+
+-- CLASS [ROOT_CLASS]
+-- Here the feature is also a creation
+ROOT_CLASS : make
+ROOT_CLASS (make) : foo
+ROOT_CLASS (make) : test_bar
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/dynamic-library-builder.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/dynamic-library-builder.wiki
new file mode 100644
index 00000000..806039ac
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/dynamic-library-builder.wiki
@@ -0,0 +1,30 @@
+[[Property:title|Dynamic library builder]]
+[[Property:weight|1]]
+[[Property:uuid|e64cdcf2-6da1-98d5-8356-28b50d01374b]]
+In order to facilitate the creation of C dynamic libraries using EiffelStudio, a wizard helps generate the definition files used to define the contents of the shared library. If for some reason you need to override the wizard, the [[Definition file|syntactic rules]] of the definition files are available, but their knowledge is not necessary to use the generation of dynamic libraries in EiffelStudio.
+
+The wizard is accessible in the '''Tools'''/ '''Dynamic library builder''' menu.
+
+The dynamic library window that appears when selecting this menu is mainly composed of a list which contains all features that should be exported. This list is course empty at first.
+
+[[Image:shared-library-window]]
+
+{{note|The layout of this wizard is slightly different on Windows and on Unix systems, because the index and calling convention fields never appear on Unix systems. }}
+
+To add a new feature to the definition file, you can either:
+* Pick the feature from any place in EiffelStudio and drop it into the list. If several creation procedures exists in the container class, a dialog is popped up to give the choice between all possible creation procedures.
+* Or, use the Add command [[Image:16x16--general-add-icon]] in the '''Edit'''/ '''Add''' menu. This pops up a dialog where it is possible to enter manually all parameters for the exported feature.
+
+[[Image:new-exported-feature]]
+
+Other commands of the '''Edit''' menu allow you to remove [[Image:16x16--general-delete-icon]] exported features or to modify their export parameters [[Image:16x16--general-edit-icon]] .
+
+It is also possible to check the validity of the definition file. This command [[Image:view-unmodified-icon]] performs both a global check, to ensure that for example two features do not have the same name or same index in the library, and also local checks, that check for each feature that the parameters are valid.
+
+Other commands, located in the '''File''' menu, give standard file operations, such as opening [[Image:general-open-icon]] a definition file, creating a new definition file [[Image:new-document-icon]] ,or saving the current definition file [[Image:16x16--general-save-icon]] .
+
+{{tip|Although the wizard can handle several files during the same EiffelStudio session, remember that only one file can be used in the project settings to effectively generate a shared library. }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/dynamic-library-generated-files.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/dynamic-library-generated-files.wiki
new file mode 100644
index 00000000..cfa8f7c1
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/dynamic-library-generated-files.wiki
@@ -0,0 +1,47 @@
+[[Property:title|Dynamic library: Generated files]]
+[[Property:weight|3]]
+[[Property:uuid|f3926dd7-eb68-7a82-39f0-b4f5ea891436]]
+Once the Eiffel definition file is created, the compiler will generate a set of files and will compile them to generate the Dynamic library into the EIFGENs/target_name/W_code or EIFGENs/target_name/F_code directory.
+
+{{note|To generate and compile these files, you have to indicate the definition file that should be used in the [[Advanced Options|advanced node of the project settings]] of your system. This way EiffelStudio will know which one to use. If you do not specify any definition file, nothing will be generated. }}
+
+The set of files is composed of:
+* EIFGENs/target_name/W_code/'''system.def''' (or F_code)
+* EIFGENs/target_name/W_code/'''edynlib.c''' (or F_code)
+* $(ISE_EIFFEL)/studio/config/$(ISE_PLATFORM)/templates/'''egc_dynlib.template''' $(ISE_EIFFEL)/studio/spec/$(ISE_PLATFORM)/include/'''egc_dynlib.h'''
+* and the Makefile
+
+The ''system.def'' is only used on windows, it is the definition file used to generate a DLL when linking.LIBRARY demo.dll
+DESCRIPTION DEMO.DLL
+The following are EXPORTed functions.
+
+EXPORTS
+This part concerns the run-time. It initializes the run-time and reclaim Eiffel objects.
+
+;System
+ init_rt
+ reclaim_rt
+
+The exported for the BAR class:
+; CLASS [BAR]
+ get_string
+ print_bar
+
+The exported for the ROOT_CLASS class:
+; CLASS [ROOT_CLASS]
+ make
+ foo
+ test_bar
+
+
+The ''edynlib.c'' file is the interface between the Eiffel system and the C code. It contains the declaration and the implementation of the function used to directly call the eiffel feature with its real name.
+
+The ''egc_dynlib.c'' and ''egc_dynlib.h'' files are used for operations performed by the run-time.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/index.wiki
new file mode 100644
index 00000000..9956da8d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/dynamic-library-generation/index.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Dynamic library generation]]
+[[Property:weight|-12]]
+[[Property:uuid|201551d5-84af-f1ee-deed-b599d4f6e64a]]
+The Eiffel compiler offers the possibility to generate a '''dynamic shared library''' based on the system.
+
+Thanks to this dynamic library, it is possible to call Eiffel features from a C program, by using the real names of the features.
+
+In other words, the user can generate a DLL ''(*.dll)'' using features of the system on windows, and/or a shared library ''(*.so)'' on Unix.
+
+For that, the user has first to describe what he wants to export in his dynamic library. This is done via a definition file ''(*.def)'', which specifies what features should be exported. A [[Dynamic library builder|wizard]] helps build the definition file, which makes this step very intuitive. The second step is to select the definition file in the [[Advanced Options|project settings]] to take this definition file into account. This done, the next compilation of the system will yield [[Dynamic library: Generated files|C files]] that can be used to create the shared library.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/index.wiki
new file mode 100644
index 00000000..ee33493e
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/index.wiki
@@ -0,0 +1,10 @@
+[[Property:title|Compiler]]
+[[Property:weight|-9]]
+[[Property:uuid|6ce8a6e1-5f44-8c47-fcf0-549d1ea0ffaf]]
+EiffelStudio naturally includes a powerful Eiffel compiler, which is at the core of the IDE. It supports the entire Eiffel programming language as defined in the third edition of ''Eiffel: The Language''.
+
+This compiler uses Eiffel's Melting Ice Technology (TM), which accounts for lightning-fast incremental recompilations, ideal during the development cycle. It also provides finalization, which yields a high level of optimization that should be used for released programs.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/melting-ice-technology.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/melting-ice-technology.wiki
new file mode 100644
index 00000000..5d7ac5d9
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/melting-ice-technology.wiki
@@ -0,0 +1,34 @@
+[[Property:title|Melting Ice Technology]]
+[[Property:weight|-15]]
+[[Property:uuid|17c5cf39-2bb3-67e4-11e3-2b6d021e5df1]]
+=Types of compilation provided by Melting Ice=
+
+EiffelStudio relies on Melting Ice Technology, the proprietary compilation mechanism of Eiffel Software, which offers three forms of compilation: '''melting''', '''freezing''', and '''finalizing'''.
+
+==Melting==
+
+Melting is used for making a few changes during typical development activity. The fastest of the mechanisms, typically taking a few seconds after small changes. Melting time is proportional to the size of the changed parts and affected classes, while the time needed to freeze or finalize is partly proportional to the size of the whole system. As long as you do not include new external C/C++ code, a C/C++ compiler is not required. However, execution speed is not optimal. The generated executable is debuggable.
+
+==Freezing==
+
+Freezing generates C code from the active system, and then compiles it into machine code; you must have a C/C++ compiler installed. You need to use this option if you add new agents or external C/C++ calls. Unless you add external code, you can re-freeze every couple of days. The rest of the time, you can melt your software to receive immediate feedback. The speed is still slower than when finalizing, but the generated executable is still debuggable.
+
+==Finalizing==
+
+Finalizing delivers a production version (intermediate or final) of your software. It can be used to measure its performance in operational conditions. Finalization performs extensive time and space optimizations that enable Eiffel to match the efficiency of C/C++; it also creates a stand-alone C package that you can use for cross-platform development. Because of all the optimizations involved, finalizing takes the most time, and the generated executable is not debuggable.
+
+==Precompiling==
+
+Precompilation allows you to create a library in which the classes are already compiled, so when it is used, compile times are decreased. EiffelStudio comes with optional precompiled forms of commonly used libraries. For example, in the Microsoft Windows distribution you can opt for precompiled EiffelBase, or WEL + EiffelBase, or EiffelVision 2 + WEL + EiffelBase. As indicated by these options, the precompilation of a library must also include any other library upon which the target library depends. In other words, it would not be possible to precompile EiffelVision 2 without also including WEL and EiffelBase, too.
+
+=Additional detail=
+
+Melting and freezing generate an executable in the EIFGENs|target_name|W_code subdirectory of the project directory. The executable is composed of a standard executable file named after the system, and of a < ''system name''>.melted file, which is called the Eiffel update file. Although it is recommended to finalize the system when running it from outside EiffelStudio (since the performance is better), it is possible to launch a melted/frozen executable. However, the Eiffel update file is necessary, the executable alone will not run.
+
+Basically, the Eiffel update file incorporates the changes that have been made to the system since it was last frozen. Therefore, it is very small when the system has just been frozen, and progressively becomes bigger each time the system is melted. On the contrary, the executable is only modified when the system is frozen, never when it is melted.
+
+The contents of the Eiffel update file are in a byte code representation which is dynamically interpreted at run-time.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/supported-c-compilers.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/supported-c-compilers.wiki
new file mode 100644
index 00000000..43552ada
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/supported-c-compilers.wiki
@@ -0,0 +1,58 @@
+[[Property:title|Supported C compilers]]
+[[Property:weight|-14]]
+[[Property:uuid|4d4a70fa-b6da-cecb-83e0-dcc18d6ed54a]]
+==Unix/Linux Users:==
+
+EiffelStudio supports `gcc` on most platforms and the native `cc` compiler if it is an ANSI C compiler.
+
+
+==Microsoft Windows Users==
+
+EiffelStudio supports Microsoft and MinGW compilers on Microsoft Windows.
+
+===Microsoft Visual C++ Users===
+
+EiffelStudio supports versions 10.0 and higher of the Microsoft Visual Studio C++ environment. This is available in Visual Studio 2010 or higher revision, or in version of the Windows SDK 7.1 or higher.
+
+EiffelStudio will automatically detect the location of the C compiler.
+
+By default the installation program will set in the registry keys the ISE_C_COMPILER key to `msc` (for versions 12.0 and below) or `msc_vc140` (for Visual Studio C++ 2015 and later.)
+
+===MinGW Users===
+
+By default the installation program will set in the registry keys the ISE_C_COMPILER key to `mingw`.
+
+In versions as late as 6.6, there is a [[EiffelCOM Wizard Guided Tour|restriction]] that prevents the use of EiffelCOM with the MinGW compiler.
+
+===Changing your C compiler on Windows===
+
+You can do it in either of two different ways.
+
+You can manually edit the registry key HKLM\Software\ISE\EiffelNN and change the value of the ISE_C_COMPILER string key to either `msc` (`msc_vc140`) or `mingw` depending upon the effect you desire.
+
+Alternatively, you can set the environment variable ISE_C_COMPILER to either `msc` (`msc_vc140`) or `mingw`.
+
+{| style="width: auto; margin: 0 auto;"
+|+ Reference information about supported C compilers on Windows
+! Compiler
+! Value of ISE_C_COMPILER
+|-
+| MinGW
+| `mingw`
+|-
+| Microsoft Visual Studio C++ 2010 (v10.0)
+| `msc`
+|-
+| Microsoft Visual Studio C++ 2012 (v11.0)
+| `msc`
+|-
+| Microsoft Visual Studio C++ 2013 (v12.0)
+| `msc`
+|-
+| Microsoft Visual Studio C++ 2015 (v14.0)
+| `msc_vc140`
+|-
+| Microsoft Visual Studio C++ 2017 (v15.0)
+| `msc_vc140`
+|-
+|}
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/syntax-level-variant-settings-version.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/syntax-level-variant-settings-version.wiki
new file mode 100644
index 00000000..e454db3f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/compiler/syntax-level-variant-settings-version.wiki
@@ -0,0 +1,140 @@
+[[Property:title|Syntax level variant settings by version]]
+[[Property:weight|-11]]
+[[Property:uuid|aa52a183-c616-4590-5e7e-f9b9e2a71f14]]
+The Eiffel Software compiler provides a set of options, available in [[General Target Options|Project Settings]], which allows users to [[Setting the syntax variant|select a variant of the Eiffel programming language syntax]] that best suits their needs. The meanings of these options, and in fact the options themselves, are subject to change from one version to the next. Below you will find a table that defines the meaning of the syntax level variants for each version.
+
+The options are distinguished by how the compiler handles the processing of certain words found in Eiffel text which may be:
+# Associated with language constructs, or
+# Allowed as identifiers, or
+# In the case of some options as either keywords or identifiers depending upon the context in which the words are found.
+
+
+{| border="1" style="border-collapse: collapse; border-style: solid;"
+|+ '''Legend'''
+| style="color: navy;" | '''keyword'''
+| Accepted as a keyword
+|-
+| style="color: blue;" | '''keyword'''
+| Accepted as a keyword with a warning
+|-
+| style="color: maroon;" | '''keyword'''
+| Accepted as a keyword or if grammar permits as an identifier with a warning
+|-
+| style="color: gray;" | name
+| Accepted as an identifier with a warning
+|-
+| style="color: black;" | name
+| Accepted as an identifier
+|}
+
+
+
+{| border="1" style="width: 100%; border-collapse: collapse; border-style: solid;"
+|+ '''Constructs affected by the ''syntax'' project setting'''
+|-
+! rowspan="2" style="text-align: center; valign: center;" | Release
+! colspan="4" style="text-align: center;" | Setting value*
+|-
+! Obsolete
+! Transitional
+! Standard
+! Provisional
+|-
+! rowspan="9" style="valign: center; text-align: center;" | [[Release notes for EiffelStudio 7.0 | 7.0]] and [[EiffelStudio release notes | more recent]]
+
+| style="color: gray;" | across
+| style="color: maroon;" | '''across'''
+| style="color: navy;" | '''across'''
+| style="color: navy;" | '''across'''
+|-
+| style="color: maroon;" | '''assign'''
+| style="color: maroon;" | '''assign'''
+| style="color: navy;" | '''assign'''
+| style="color: navy;" | '''assign'''
+|-
+| style="color: gray;" | attached
+| style="color: maroon;" | '''attached'''
+| style="color: navy;" | '''attached'''
+| style="color: navy;" | '''attached'''
+|-
+| style="color: gray;" | attribute
+| style="color: maroon;" | '''attribute'''
+| style="color: navy;" | '''attribute'''
+| style="color: navy;" | '''attribute'''
+|-
+| style="color: gray;" | detachable
+| style="color: maroon;" | '''detachable'''
+| style="color: navy;" | '''detachable'''
+| style="color: navy;" | '''detachable'''
+|-
+| style="color: navy;" | '''indexing'''
+| style="color: blue;" | '''indexing'''
+| style="color: black;" | indexing
+| style="color: black;" | indexing
+|-
+| style="color: navy;" | '''is'''
+| style="color: blue;" | '''is'''
+| style="color: black;" | is
+| style="color: black;" | is
+|-
+| style="color: gray;" | note
+| style="color: navy;" | '''note'''
+| style="color: navy;" | '''note'''
+| style="color: navy;" | '''note'''
+|-
+| style="color: gray;" | some
+| style="color: maroon;" | '''some'''
+| style="color: navy;" | '''some'''
+| style="color: navy;" | '''some'''
+|- style="border-top: 4px solid gray;"
+! rowspan="9" style="valign: center; text-align: center;" | [[Release notes for EiffelStudio 6.8 | 6.8]], [[Release notes for EiffelStudio 6.7 | 6.7]], [[Release notes for EiffelStudio 6.6 | 6.6]]
+| style="color: gray;" | across
+| style="color: gray;" | across
+| style="color: gray;" | across
+| style="color: maroon;" | '''across'''
+|-
+| style="color: maroon;" | '''assign'''
+| style="color: maroon;" | '''assign'''
+| style="color: navy;" | '''assign'''
+| style="color: maroon;" | '''assign'''
+|-
+| style="color: gray;" | attached
+| style="color: maroon;" | '''attached'''
+| style="color: navy;" | '''attached'''
+| style="color: maroon;" | '''attached'''
+|-
+| style="color: gray;" | attribute
+| style="color: maroon;" | '''attribute'''
+| style="color: navy;" | '''attribute'''
+| style="color: maroon;" | '''attribute'''
+|-
+| style="color: gray;" | detachable
+| style="color: maroon;" | '''detachable'''
+| style="color: navy;" | '''detachable'''
+| style="color: maroon;" | '''detachable'''
+|-
+| style="color: navy;" | '''indexing'''
+| style="color: blue;" | '''indexing'''
+| style="color: black;" | indexing
+| style="color: black;" | indexing
+|-
+| style="color: navy;" | '''is'''
+| style="color: blue;" | '''is'''
+| style="color: black;" | is
+| style="color: black;" | is
+|-
+| style="color: gray;" | note
+| style="color: navy;" | '''note'''
+| style="color: navy;" | '''note'''
+| style="color: navy;" | '''note'''
+|-
+| style="color: gray;" | some
+| style="color: gray;" | some
+| style="color: gray;" | some
+| style="color: maroon;" | '''some'''
+|}
+
+
+
+gvim {ANY}
+then the text of class
+gvim @{ANY}
+and if class
+gvim @{ANY}.is_equal
+then the text of feature
+gvim -d {ANY}.is_equal {APPLICATION}.is_equal
+then a gvim window in diff mode will be opened showing the difference between
+View --> Tools --> Contract Editor
+
+
+Once visible, the tool can be [[Customizing the tools layout and toolbars#Docking|docked]] to an appropriate location, if desired.
+
+
+=Toolbar=
+
+The Contract Editor toolbar contains the following items:
+
+: [[Image:16x16--general-save-icon]] ''Save modifications to the associated class.'' Becomes enabled when changes have been made to a contract. Clicking will cause changes to be saved.
+
+: [[Image:16x16--general-add-icon]] ''Add a new contract.'' Allows you to add a new contract assertion clause to the currently selected contract element (precondition, postcondition, or invariant). Clicking will provide a choice of creating from a template or creating a custom assertion clause.
+
+: [[Image:metrics-tool--general-remove-icon]] ''Remove selected contract.'' Will delete the currently selected assertion clause from the contract element being edited.
+
+: [[Image:contract-editor-edit-icon]] ''Edit selected contract.'' Will place the currently selected assertion clause in edit mode. Clauses can also be edited by double-clicking the clause itself, or right-clicking on a selected clause and choosing "Edit".
+
+: [[Image:move-up-icon]] and [[Image:move-down-icon]] ''Move selected contract up (or down).'' Use to move the selected assertion clause up or down in relation to the other clauses for this contract element.
+
+: [[Image:refresh-icon]] ''Refresh the current contracts to include any unsaved, undetected editor changes.'' EiffelStudio updates the Contract Editor tool display whenever class text is saved. However, if you edit a class in the Editing tool and have not saved it, there will be a difference between the Editing tool's display and the Contract Editor tool's display for the edited code. Clicking this icon will update the Contract Editor tool to include unsaved changes from the Editing tool.
+
+: [[Image:contract-icon]] ''Select the type of contracts to edit.'' Use to select the contract element to edit. The name of the element (precondition, postcondition, or invariant) is listed to the right of the icon. If the Contract Editor tool is targeted to a routine, you can choose between Precondition and Postcondition by clicking this icon. If the tool is targeted to a class, then Invariant is selected and this icon is disabled in the toolbar.
+
+: [[Image:show-hide-contract-placeholders-icon]] ''Show/hide the hidden contract place holders for inherited contracts.'' In addition to the assertion clauses that are coded immediately on the target routine or class, the Contract Editor tool also shows any assertion clauses inherited from a class's proper ancestor classes. These clauses are labeled with the name of the class from which they are inherited. By default, any classes in the inheritance graph which do not contribute clauses to a contract element are not shown. Toggling this icon down will show placeholders for these classes that are in the graph but do not contribute assertion clauses. Toggling the icon up will re-hide the placeholders.
+
+: [[Image:feature-callers-icon]] or [[Image:class-descendents-icon]] ''Show the callers of the currently edited feature.'' The icon shown here is dependent upon whether the tool is targeted to a routine or class. If the tool is targeted to a routine, then the icon shown will be the feature callers icon ([[Image:feature-callers-icon]]). If the tool is targeted to a class, then the icon shown will be the class descendants icon ([[Image:class-descendents-icon]]). In either case, clicking the icon does not effect the display in the Contract Editor tool. Rather, the action is shown in either the Feature tool (in the case of routines) or the Class tool (in the case of classes).
+
+
+=Editing contracts=
+
+You edit contracts one assertion clause at a time. When you make a selection in the Contracts column of the Contract Editor tool, an entire assertion clause will be selected. In the depiction below, the clause minute_valid is selected from the class invariant of class TIME_OF_DAY.
+
+
+[[Image:es ref contract editor 02]]
+
+
+This applies to multi-line assertion clauses, too, as shown below.
+
+
+[[Image:es ref contract editor 03]]
+
+
+The selected clause can be moved up or down relative to the other clauses by using the up and down arrows in the toolbar.
+
+To make changes to the text of the currently selected assertion clause, click the Edit button ([[Image:contract-editor-edit-icon]]) on the toolbar, or just double-click the selected clause. The clause appears in the Edit Contract dialog box.
+
+
+[[Image:es ref edit contract dialog 01]]
+
+
+You can edit the tag for your assertion clause and the assertion itself.
+
+Assertion clause tags must be valid identifiers. The Contract Editor tool will check your input as you type and alert you if entered a character string that would not be a valid identifier. The tag is optional, so you can leave it empty if you wish.
+
+After editing the assertion clause itself, you can click OK. At this point the Contract Editor tool will perform a syntactical analysis on your assertion clause in order to help you avoid some types of errors. If your assertion clause appears syntactically sound, the Edit Contract dialog box will be dismissed and your changes will be visible in the Contract Editor tool display.
+
+At this point, the changes have not been saved to the class text. To save the changes click the Save icon ([[Image:16x16--general-save-icon]]) in the toolbar.
+
+
+=Adding assertion clauses=
+
+You can add a new clause to any contract assertion by clicking the "Add" button ([[Image:16x16--general-add-icon]]) on the toolbar. The button provides two methods of creation "Custom" and "From Template".
+
+
+[[Image:es ref contract editor add 01|Add Custom or Add from Template]]
+
+
+Choosing "Add Custom..." produces a freeform dialog, much like the editing dialog show earlier in which you can edit an assertion clause from scratch:
+
+
+[[Image:es ref contract editor add 02|Add a custom assertion clause]]
+
+
+"Add from Template" provides a list of code templates for commonly used assertion types. Adding assertion clauses from templates when possible speeds up class specification and helps to avoid errors. Consider a newly coded routine:
+
+
+ my_routine (a_string: STRING)
+ -- Do something with `a_string`.
+ do
+
+ end
+
+
+Part of the specification of this routine might be a precondition that states that the argument must be attached (i.e., not Void), and not the empty string. This precondition can be added to the feature by adding two assertion clauses from templates. To specify that a_string must be attached, you would first choose the template "Attached Contract" which provides this dialog:
+
+
+[[Image:es ref add attached contract template 01|Attached contract]]
+
+
+This template focuses on the fact that some entity (expressed as var in the template) must be the object of an assertion clause that guarantees that the entity is attached. To have the template create such a clause for the argument a_string shown in the routine above, just replace var with a_string in the top text box of the dialog. The resulting code is updated automatically:
+
+
+[[Image:es ref add attached contract template 02|Attached contract]]
+
+
+Adding a clause to specify that a_string must not be empty is done similarly, by selecting the "Not is empty" template. After adding these two precondition clauses, the routine now looks like this:
+
+
+ my_routine (a_string: STRING)
+ -- My routine
+ require
+ a_string_attached: a_string /= Void
+ not_a_string_is_empty: not a_string.is_empty
+ do
+
+ end
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/breakpoints/breakpoint-commands.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/breakpoints/breakpoint-commands.wiki
new file mode 100644
index 00000000..6f79f396
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/breakpoints/breakpoint-commands.wiki
@@ -0,0 +1,12 @@
+[[Property:title|Breakpoint commands]]
+[[Property:weight|2]]
+[[Property:uuid|3631e866-0acd-005d-b1f5-f43377b6e27f]]
+Located in the '''debug''' menu and the '''project''' toolbar, three commands allow you to change the state of set [[Breakpoints|breakpoints]] in the system.
+
+Enable breakpoints ( [[Image:16x16--breakpoints-enable-icon]] ), disable breakpoints ( [[Image:16x16--breakpoints-disable-icon]] ) and remove breakpoints ( [[Image:breakpoints-delete-icon]] ) all have global and local actions. Left-clicking on them has a global action: all breakpoints currently set in the system will be respectively enabled, disabled, or discarded. However, it is also possible to [[Pick-and-drop mechanism|drop]] a feature or a class onto them, in which case only set breakpoints of the feature/class will be affected.
+
+Note that these commands work only on set breakpoints (that is, enabled or disabled breakpoints). Therefore, discarded breakpoints cannot be set again with these commands.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/breakpoints/breakpoint-editing.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/breakpoints/breakpoint-editing.wiki
new file mode 100644
index 00000000..7417c321
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/breakpoints/breakpoint-editing.wiki
@@ -0,0 +1,60 @@
+[[Property:title|Breakpoint editing]]
+[[Property:weight|1]]
+[[Property:uuid|1ac830ab-7600-8e52-2351-c515bcc31d41]]
+In all flat views ( [[Feature formatters: Flat view|feature flat view]] and [[Class formatters: Flat view|class flat view]] ), a margin is displayed on the left of the editor. [[Breakpoints|Breakpoints]] are symbolized there as circles, with different looks depending on their state: enabled ( [[Image:bp-enabled-icon]] ), disabled ( [[Image:bp-disabled-icon]] ) or not set ( [[Image:bp-slot-icon]] ). A small question mark in the circle ( [[Image:bp-enabled-conditional-icon]] , [[Image:bp-disabled-conditional-icon]] ) indicates [[Breakpoint menu|conditional breakpoints]] .
+
+Right-clicking on any breakpoint pops up a context menu:
+
+[[Image:breakpoint-context-menu]]
+
+The first line provides the breakpoint slot index of the selected breakpoint (i.e: the one used in call stack or exception trace output). my_routine, can exit, any routine that my_routine may have called must have exited first. Therefore the last entered feature is listed at the top of the stack and the program root feature is its bottom.
+
+There is one level in the call stack, the currently selected element, that has a special status. It is the level to which all debugging tools refer. The currently selected element is, as you might guess, user-selectable. So it is possible to move along the call stack, changing the currently selected element, and view information in the debugging tools about any level..
+
+To keep a record of a call stack (for example in order to indicate to other people where a problem occurred), you can [[Save call stack|save the call stack]] to a text file.
+
+Information concerning the call stack is spread over several graphical components:
+* The entire call stack, depicted as a list of elements, is displayed in the [[Call stack tool: Interface|call stack tool]] .
+* [[Information relative to a stack element|Information concerning the current call stack element]] is displayed in the feature tab, the locals view, and is used to provide the expressions evaluations contained in the [[Evaluation tool or Watch tool|Expression evaluator tool]] .
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/information-relative-stack-element.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/information-relative-stack-element.wiki
new file mode 100644
index 00000000..3432a806
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/information-relative-stack-element.wiki
@@ -0,0 +1,12 @@
+[[Property:title|Information relative to a stack element]]
+[[Property:weight|2]]
+[[Property:uuid|f78fca33-2e19-1021-70f4-fd262991da7a]]
+In addition to the [[Call stack tool: Interface|call stack tool]] that provides global information concerning the call stack, some other debug tools give more detailed information concerning the [[Call stack tool: Interface|currently selected call stack element]] .
+
+In debug mode, the context tool is automatically switched to the feature tab in flat view, and displays the feature which corresponds to the current call stack element. In the left margin, a yellow arrow ( [[Image:bp-current-line-icon]] ) marks the execution line where the program is currently stopped, whereas a green arrow ( [[Image:bp-slot-other-frame-icon]] ) indicates the execution line that was attained in the feature in the current call stack element. Therefore, if a feature is recursive, and appears several times in the call stack, changing the current call stack element may cause green arrows to be displayed at different places in the same feature (if the different calls did not reach the same execution point). On the other hand, the yellow arrow can only appear at one place as long as the application is not started again.
+
+The left part of the [[Object tool|object tool]] gives valuable information concerning parameters that were passed to the feature corresponding to the current call stack, the current value of the local variables, and, if the feature is a function, the current value of its result.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/save-call-stack.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/save-call-stack.wiki
new file mode 100644
index 00000000..be39318c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/save-call-stack.wiki
@@ -0,0 +1,8 @@
+[[Property:title|Save call stack]]
+[[Property:weight|4]]
+[[Property:uuid|495a2601-8e25-0b48-f86a-6cccf7099c1e]]
+It is possible to copy the current call stack to the clipboard ( [[Image:general-copy-icon]] ) or to a text file ( [[Image:general-save-icon]] ). This may be useful to indicate to other members of a team where an error has occurred. After the button is clicked, a dialog is popped up that prompts for a place in which to save the [[Call stack tool: Interface|call stack]] file (if the selected file already exists, it is overwritten).
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/supported-exceptions.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/supported-exceptions.wiki
new file mode 100644
index 00000000..4271ae3d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/call-stack-tool/supported-exceptions.wiki
@@ -0,0 +1,48 @@
+[[Property:title|Supported exceptions]]
+[[Property:weight|3]]
+[[Property:uuid|f3b4498a-0772-32fb-041d-13428e258f52]]
+Here is a list of exceptions that may appear in the [[Call stack tool: Interface|call stack tool]] . When they are raised, a tag may be there to give more information, if necessary. All these exceptions are declared in {FILE}.independent_store and {FILE}.retrieved for save and load operations. To load the value into an existing object, it uses {ANY}.standard_copy (..). For details, you can have a look at the code in class RT_EXTENSION_GENERAL. }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/debugging-limitations.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/debugging-limitations.wiki
new file mode 100644
index 00000000..4679ca00
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/debugging-limitations.wiki
@@ -0,0 +1,22 @@
+[[Property:title|Debugging limitations]]
+[[Property:weight|-2]]
+[[Property:uuid|4377d765-8664-ee0c-5d5b-e42fd7d172c3]]
+==General limitations==
+* Watch expression: Agents are not supported (for instance "agent my_function" is not supported").
+* You cannot yet create an instance of SPECIAL.
+* The debugger is not very helpful when the execution is stopped inside an invariant.
+* Wrong assertion tag shown in debugger for precondition violation if violated during an exception rescue, indeed the tag remains the one from the exception
+* If you use the "Disable Assertion Handling" functionality when the execution is stopped in a rescue, the effect might be cancelled as soon as the execution exits the rescue's associated feature.
+* Evaluating an expression with a catcall might crash the debugger
+
+==Limitations or known bugs for the Classic debugger==
+* Evaluating Precursor will produce the current feature's Result (not the precursor)
+* If you use any of the previous non supported expressions in a breakpoint condition, since the evaluation is failing the condition will always return True. In such case the debugger will stop.
+
+==Limitations or known bugs for the .Net debugger==
+* When stepping through disabled assertions or disabled debug clauses, the debugger may show incorrect current line.
+* When stepping through an inspect code, the debugger may show incorrect current line (especially if the inspect is not ordered)
+* Under dotnet v2.0, the debugger may have difficulties to fetch the stack values, especially during first chance exception events
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/debugging-preferences.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/debugging-preferences.wiki
new file mode 100644
index 00000000..c8a57145
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/debugging-preferences.wiki
@@ -0,0 +1,19 @@
+[[Property:title|Debugging preferences]]
+[[Property:weight|-4]]
+[[Property:uuid|05e820ff-917f-e41f-d921-990283ac886f]]
+Debugger preferences are available as part of the [[EiffelStudio Preferences]].
+
+The debugger section of the EiffelStudio preferences looks like this:
+
+
+[[Image:debugging-tools-preferences]]
+
+
+The EiffelStudio preference documentation contains a guide to the [[Debugger Preferences]].
+
+Some preferences have an effect upon the speed at which the debugger can display objects:
+* Enable/disable the debug_output display (see [[Debug output|debug output]])
+* Enable/disable the full generic type display (for example, SHIFT key at the same time, it will resize according to the displayed cells.
+* Right clicking on the header's cell will popup a menu that enable or disable the auto resizing on the selected column. This can be useful to resize automatically the "name" column when inspecting an object value.
+* Pressing CTRL+E when the selected line represents a value with potential text representation (STRING, DEBUG_OUPUT ...) will open the [[Object Viewer (also known as Expanded display)|expanded view dialog]].
+
+Evaluation tool (also known as Watch tool)
+* Dropping an object value on a [[Evaluation tool or Watch tool|Evaluation tool ]] will open the [[New expression dialog|expression definition dialog]] with the object's address filled. This way you can evaluate expression directly on this object. If you hold the CTRL key while dropping, the dropped object will be added as expression in the Evaluation tool as itself.
+* You can also drop the object on the notebook tab of the desired Evaluation tool.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/exceptions-handling-tool.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/exceptions-handling-tool.wiki
new file mode 100644
index 00000000..f7f0278a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/exceptions-handling-tool.wiki
@@ -0,0 +1,44 @@
+[[Property:title|Exceptions handling tool]]
+[[Property:weight|-7]]
+[[Property:uuid|9a62611f-46ba-7d74-ba1c-989f6709074b]]
+This Exceptions handling tool is used to specify whether the debugger stops or continues on specific exceptions.
+
+To access this tool, follow the menu path:
+
+
+
+Execution --> Exception handling
+
+
+{{note|Now that exceptions are objects in Eiffel, the mechanism is unified for classic and .NET systems, using the Eiffel exception class names. }}
+
+
+==Tailoring exception handling behavior==
+
+The image below shows the Exceptions handling tool.
+
+
+[[Image:exceptions-handling-tool|Exception handling tool]]
+
+
+In the top two checkboxes, the tool provides a way to enable and disable "Catcall" warnings on the console or in the debugger.
+
+If the "filter exceptions" checkbox is enabled, for each exception you can specify the exception action as one of:
+* '''Disabled''' means that filtering for this exception is not enabled. Therefore, the default behavior of '''Catch''' applies.
+* '''Catch''' means stop on such an exception.
+* '''Ignore''' means do not stop on such an exception.
+You can double clicking an exception name to toggle its status between '''Ignore''' and '''Catch'''.
+
+Clicking the button labeled ''Ignore External Exception?'' will set the status of a set of external exceptions to '''Ignore'''.
+
+Click the button labeled ''Apply'' to apply your selections, or ''Reset'' to reset the tool to its default values.
+
+
+{{tip|Using the "Pattern" field, you can add your own filters using regular expression.}}
+
+
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/attach-application.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/attach-application.wiki
new file mode 100644
index 00000000..0c4ca417
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/attach-application.wiki
@@ -0,0 +1,32 @@
+[[Property:title|Attach application]]
+[[Property:link_title|]]
+[[Property:weight|0]]
+[[Property:uuid|e369df0f-2e1f-5730-ae67-cd7b60b55c5f]]
+Usually when you want to debug an application, you launch it from EiffelStudio and the debugger is automatically attached to the execution of the application.
+However for specific needs (such as server development), you might want to start the execution outside EiffelStudio, and then attach EiffelStudio's debugger to it.
+
+= Requirements: =
+* The application should be compiled in workbench mode.
+* EiffelStudio should be opened on the project used to compile the application.
+
+= How to make it work? =
+* The application execution will wait for the debugger to connect on a specific port number (given by the user).
+
+== Execution ==
+There are 2 ways to provide this port number:
+* Setting the ISE_DBG_PORTNUM environment variable to a specific port number will make the execution to wait right away for EiffelStudio to attach the process.
+* calling Execution->Attach Debuggee and provide the same port number as specified above.
+(Note that you can add the associated command to the execution tool bar.)
+If EiffelStudio is unable to "attach" the debuggee, it will timeout and report the error (this could happen if the debuggee does not open the specific port).
+
+Once attached the execution, EiffelStudio is able to debug the application just as if the application was launched from EiffelStudio.
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/detach-application.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/detach-application.wiki
new file mode 100644
index 00000000..9bce9ed6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/detach-application.wiki
@@ -0,0 +1,11 @@
+[[Property:title|Detach application]]
+[[Property:weight|0]]
+[[Property:uuid|5da63d87-107d-338e-de64-1a52912fd00c]]
+When you are executing an Eiffel application within EiffelStudio (i.e you are debugging it), you may want to detach the debugger from this application without killing the application. The "Detach Execution" command will address this need.
+
+
+You can find it under menu Execution->Detach Execution, and you can also add it to the execution tool bar items.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/execute-one-line-time.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/execute-one-line-time.wiki
new file mode 100644
index 00000000..102a4c73
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/execute-one-line-time.wiki
@@ -0,0 +1,14 @@
+[[Property:title|Execute one line at a time]]
+[[Property:weight|-9]]
+[[Property:uuid|7d4489b4-5f29-2b1c-af83-afc2b25c8f85]]
+If no application was already running, this command launches an application compiled in Work Bench mode and stops at its first line.
+
+If an application was stopped, it attempts to execute the instruction located on the execution line where the application is stopped. If this execution line does not contain an instruction, the execution stops at the next execution line.
+
+It is accessible through the '''project''' toolbar ( [[Image:debug-step-over-icon]] ) or through the '''debug''' menu.
+
+{{seealso| [[Execution commands]], [[Generating executables|Compiling in Workbench mode]] }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/execution-profiles.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/execution-profiles.wiki
new file mode 100644
index 00000000..8a9f2d2d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/execution-profiles.wiki
@@ -0,0 +1,33 @@
+[[Property:title|Execution profiles]]
+[[Property:weight|-13]]
+[[Property:uuid|90e64e1c-b5fc-e150-9901-50daffaac893]]
+While working on a project, you may want to launch your system with values for one or more arguments, specify a working directory, and/or change certain environment variables.
+
+Those parameters are done by changing the execution profiles. For that you need to use the '''Execution parameters''' dialog.
+
+* You can open this dialog in either of two ways:
+** Follow the EiffelStudio menu path: Execution -> Execution parameters .
+** Right-click any of the buttons on the debugging/execution toolbar.
+
+==Using the "Execution parameters" dialog==
+
+[[Image:argument-dialog]]
+
+
+The dialog allows you to manage different execution profiles to specify parameters to be passed to the system at execution time.
+
+Each profile lets you set a title, the '''arguments''', the '''working directory''', as well as your own '''environment variables'''.
+
+To use a profile, just select it by clicking the corresponding line in the grid.
+
+Once the appropriate execution profile is selected then the system can be run with those parameters using the Run button (If "Keep Dialog Open" is selected the dialog remains opened).Execution -> Execution parameters .
+* By right-clicking any of the buttons on the debugging toolbar.
+
+See the [[Execution profiles|Execution parameters dialog]] for more details.
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/run-finalized-executable.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/run-finalized-executable.wiki
new file mode 100644
index 00000000..c7c6ef5b
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/run-finalized-executable.wiki
@@ -0,0 +1,14 @@
+[[Property:title|Run a finalized executable]]
+[[Property:weight|-11]]
+[[Property:uuid|a69ab49a-2bd1-a405-837c-b3e629fa5394]]
+As opposed to other execution commands, this command launches an application compiled in finalized mode. This has the same effect as running the application in the EIFGENs/target_name/F_code directory from a console prompt.
+
+No debugging is possible with this command, but it lets you test the real speed of your program without any overhead.
+
+It is accessible through the '''project''' toolbar ( [[Image:debug-run-finalized-icon]] ) or through the '''project''' menu.
+
+{{seealso| [[Execution commands]], [[Generating executables|Compiling in finalized mode]] }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/run-without-breakpoints.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/run-without-breakpoints.wiki
new file mode 100644
index 00000000..e07c3c59
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/run-without-breakpoints.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Run without breakpoints]]
+[[Property:weight|-12]]
+[[Property:uuid|1f619bce-a3c7-5984-d3e6-4c5dceabf53d]]
+This command launches an application compiled in Workbench mode. The application will not stop when a [[Breakpoints|breakpoint]] is encountered. However, it stops when an exception occurs.
+
+It is accessible through the '''project''' toolbar ( [[Image:debug-run-without-breakpoint-icon]] ) or through the '''debug''' menu.
+
+{{seealso| [[Execution commands]], [[Generating executables|Compiling in Workbench mode]] }}
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/step-feature.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/step-feature.wiki
new file mode 100644
index 00000000..7f07b991
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/step-feature.wiki
@@ -0,0 +1,14 @@
+[[Property:title|Step into a feature]]
+[[Property:weight|-10]]
+[[Property:uuid|a141505a-cc5a-afe1-6f8c-8e216bd7a232]]
+If no application was already running, this command launches an application compiled in Work Bench mode and stops at its first line.
+
+If an application was stopped, it attempts to enter the feature located on the execution line where the application is stopped. If this feature is an attribute, or another non debuggable feature, it simply executes the current execution line and stops at the next one.
+
+It is accessible through the '''project''' toolbar ( [[Image:debug-step-into-icon]] ) or through the '''debug''' menu.
+
+{{seealso| [[Execution commands]], [[Generating executables|Compiling in Workbench mode]] }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/step-out-feature.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/step-out-feature.wiki
new file mode 100644
index 00000000..9e9ce964
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/step-out-feature.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Step out of a feature]]
+[[Property:weight|-8]]
+[[Property:uuid|4d3b068d-cbeb-be94-94c9-f73eb12b6c0e]]
+If no application was already running, this command launches an application compiled in Work Bench mode and stops at its first line.
+
+If an application was stopped, it attempts to exit the feature where the application is stopped.
+
+It is accessible through the '''project''' toolbar ( [[Image:debug-step-out-icon]] ) or through the '''debug''' menu.
+
+{{seealso| [[Execution commands]], [[Generating executables|Compiling in Workbench mode]] }}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/stop-debugged-application.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/stop-debugged-application.wiki
new file mode 100644
index 00000000..2ccb4dc3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-commands/stop-debugged-application.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Stop a debugged application]]
+[[Property:weight|-6]]
+[[Property:uuid|648fdd76-c393-982d-5367-1e9b02669248]]
+This command kills the debugged application, if any. This stops the debugging session.
+
+It is accessible through the '''project''' toolbar ( [[Image:debug-stop-icon]] ) or through the '''debug''' menu.
+
+{{seealso| [[Execution commands]] }}
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-record-and-replay/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-record-and-replay/index.wiki
new file mode 100644
index 00000000..c51220ce
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-record-and-replay/index.wiki
@@ -0,0 +1,26 @@
+[[Property:title|Execution record and replay]]
+[[Property:weight|-12]]
+[[Property:uuid|5184f354-f954-49e2-d38f-15214dcd3d6b]]
+This feature allows you to record the debugger controlled execution of your system, and then replay this recording when the debugger is stopped. One could regard this feature as a rewind/forward, or undo/redo of the execution calls.{RT_DBG_EXECUTION_PARAMETERS}.make.
+* {RT_DBG_EXECUTION_PARAMETERS}.maximum_record_count
+** Type: INTEGER
+** Default value: 1_000_000
+** Effect: The recording keeps only the last maximum_record_count object's records.
+* {RT_DBG_EXECUTION_PARAMETERS}.flatten_when_closing
+** Type: BOOLEAN
+** Default value: True
+** Effect: When leaving a feature, the recorder flattens the associated record. This saves memory space, and optimizes the underlying mechanism. The default value of True is recommended.
+* {RT_DBG_EXECUTION_PARAMETERS}.keep_calls_records
+** Type: BOOLEAN
+** Default value: True
+** Effect: When flattening call records' values, keep the sub-call records (i.e: the execution calls history)
+* {RT_DBG_EXECUTION_PARAMETERS}.recording_values
+** Type: BOOLEAN
+** Default value: True
+** Effect: During execution, record attribute and locals assignment. Set to False if you just want to review the calls history. Values will not be recorded, but recording will be faster.
+
+
+{{warning|Since there is no way to restore local values when the execution left the related call stack frame, the recording discards the recorded local values.}}
+
+
+The recording functionality is graphically available on the Call stack tool, or though the "Execution" menu (formerly the "Debug" menu).
+
+After you start debugging, if at some point you decide to start recording, click on the "record" button in the Call stack tool:
+
+
+[[Image:exec-replay-00]]
+
+
+or follow the menu path:
+
+Execution --> Activate Execution Recording
+
+
+{{note|If you want to record from the beginning, just enable the recording before starting the debug session (the recording button is a toggle button)}}
+
+
+{{tip|You can also use the "When hits.." actions of [[Breakpoint editing|breakpoints]] to start and stop the execution recording. This can be useful to record only the part of an execution that you are interested in.}}
+
+
+[[Image:exec-replay-00-1]]
+
+
+The execution is now recorded. Whenever the application is stopped, you can decide to [[Replay (recorded) execution|replay]] the previously recorded execution. See: [[Replay (recorded) execution]] to learn how to replay an execution.
+
+
+{{note|EiffelStudio provides record and replay only in classic mode. So, it is not yet supported for .NET systems.}}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-record-and-replay/replay-recorded-execution.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-record-and-replay/replay-recorded-execution.wiki
new file mode 100644
index 00000000..a369f4fa
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/execution-record-and-replay/replay-recorded-execution.wiki
@@ -0,0 +1,61 @@
+[[Property:title|Replay (recorded) execution]]
+[[Property:weight|2]]
+[[Property:uuid|13932252-4eca-7c71-d047-b0b011e50d60]]
+The replay functionality is available from a button on the Call stack tool, or though EiffelStudio's "Execution" menu.
+
+
+{{note|First, you must be sure execution recording is activated ([[Record execution|read how to record execution]]).}}
+
+
+Now, whenever the application is stopped in the debugger, you can replay the recorded execution by clicking on the "Replay" button:
+
+
+[[Image:exec-replay-01]]
+
+
+After clicking the "Replay" button, the Call stack tool enters "execution replay" mode, as shown below:
+
+
+[[Image:exec-replay-02]]
+
+
+In "execution replay" mode, the "Replay" button is enabled, and an additional command bar becomes visible with replay control buttons "Back", "Forth", "Previous", "Next", and "Go to". The numbers on the right end of this command bar indicate the call stack depth, the breakable index, and the nested breakable index. The buttons have following meanings:
+
+* '''Back''': means replay back to caller, i.e., down in the call stack.
+* '''Forth''': means replay to callee, i.e., up in the call stack.
+* '''Previous''': means replay to previous instruction (previous call in the same stack; i.e., similar to step previous) if possible.
+* '''Previous''': means replay to next instruction (next call in the same stack; i.e., similar to step next) if possible.
+* '''Go to''': replay to the selected call when possible.
+
+Below the command bar, in the first column, you will find a tree structure, which shows, on the root level, the effective call stacks, and for each root node, you can inspect the sub element to browse the call history.CTRL+E on the selected value). Use it if an object has a very long string representation or a string representation that contains carriage returns, for example. CTRL+- or CTRL++ respectively (that is, the Control key with the ''minus'' key or the Control key with the ''plus'' key).
+
+{{tip|Dropping an object onto this list lets you define quickly an expression whose context is the dropped object. This avoids having to type object addresses manually. CTRL key while dropping, you will add the dropped object as itself. }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/expression-evaluation/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/expression-evaluation/index.wiki
new file mode 100644
index 00000000..1b13daca
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/expression-evaluation/index.wiki
@@ -0,0 +1,27 @@
+[[Property:title|Expression evaluation]]
+[[Property:weight|-10]]
+[[Property:uuid|e55442ac-7861-1995-d315-baeed6c49223]]
+[[Image:expression-evaluation-tool]]
+
+The Expression evaluation tool (sometimes called the Watch tool) makes it possible to evaluate expressions while the application is stopped in the debugger. A typical use for it is the case in which you would like to know the result that an external feature would return. Since you do not have access to the C memory of the application, doing this would be impossible without the Expression evaluation tool. You might also want to know the result of an Eiffel feature whose body is too complex for you to evaluate.
+
+In these cases (and any other that suits you), you should use the dynamic expression evaluation. Simply [[New expression dialog|define the expression]] and its result will be immediately available in the [[Evaluation tool or Watch tool|list of expressions]] .
+
+If you keep the mouse cursor over the expression cell of line, you get a tooltip describing the expression result.
+
+You can disable the evaluation of the selected expression by clicking on [[Image:general-toogle-icon]] . After you do, the context value will display 'disabled'.
+
+If the expression has an error, or if the evaluation raised an exception, you can obtain a more detailed description by double-clicking on the expression row.
+
+
+{{caution|During the evaluation of an expression, all features that are necessary to obtain the result are called. Therefore, you should avoid calling queries that have side-effects, since doing so may alter the program execution. The Eiffel methodology recommends against creating queries with side-effects for other important reasons, as well. }}
+
+{{caution|Eiffel ''agents'' (for example: agent my_function) are not supported is not supported. }}
+
+{{caution|The evaluation ignores void-safety checking, a side effect is that expression {FOO} is interpreted as {detachable FOO} even if your application is void-safe. Thus keep this in mind when your expression implies TYPE objects. }}
+
+
+{{caution|Currently, for classic Eiffel systems, evaluating Precursor will result the current feature's result (not the precursor). }}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/expression-evaluation/new-expression-dialog.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/expression-evaluation/new-expression-dialog.wiki
new file mode 100644
index 00000000..97758794
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/expression-evaluation/new-expression-dialog.wiki
@@ -0,0 +1,28 @@
+[[Property:title|New expression dialog]]
+[[Property:weight|2]]
+[[Property:uuid|95a78497-434d-759f-fdce-f9025c891495]]
+Adding new expressions to the [[Evaluation tool or Watch tool|list of expressions]] that should be dynamically evaluated is performed via a dialog.
+
+
+{|
+|-
+| [[Image:new-expression-definition-dlg]] once and constant features of that class. It requires a valid class name.
+
+
+The second part prompts for the expression itself. This field supports arguments, dot calls and operators (to a certain extent), but does not support creation expressions, agents or non-object calls. Genericity is partially supported.
+
+The "Keep Assertion Checking" checkbox is used to enable assertion checking during expression evaluation if desired (by default assertions won't be checked).
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/index.wiki
new file mode 100644
index 00000000..7adf9a6d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/index.wiki
@@ -0,0 +1,18 @@
+[[Property:title|Debugger]]
+[[Property:weight|-8]]
+[[Property:uuid|31c4857e-f19e-e9e3-b7db-d6c30515277f]]
+A debugger is a tool that allows you to [[Execution commands|run]] an application and view its state at any moment. This includes having information concerning the current [[Call stack tool|call stack]] and the [[Object tool|state of objects]] of the system, i.e. the values of their attributes. This kind of information can be used to spot objects that have invalid states, to see the consequences of the execution of a feature over an object state, and so on.
+
+The features of the EiffelStudio debugger include:
+* Stopping the application in frozen features as well as in melted features
+* [[Step into a feature|Stepping into]] features, [[Execute one line at a time|executing them one line at a time]] , or [[Step out of a feature|stepping out]] of them
+* Setting [[Breakpoints|breakpoints]] on-the-fly, while the execution is running
+* [[Expression evaluation|Dynamic evaluation of expressions]]
+* [[Breakpoints|Conditional breakpoints]]
+* [[Stack overflow prevention|Stack overflow prevention]]
+* Classes can implement the [[Debug output|debug_output interface]] and have their objects display a string in the debugger
+* Execution can be recorded to be replayed when execution is paused, use the [[Execution record and replay|execution replay mechanism]] from the call stack tool interface, and have the debugging tools updated.
+* Debuggee objects can be stored/retrieved from the debugger, check the [[Debuggee's Object Storage|debuggee object storage mechanism]] available from the objects tool, and watch tools' toolbar.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/object-tool/attribute-symbols.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/object-tool/attribute-symbols.wiki
new file mode 100644
index 00000000..5a3beba0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/object-tool/attribute-symbols.wiki
@@ -0,0 +1,19 @@
+[[Property:title|Attribute symbols]]
+[[Property:weight|1]]
+[[Property:uuid|6dfbde5d-3423-4f10-6569-30af2ba00dd1]]
+In both trees of the [[Object tool|object tool]], objects are displayed. The values displayed for each object fall into two categories: the object's attributes (grouped under the '''attributes''' folder [[Image:feature-attribute-icon]] ) and its once routines (grouped under the '''once routines''' folder [[Image:feature-once-icon]] ).
+
+The following symbol scheme is used to categorize each item:
+* [[Image:debugger-object-immediate-icon]] An attribute of a basic Eiffel type, such as [[ref:libraries/base/reference/kernel/integer_chart.xml|INTEGER]] or [[ref:libraries/base/reference/kernel/classic/double_chart.xml|DOUBLE]]
+* [[Image:debugger-object-eiffel-icon]] An attribute that is a reference to an object
+* [[Image:debugger-object-void-icon]] A Void reference
+* [[Image:debugger-object-expanded-icon]] An object that is expanded
+
+For .NET system, special symbols are used to describe :
+* [[Image:debugger-object-dotnet-icon]] An object that is external (i.e., not known as an Eiffel type)
+* [[Image:debugger-object-dotnet-static-icon]] A static value object that is external (i.e., not known as an Eiffel type)
+* [[Image:debugger-object-static-icon]] A static value object that is known as an Eiffel type
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/object-tool/debug-output.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/object-tool/debug-output.wiki
new file mode 100644
index 00000000..25bcc2b0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/object-tool/debug-output.wiki
@@ -0,0 +1,16 @@
+[[Property:title|Debug output]]
+[[Property:weight|2]]
+[[Property:uuid|41544c3b-e1f1-53a5-ff63-e63224c32fa3]]
+For virtually any object displayed in the Object tool, it is possible for the developer to cause the Object tool to display a user-definable string value next to the object address.
+
+In order to have the instances of a class display such a string in the object tool, make the class an heir to class _REF classes inherit (through class _REF objects in the Object tool. The *_REF classes are reference versions of the basic Eiffel classes such as [[ref:libraries/base/reference/kernel/integer_chart.xml|INTEGER]] and [[ref:libraries/base/reference/kernel/classic/double_chart.xml|DOUBLE]]. So, without once functions that have already been called.
+
+By default the Object tool display is composed of one grid, which gives information about the [[Call stack tool|current stack element]]. Specifically, it provides the Current object value, the arguments' values of the current stack element's feature call, the values of the local variables, as well as the value of the Result (if this feature is a function).
+
+When an exception occurs (for instance, an assertion violation), the object tool will also display the exception information:
+
+
+[[Image:objects-tool-exception]]
+
+
+{{note|A specific case for .NET systems: When the system is stopped, the first item of the local view displays the module name for the feature at which execution stopped. }}
+
+All objects can be expanded to see the values of their attributes. They are also pickable, so that it is possible to drop them onto the Object tool, an [[Expression evaluation|expression evaluator tool]] (also know as Watch tool), or an editor.
+
+It is also possible to use the [[Set slice size command|set slice size command]] with [[ref:libraries/base/reference/special_chart|SPECIAL]] objects or [[ref:libraries/base/reference/native_array_chart|NATIVE_ARRAY]] (.NET) objects.
+
+
+
+'''The toolbar buttons:'''
+Execution --> Tools --> Object Viewer
+
+or pop-up the object viewer dialog by clicking the button ( [[Image:debugger-expand-info-icon]] ) located in the tool bar of the [[Object tool|objects tool]] and [[Expression evaluation|watch tool]].
+
+This command [[Image:debugger-expand-info-icon]] opens an object viewer dialog when an object is dropped onto the button.
+
+Depending the nature of the dropped object, you can view it with one or more of several viewers:
+* '''Object dump''': dump a text representation of the value
+* '''String display''': string representation
+* '''XML display''': xml viewer
+* '''Object browse''': browse the object, as you would do in the Object or watch tools
+* '''Object internal''': display some internal data elements such as:
+** class_name
+** type_name
+** dynamic_type
+** field_count
+** deep_physicial_size
+** physical_size
+
+{{note|The "string display" viewer is available for objects with a string representation, for instance objects whose types conform to [[ref:libraries/base/reference/string_8_chart|STRING_8]] or conform to [[ref:libraries/base/reference/debug_output_chart|DEBUG_OUTPUT]] (see [[Debug output|Debug Output]]. )}}
+
+{{note|The "XML display" is available for objects eligible for "String display", and whose string representation has XML content. The viewer displays XML in a tree-enabled grid.}}
+
+
+'''String display viewer:''':
+
+
+[[Image:expanded-display-default]]
+
+Displays the object as a string, by default the displayed length is 50:
+Execution --> Overflow prevention...
+
+
+The dialog lets you decide at which call stack depth a warning should be issued.
+
+
+[[Image:stack-overflow-dlg]]
+
+
+By default, a warning is issued when the debugged program reaches a stack depth of 1,000 elements.
+
+
+{{note|Once an application has stopped at the selected level, it will not stop again until its stack depth goes below the critical stack depth again. }}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/threads-tool.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/threads-tool.wiki
new file mode 100644
index 00000000..fea7cb49
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/debugger/threads-tool.wiki
@@ -0,0 +1,20 @@
+[[Property:title|Threads tool]]
+[[Property:weight|-8]]
+[[Property:uuid|457b71dc-4609-dac1-8458-cd9b64fd5945]]
+This tool displays the list of current Eiffel threads.
+Execution --> Tools --> Threads
+
+
+[[Image:threads-tool|Threads tool]]
+
+
+By double clicking on a row, you change the current thread for the debuggee (application). If you double click on "Note" cell, you can edit a note, this can be useful to identify a thread during the debugging session.
+
+
+The highlighted line shows the current thread.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/diagram-tool/contexts.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/diagram-tool/contexts.wiki
new file mode 100644
index 00000000..5655707f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/diagram-tool/contexts.wiki
@@ -0,0 +1,19 @@
+[[Property:title|Contexts]]
+[[Property:weight|4]]
+[[Property:uuid|6adec8c0-0eb4-d616-c7be-ef7480673b1c]]
+A diagram in the diagram tool is always the context of a certain class or cluster. Context means the direct relations up to a certain depth.
+
+For clusters, the relations are:
+* subclusters
+* superclusters
+
+The relations for classes are:
+* ancestors
+* descendants
+* clients
+* suppliers
+This is an example of the class
+note
+ description: "Objects that ..."
+ author: ""
+ date: "$Date: 2008-09-02 13:54:45 +0200 (Tue, 02 Sep 2008) $"
+ revision: "$Revision: 74646 $"
+
+class
+ CLASS_NAME
+
+end -- class CLASS_NAME
+
+
+* When you delete a class, the class file is removed from the disk.
+* When you add a parent to a class, the parent is inserted in the existing inheritance clause, ''without'' any additional ( undefine/ select/etc.) clauses to solve possible conflicts.
+note
+ description: "Objects that ..."
+ author: ""
+ date: "$Date: 2008-09-02 13:54:45 +0200 (Tue, 02 Sep 2008) $"
+ revision: "$Revision: 74646 $"
+
+class
+ CLASS_NAME
+
+inherit
+ NEW_PARENT
+
+end -- class CLASS_NAME
+
+
+* When removing an inheritance link, the entire parent clause is removed, i.e. including any redefine/undefine/etc. until the matching end.
+* When creating a client link, a function or attribute is generated by the feature wizard. When creating a function, this code is generated:
+note
+ description: "Objects that ..."
+ author: ""
+ date: "$Date: 2008-09-02 13:54:45 +0200 (Tue, 02 Sep 2008) $"
+ revision: "$Revision: 74646 $"
+
+class
+ CLASS_NAME
+
+feature -- Access
+
+ f: TYPE
+ -- Client from CLASS_NAME to TYPE.
+ do
+ end
+
+end -- class CLASS_NAME
+
+
+* If you choose to create an attribute for the client link, and optionally specify to generate a set-procedure and an invariant, the following code will be pasted into the class text:
+note
+ description: "Objects that ..."
+ author: ""
+ date: "$Date: 2008-09-02 13:54:45 +0200 (Tue, 02 Sep 2008) $"
+ revision: "$Revision: 74646 $"
+
+class
+ CLASS_NAME
+
+feature -- Access
+
+ f: TYPE
+ -- Client from CLASS_NAME to TYPE.
+
+feature -- Element change
+
+ set_f (a_f: TYPE)
+ -- Client from CLASS_NAME to TYPE.
+ require
+ a_f_not_void: af /= Void
+ do
+ f := a_f
+ ensure
+ f_assigned: f = a_f
+ end
+
+invariant
+ f_not_void: f /= Void
+
+end -- class CLASS_NAME
+
+
+* When removing a client link, only the matching function or attribute is removed. Any additionally generated set-feature or invariant is not removed.
+* When removing a cluster, the associated directory is not erased, but the reference to the cluster is removed from the configuration file. At this time, it is not possible to create a cluster using the diagram tool, only to remove one.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/diagram-tool/diagram-toolbar.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/diagram-tool/diagram-toolbar.wiki
new file mode 100644
index 00000000..b916e78a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/diagram-tool/diagram-toolbar.wiki
@@ -0,0 +1,77 @@
+[[Property:title|Diagram toolbar]]
+[[Property:weight|2]]
+[[Property:uuid|c0ea47ac-e616-0762-b1bf-53d87df8ce9f]]
+The toolbar of the diagram contains these buttons:
+* [[Image:diagram-target-cluster-or-class-icon]] Target to cluster or class deferred.
+
+
+[[Image:bon-class-deferred]]
+
+
+* Effective: class is not deferred and has at least one deferred parent, or redefines one ore more features.
+
+
+[[Image:bon-class-effective]]
+
+
+* Persistent: class inherits persistent.
+
+
+[[Image:bon-class-persistent]]
+
+
+* Interfaced: class has one ore more external features.
+
+
+[[Image:bon-class-interfaced]]
+
+
+* Reused: class resides in a precompiled library or in a library cluster.
+
+
+[[Image:bon-class-reused]]
+
+
+* Root class: class has the program's entry point.
+
+
+[[Image:bon-class-root]]
+
+
+{{seealso|expanded features. In the diagram, an aggregate link has a little line along the back side of the arrow.
+
+
+[[Image:bon-agg-client]]
+
+
+{{seealso|note clause (the obsolete keyword indexing may still be supported, depending upon which syntax level is chosen in project preferences).
+* A target, library or cluster. In this case the annotation appears in the associated ECF file.
+
+EiffelStudio provides support for entering annotations through the [[Information Tool|Information Tool]].
+
+To specify a link between Eiffel and external information, you include such an annotation.
+
+The primary components of an annotation are:
+# The '''EIS''' marker.
+# The '''[[Protocols|protocol]]''', which indicates the type of external information, and making it possible for EIS to determine the associated external tool. If the '''protocol''' is omitted, its value defaults to "URI".
+# The '''source'''. This is the location of the external information, for example a URL, or a file name.
+
+==Syntax for Annotations==
+
+Annotations can occur in Eiffel source code and in project configuration files (.ecf). The format of the '''EIS marker''' varies depending upon the context in which it is used. The rest of the annotation format is the same in both contexts.
+
+Individual annotations can be placed in Eiffel files either through the [[Information Tool]] or by manual editing of the files.
+
+Additionally, a special type of annotation called an '''Automatic annotation''' can be specified for Eiffel configuration [[general target options|targets]]. An automatic annotation on a target will put an implicit annotation with a variable source on each class in the target. An implicit annotation on any particular class can be overridden by an explicitly coded annotation, when necessary.
+
+The following example illustrates the form of an EIS annotation written in Eiffel source code. The annotation appears in the note part of a class or feature definition:
+
+EIS: "name=Project Requirement", "src=$(system_path)/docs/requirements.pdf", "protocol=PDF", "nameddest=4.1", "tag=requirement"
+
+
+The '''EIS marker''' is the label '''EIS:''' (this label is called the ''Note_name'' in the ISO/ECMA Eiffel Standard syntax). The '''EIS marker''' tells the Eiffel Information System that this particular ''Note_entry'' is of interest to EIS.
+
+The '''name''' property assigns a name to this annotation. The name will be visible in the [[Information Tool]].
+
+In this example, the '''source''' name (src) includes the string '''$(system_path)''', a reference to a [[Variable Definition|variable]], '''system_path''', which is a predefined variable for the the project location.
+
+The '''protocol''' is '''PDF'''.
+
+The '''nameddest''' property (name destination) is a specific property of PDF documents that tells the external tool for PDF documents to open the document at a particular named destination.
+
+The '''tag''' property associates a text tag, in this case "requirement" with this link. Tags show up in the [[Information Tool]] and can be used to organize annotations.
+
+The following is an example of an annotation Eiffel configuration (.ecf) file:
+
+
+
+
+
+
+
+Eiffel configuration files have XML definitions, so this is just an XML version of what was coded into an Eiffel class above. The annotation appears in a element. The '''''' element plays role of '''EIS marker''', just as '''EIS:''' does in the note entry in the source code example above. The '''''' element in Eiffel configuration files is supported in ECF schema version 1.4 and later.
+
+
+{{seealso|note part of the class text.
+
+
+{{note|Annotation management is not available in lists corresponding to tag nodes in the information tree. That is, annotations listed in ''All tags'', ''Items without tag'', and nodes for specific named tags cannot be altered. }}
+
+Of course, you can also use the EiffelStudio editor or an external editor to manage annotations in Eiffel source code and configuration files using the annotation syntax described in [[EIS: Outgoing]]. The advantage to using the Information Tool is that the tool modifies the files for you, making the process less prone to error.
+
+==Adding==
+
+For each node in the information tree, the list of associated annotations is visible to the right. At the bottom the list, there is an entry that is blank, except for the '''Name''' column which contains an ellipsis (" ... "). Double clicking the blank line creates a new unnamed annotation. You can then modify the new entry as you wish.
+
+==Modifying==
+
+Select a line in the annotation list, then click into a column you wish to change. This will activate ''editing/choosing'' mode. Now you can edit text in the column or if the column is a drop down list, you can choose an alternative entry. Once the editing area drop down list is deactivated, the modification is done and synchronized into code automatically.
+
+==Removing==
+
+By pressing '''Delete''', or clicking the ''delete'' button [[Image:16x16--general-delete-icon]] on the bottom toolbar, you will delete any selected annotations in the list. This deletes the annotation entries from the list and also from the corresponding the Eiffel class or configuration text.
+
+
+{{note|Multiple entries in the annotation list can be deleted by selecting them all prior to clicking ''delete''. }}
+
+==Enabling and disabling automatic annotation entries==
+
+Automatic annotations can be enabled for a particular project target. Once enabled, each class in the target will exhibit an implicit annotation with a particular source. You can define the source at the same time you enable automatic annotations for a target.
+
+To enable automatic annotations, select the desired target in the information tree. When you do this, the button on the bottom toolbar with the automatic annotation [[Image:automatic annotation icon]] icon becomes enabled. Click this button and you will see the '''Edit Automatic EIS Entry'' dialog box as in Figure 1.
+
+
+[[Image:edit automatic eis entry dialog]]
+
+Figure 1. The Edit Automatic EIS Entry dialog
+
+
+You enable automatic annotations by checking the box labeled '''Enable Auto-Entry'''. You construct an appropriate source from explicit strings and/or variable names in the are labeled '''Source'''.
+
+You can disable automatic annotation entries on a target by invoking the Edit Automatic EIS Entry dialog box and un-checking the '''Enable Auto-Entry''' checkbox.
+
+
+{{note|Most changes made to annotations via the Information Tool are irreversible. However, changes made to annotations on a class or feature which is currently open in the Editor Pane may be reversed by using the editor's '''Undo''' command. The '''undo''' feature should be used with caution as the '''undo''' does not function in some early EIS versions.}}
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/browsing-information.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/browsing-information.wiki
new file mode 100644
index 00000000..bfd75edc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/browsing-information.wiki
@@ -0,0 +1,73 @@
+[[Property:title|Browsing Information]]
+[[Property:weight|0]]
+[[Property:uuid|2260eabd-cbc9-c385-6295-96474249953f]]
+[[Image:information tool v71|1000px]]
+
+Figure 1: The Information Tool
+
+
+==Information Tree==
+
+On the left of the tool window is the information tree. The tree displays all locations which contain annotations, as well as a subtree of tags by which annotations can be organized. Clicking or pressing enter on a node of the tree displays the list of annotations associated with that node. In Figure 1, the node APPLICATION, a class, has been selected, and its annotations are listed on the right.
+
+A node in the information tree that has annotations will be decorated with the small "i" icon [[Image:EIS information icon]], as you see in the case of APPLICATION.
+
+You can navigate to the following types of nodes in the information tree:
+* Target
+* Cluster
+* Library
+* Class
+* Feature
+* Items without tags
+
+==Annotation List==
+
+The annotation list appears on the right of the tool window.
+
+The following columns are available in the list:
+* '''Target''' - the development object where that piece of annotation belongs to. Typical locations are target, cluster, class and feature.
+* '''Source''' - the address of the resource, typically a URL or file path. Variables can be used.
+* '''Parameters''' - additional information relevant to certain protocols, for example, a page number in a PDF document.
+* '''[[Protocols|Protocol]]''' - the type of the Source.
+* '''Name''' - the name of the annotation.
+* '''Tags''' - terms or phrases used to categorize annotations. Tags are separated by '''","'''
+* '''Override''' - checkbox is checked if an implicit, automatically generated annotation is being overridden by the annotation in this list entry. If this list entry is itself an implicit annotation, this column shows the automatic annotation [[Image:automatic annotation icon]] icon. Override is defined only for annotations on classes.
+
+
+
+
+{{note|EIS ignores any parameters in '''Parameters''' which are not used by the '''protocol''' specified in the entry. }}
+
+
+{{tip| Clicking on title of each column sorts the list based on the values in that column. }}
+
+
+==Opening Resources==
+
+The most straightforward way of opening a resource from the Information tool is to select the annotation containing the resource and click the "Go to" button on the status bar below the annotation list.
+
+The resource associated with a particular annotation can also be opened by double-clicking on the annotation in the Information Tool list. Alternatively, you can use the arrow keys to highlight the annotation in the Information Tool list and then press enter. EIS opens the resource associated with the annotation using the external tool for the resource's protocol. So, for example, URI resources will be opened in the default web browser.
+
+While using EiffelStudio, pressing '''F1''' while the cursor is in the editor pane will access annotations associated with the Eiffel object that is currently shown in the editor pane. If only one annotation is available, then its resource is automatically opened by EIS. If more than one annotation is available, the '''Select help document''' dialog box (see Figure 2) appears providing the name and type of the available resources. You can use the dialog to choose which resources you wish to display.
+
+
+[[Image:select help document dialog]]
+
+Figure 2: The Select Help Document dialog box
+
+
+==Sweeping Information==
+
+Sweeping annotation information will update the Information Tool with current data for all the annotations in the current system. There are two approaches to sweeping information:
+* '''Automatic''' - EIS automatically sweeps information at times when Information tool is visible. On the bottom toolbar, clicking the ''automatic sweeping'' toggle button [[Image:automatic sweeping icon]] to the ''down'' position activates automatic sweeping. Clicking the button back to the ''up'' position disables automatic sweeping.
+* '''Manual''' - Clicking the ''manual sweeping'' button [[Image:manual sweeping icon]] on the bottom toolbar triggers an immediate manual sweep.
+
+The progress bar in the bottom of the tool indicates the progress of a currently executing sweep.
+
+
+==Using Pick-and-Drop with the Information tool==
+
+You can use pick-and-drop with the information tool. If you drop a pebble on the information tree, the annotation list, the "Locate currently edited class/cluster" icon [[Image:EIS locate class or cluster icon]] on the mini-toolbar, or the Info tab [[Image:EIS info tab]], the Information tool will find and display any annotations associated with the dropped pebble. If you drop a pebble on the "Add" button [[Image:EIS add button]] a new entry will be created for the object represented by the pebble. Lastly, dropping a pebble representing a target or cluster on the "Edit EIS auto-node generation property" button [[Image:automatic annotation icon]] will display the automatic node generation dialog for the target or cluster associated with the pebble.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/change-analysis.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/change-analysis.wiki
new file mode 100644
index 00000000..808b6c94
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/change-analysis.wiki
@@ -0,0 +1,32 @@
+[[Property:title|Change Analysis]]
+[[Property:weight|0]]
+[[Property:uuid|a503cf13-6374-9932-5ee2-a69b363e6701]]
+[[Image:information tool change analysis]]
+
+The information tool can track changes in an Eiffel system or external resources side, and potentially affected items on either side are listed.
+
+== Major Features ==
+* '''Affected target:''' List of elements of the Eiffel system that would be affected by a change in external resources.
+* '''Affected source:''' List of external resources that might be affected by changes in the Eiffel system.
+* '''Change acknowledgement:''' Acknowledgement of the changes which will be ignored with no further actions.
+
+== Typical Work Flows ==
+
+=== Affected external resources caused by a change in the Eiffel system ===
+# Open a class, add an Information entry with an external resource in the class.
+# Start working on that class, save it at as you normally do on regular basis.
+# Open the information tool, go to Affected source item in the left tree.
+# Check the list of external resources that might be affected by last changes.
+# Acknowledge the changes once you have updated the external resource accordingly (possibly no change is required in the case of simple system changes).
+
+=== Affected items in the Eiffel system caused by an external resource change ===
+# Open a class, add an Information entry with an external resource in the class.
+# Start working on that external resource, save it at as you normally do on regular basis.
+# Open the information tool, go to Affected target in the left tree.
+# Check the list of classes that might be affected by last changes of the external resource. (You may need to click on the "sweep the system now." button to get a full list if auto-sweeping is not enabled.)
+# Acknowledge the changes once you have updated the Eiffel system accordingly (possibly no change is required in the case of a simple edit in the external resource).
+
+== Current limitations ==
+The tracking of external resource changes is limited to external resources that are local files. If an external resource is a URL, it will not detect any potential changes done at that URL.
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/index.wiki
new file mode 100644
index 00000000..203ca86d
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/index.wiki
@@ -0,0 +1,10 @@
+[[Property:title|Information Tool]]
+[[Property:weight|0]]
+[[Property:uuid|26e2c799-b48a-c588-cdf1-dd47b1994b09]]
+The Information tool is an EiffelStudio tool that helps you create outgoing annotations in your Eiffel projects. Read more about using the Information tool on the following pages.
+
+
+[[Image:information tool v71|1000px]]
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/protocols.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/protocols.wiki
new file mode 100644
index 00000000..bd89396a
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/protocols.wiki
@@ -0,0 +1,21 @@
+[[Property:title|Protocols]]
+[[Property:weight|2]]
+[[Property:uuid|69b4d9d4-570e-e7ac-087b-88449a608d0b]]
+EIS supports following protocols:
+* URI: This protocol does not need to specified. By default, it will be taken if nothing is specified or unknown protocol is specified.
+
+* PDF: PDF protocol supports three parameters: "type" "page" and "nameddest". (Windows only)
+** '''type''' - "file" is used to open PDF files in PDF reader. Otherwise in a browser.
+** '''page''' - a page number at which to open a document.
+** '''nameddest''' - a named destination at which to open a document.
+
+* DOC: Represents a Microsoft Word document.
+** '''bookmark''' - Name of a Microsoft Word document bookmark.
+
+The list of currently supported protocols is always available in a drop-down menu associated with entries in the '''Protocol''' column of the [[Browsing information|Information tool]]'s annotation list.
+
+
+{{note|The status of supported protocols described above is as of EiffelStudio version 7.1. }}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/variable-definition.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/variable-definition.wiki
new file mode 100644
index 00000000..2ea1f419
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/eis-outgoing/information-tool/variable-definition.wiki
@@ -0,0 +1,38 @@
+[[Property:title|Variable Definition]]
+[[Property:weight|3]]
+[[Property:uuid|7705ab33-a505-7711-a106-5fedd2e1040e]]
+==Sources of variables==
+
+EIS supports following types of variables which can be used in '''Source''' of annotation list.
+* EiffelStudio installation built-in variables
+** ISE_WIKI = http://dev.eiffel.com
+** EIFFELROOM = http://www.eiffelroom.com
+** ISE_DOC = http://docs.eiffel.com
+** ISE_DOC_UUID = http://doc.eiffel.com/isedoc/uuid
+** ISE_DOC_REF = http://doc.eiffel.com/isedoc/eis
+
+* Other EiffelStudio built-in variables
+** system_path = The path of the system being annotated
+
+* Context related built-in variables. These variables can be used in specific context. For instance, '''feature_name''' refers to the name of the feature with which an annotation is associated.
+** feature_name
+** class_name
+** group_name
+** target_name
+
+{{note|A context related built-in variable is only valid in a annotation that is associated with a component to which the variable name refers. For example, '''feature_name''' has no effect if used in a '''target''' component.}}
+
+* Individual system or library preference variables. This kind of variable is defined in your Project Settings. Manage these variables by following this path in the System tree on the left of the Project Setting dialog:
+
+ System -> Target -> Advanced -> Variables
+
+
+* Environment variables. Variables defined in the operating system environment.
+
+
+==Accessing variables from the Information tool==
+
+When you use the Information tool, the list of all available variables is available through auto-completion when you are typing in an entry under the '''Source''' column of the annotations list. You may either type the dollar-sign '''"$"''' or '''"Ctrl + Space"''' to invoke auto-completion. What you will see in this case is the entire list of available variables, as enumerated above. Bear in mind that this includes all environment variables defined in your operating system environment, which means that some of the entries shown would not be appropriate for use as variables for EIS purposes.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/index.wiki
new file mode 100644
index 00000000..a7aee410
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-information-system/index.wiki
@@ -0,0 +1,32 @@
+[[Property:title|Eiffel Information System]]
+[[Property:weight|-2]]
+[[Property:uuid|7e0394e1-cb31-fae3-79b6-9d1847ef8db7]]
+==Introduction==
+
+The Eiffel Information System (EIS) provides a unified mechanism for linking development objects - e.g., classes and features - of Eiffel systems with '''external''' information resources. External means information other than Eiffel program texts. Usually the tools associated with external resources are separate from Eiffel, such as web browsers. Examples of external information resources and possible corresponding external tools are:
+* Resource: Web page -- External Tool: default web browser
+* Resource: PDF document -- External Tool: Adobe Acrobat
+* Resource: Microsoft Word document -- External tool MS Word
+
+EIS is also intended to be the standard mechanism for obtaining help on Eiffel and EiffelStudio, replacing previous solutions. In that case, external tools may actually be Eiffel tools.
+
+EIS makes two mechanisms available to users: '''Outgoing''' (from Eiffel to external tools), '''Incoming''' (the reverse).
+
+Examples of outgoing mechanisms include:
+* Associating EIS '''annotations''' containing references to external resources with certain Eiffel components of Eiffel systems.
+* Automatically opening the corresponding external tool to display or edit information associated with an annotation.
+* Listing all external information (in a class, cluster or entire system) corresponding to a specified tag.
+
+Examples of incoming mechanisms include:
+* For supported tools, selecting external information linked to an Eiffel developer object and having EiffelStudio open automatically and targeted to that object.
+
+==EIS supports the Eiffel method==
+
+EIS plays an important role in the Eiffel software development method. Eiffel's focus is software quality. One aspect of the Eiffel method that contributes to software quality is the '''Single Product Principle''' as described in the [[ET: The Software Process in Eiffel#The Single Product Principle|Eiffel Tutorial]]: viewing the software as a single product which is expected to be repeatedly refined, extended, and improved.
+
+The bulk of the Single Product Principle is made possible by the seamless nature of the Eiffel method and the elegant design of the Eiffel programming language. Eiffel allows multiple views of the single software product that are appropriate to certain phases of development and readable by those fulfilling certain development roles. For example, potential reuse consumers use the '''contract''' views to explore class specifications. Also in support of seamlessness and the single product is a single integrated set of tools, the EiffelStudio IDE, working across the entire lifecycle, providing, for example, automatic extraction of the contract views just mentioned. The EiffelStudio graphical views of software (BON and UML, as produced by the Diagram Tool) directly support these ideas through their "roundtrip style". That is, changes to the diagram immediately generate code and changes to the code are reflected in the diagram. Of course documents in other formalisms, for example software requirements specifications (SRS), remain necessary for human consumption; but they should be closely linked to the core project asset, the Eiffel code.
+
+Within EiffelStudio, EIS effects this by ensuring that any documents existing outside the software itself can be linked to the software text and vice versa. For example, if an external software requirements document exists, say in PDF format, it is essential to record precisely the associations between elements in the requirements document and the portion of the software text in which those elements are realized. Perhaps the requirements document contains a statement: "Whenever the tank temperature reaches 50 degrees, the valve shall be closed". In the software text, there will be some feature, for example, monitor_temperature in the class TANK, reflecting this requirement. The requirements statement and the software feature should be linked to one another. This is to ensure that dependencies appear clearly, and that any change in either the requirements or the code triggers the corresponding update to the other side. This is what EIS provides.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-analyzing-results.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-analyzing-results.wiki
new file mode 100644
index 00000000..0058d695
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-analyzing-results.wiki
@@ -0,0 +1,21 @@
+[[Property:title|Eiffel Inspector - Analyzing Results]]
+[[Property:link_title|Analyzing Results]]
+[[Property:weight|-13]]
+[[Property:uuid|e4670791-7885-b9a0-6a1c-0d9611eb5f5d]]
+= Sorting and Filtering =
+
+The list of rule violations can be sorted by any column by clicking on its header. Click it again to switch the sorting direction. You can hide and show errors, warnings, suggestions, and hints by clicking the corresponding toggle buttons in the middle of the toolbar. Typing in the text field on the right side of the panel toolbar filters the results. The filter takes into consideration the title, the ID, the affected class, and the description of the rule. It is a live filter that filters while you are typing. Press the button on the right of the text field to clear the filter and display again all violations.
+
+[[Image:CA Simple Analysis|center|978px|The Results of code analysis as a list of rule violations (example)]]
+
+= Navigating Through the Results =
+
+In the list of rule violations, formatted elements like classes and features are clickable and draggable like anywhere else. In order to navigate to a specific rule violation just double-click the corresponding row. The corresponding class will be opened (if needed) and the cursor will jump to the exact location of the rule violation (some violations do not have an exact location because they refer to a whole class). You can also navigate through the results using the '''Go to next rule violation''' and '''Go to previous rule violation''' buttons on the right side of the panel toolbar.
+
+= Fixing Rule Violations =
+
+[[Image:CA Fixing Rule Violation|center|484px|Fixing a rule violation.]]
+
+Some violations provide automatic fixing. Right-clicking the corresponding row in the tool panel opens a context menu where you can choose from one or more possible fixes. When you click on ''Fix: ...'' the source code will be adapted and the project will be recompiled.
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-customization.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-customization.wiki
new file mode 100644
index 00000000..87b4daf5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffel-inspector/eiffel-inspector-customization.wiki
@@ -0,0 +1,51 @@
+[[Property:title|Eiffel Inspector - Customization]]
+[[Property:link_title|Customization]]
+[[Property:weight|-12]]
+[[Property:uuid|ed86093e-fed0-04b8-6fd4-b05d5de849fc]]
+= General Preferences =
+
+The ''Preferences'' button in the toolbar opens a dialog containing all preferences for the Eiffel Inspector. There you can enable and disable all rules of a certain severity, you can choose colors for the results, and there are many preferences that control the behavior of individual rules.
+
+[[Image:CA Preference Dialog|center|640px|Preferences]]
+
+= Rule-specific Preferences =
+
+The rule-specific preferences are located in the ''Rules'' subfolder. Two preferences can be found for every rule: ''Enabled/disabled'' and the ''severity score''. Some rules have additional integer or boolean preferences like thresholds.
+
+[[Image:CA Rule Preferences|center|572px|Rule-specific Preferences]]
+
+= Exporting and Importing Preference Profiles =
+
+Using the buttons in the preferences dialog one can export these preferences to an XML file or import them. This can be used for creating profiles that stretch across multiple machines. Just set the desired preferences on one machine, export them to a file, distribute this file, and import it.
+
+{{note| The Eiffel Inspector preferences are separate from the general EiffelStudio preferences. Pressing ''Restore Defaults'', ''Import ...'', or ''Export ...'' ''only'' affects preferences for the Eiffel Inspector.''}}
+
+= Class Options =
+
+There are cases in which you might want to customize the Eiffel Inspector for ''parts of your code'' only. The Eiffel Inspector provides a way to set options ''per class''. You can exclude a class from being checked by certain rules. Also you can declare a class to be a ''library'' or a ''non-library'' class. All class-wide options for the Eiffel Inspector are set in the ''note clause'' (after the ARRAY [INTEGER], EiffelStudio will offer you templates that work on that array (the “target”).
+* '''Targetless''' templates, also called "global", are applicable in any context, without a target.
+
+Whether targeted or targetless, a template can be a fixed pattern or have '''arguments''' which enable you to parameterize to your needs.
+
+
+= 2. How do I use templates in EiffelStudio? =
+
+Code templates are part of EiffelStudio’s code completion mechanism. Code completion lets you choose a code template at the same place where it offers you features to call, typically after you type a dot character “.” after the name of an applicable local variable. attribute or function
+
+
+==Targeted templates==
+When you type a dot character “.” after the name of an applicable target, a menu appears:
+
+[[Image:target_template_1_0]]
+
+Figure 1. Auto-completion with code template option
+
+Except for the first one in this example, the entries of this menu list the ''features'' applicable to the current target. But if you are interested in templates, select the first entry, which only appears if there are any applicable templates, and says “Show templates (Ctrl+Space)”
+
+[[Image:target_template_1_1]]
+
+Figure 2. Auto-completion gives list of code templates
+
+As suggested, you can also type Control-space again to get the same effect. (Click "Show features" if you decide to go back to showing the applicable features, rather than templates.)
+
+If you find a template that you like, just select it.
+
+
+== Targetless templates ==
+It is also possible to use code templates without a target. When you type Control-Space, if there are any applicable targetless templates, the first entry says “Show templates (Ctrl+Space)”:
+
+[[Image:targetless_template_1_3]]
+
+If you click this "Show templates"
+
+Figure 3. Targetless auto-completion with code template option
+
+When you insert a template into your code, it will often have some highlighted fields, corresponding to the template arguments, for example, the lower and upper bounds of the part of an array or ("slice") whose minimum you seek:
+
+[[Image:targetless_template_1_4|680px]]
+
+Figure 4. Targetless auto-completion with code templates option list.
+
+
+
+== Filling in arguments ==
+
+Some templates let you parameterize their code by filling ''arguments'' in a highlighted field. Initially, the field contains the corresponding argument's default value; you can leave that default, or override it with your own choice. If the template uses the argument several times, you can fill in the value in any of the corresponding fields, and all others will automatically be updated.
+
+In the menu of targeted array templates shown above, the template slice_minimum is an example of template with arguments. It looks like this:
+
+[[Image:target_template_with_input_parameters_1_0|680px]]
+
+Figure 5. A template with arguments
+
+This template, used to compute the minimum of a part, or "slice", of an array, has two arguments, representing the bounds of the slice. If you select the template, you will see two highlighted fields, initialized with the respective default values default: "target.lower and target.upper" of these arguments:
+
+[[Image:target_template_with_input_parameters_1_1]]
+
+Figure 6. Inserted template code, with highlighted argument fields
+
+The reason for these defaults is that much of the time you will want the minimum of the ''whole'' array. If you are happy with that default, just leave the fields as they are But if you just need a different slice, for example from index 5 to index 10, just type the desired values in the corresponding fields:
+
+[[Image:target_template_with_defaults_overridden_1_1]]
+
+Figure 7. Inserted template code, with highlighted argument fields
+
+Note that each argument appears in two different fields; if you edit any of these fields, the other will get updated automatically.
+
+
+= 3. Can I define my own templates? =
+
+It is very easy to define a template. It is all done in Eiffel, of course. You simply define a class that inherits from TEMPLATE, with any number of routines, each of which introduces one template, applicable to targets of the corresponding type. If the routine has arguments, those will be the arguments of the template.
+
+== Where does EiffelStudio find the templates? ==
+
+To offer templates as part of code completion, EiffelStudio looks in two locations:
+* Standard templates, found in:
+** Linux: $ISE_EIFFEL/studio/templates/code
+** Eiffel: %ISE_EIFFEL%/studio/templates/code
+* User-defined templates, which you can add at:
+** Linux: ~/.es/eiffel_user_files/16.11/templates/code
+** Windows: C:/Users/your_user_name/Documents/Eiffel User Files/16.11/templates/code
+
+If you define templates for your own specific use, store them in the second location.
+
+== Defining a targeted template ==
+Here is how we defined the template used in the above targeted example:
+
+
+class ARRAY_TEMPLATE [T -> COMPARABLE] inherit
+
+ TEMPLATE [ARRAY [T]]
+
+feature -- Templates
+
+ maximum: T
+ -- Maximum of `target' array.
+ note
+ tags: "Algorithm, Maximum, ARRAY"
+ do
+ across target as element loop
+ Result := Result.max (element.item)
+ end
+ end
+
+ slice_minimum (low, high: INTEGER): T
+ -- Minimum of `target' array, where the interval is defined by default by target.lower |..| target.upper.
+ note
+ title: "Array slice minimum"
+ tags: "Algorithm, Minimum, ARRAY"
+ default: "target.lower, target.upper"
+ do
+ Result := low
+ across low |..| high as i loop
+ Result := Result.min (target [i.item])
+ end
+ end
+end
+
+
+This class defines two targeted templates: ''maximum'' for the maximum of an entire array, and ''slice_minimum'' for the minimum of some contiguous part of that array.
+
+To specify the target type, here arrays, just use it as the actual generic parameters of TEMPLATE (which is a generic class). Here indeed, the the definition starts as
+
+
+ class ARRAY_TEMPLATE [T -> COMPARABLE] inherit
+
+ TEMPLATE [ARRAY [T]]
+
+
+
+The correspondence between what you write in the template definition and what appears in EiffelStudio, as shown in previous sections, is straightforward:
+
+# The list of templates will display the name of the feature, e.g. slice_minimum
+# It will use the header comment as explanation in the tooltip (always write a header comment!)
+#.On selection of a template, EiffelStudio will insert the template’s body into the code.
+# Argument occurrences will appear as fields for the user to fill in.
+
+== Defining a targetless template ==
+
+
+For a targetless template, just just use TEMPLATE without a generic parameter:
+
+
+class TEMPLATE_READ_FILE_GLOBAL
+
+inherit
+
+ TEMPLATE
+
+feature -- Templates
+
+ read_file_line_by_line
+ -- Read a file line by line., for binary files you can use {RAW_FILE}.
+ note
+ title: "Read a file line by line"
+ tags: "Algorithm, Read, Files, Path"
+ local
+ l_file: FILE
+ l_path: PATH
+ do
+ create l_path.make_current
+ create {PLAIN_TEXT_FILE} l_file.make_with_path (l_path)
+ if l_file.exists and then l_file.is_readable then
+ l_file.open_read
+ from
+ until
+ l_file.end_of_file
+ loop
+ l_file.read_line
+ -- Use entry `l_file.last_string` such as `io.put_string (l_file.last_string); io.put_new_line`
+ end
+ l_file.close
+ else
+ io.error.put_string ("Could not read, the file:[" + l_path.name + " ] does not exist")
+ io.put_new_line
+ end
+ end
+end
+
+
+
+=4. Sharing code templates=
+You can share your code templates using Github.
+
+== Fork the project ==
+Clone your fork, and configure the remotes.Eiffel Studio github repository at: [https://github.com/EiffelSoftware/EiffelStudio https://github.com/EiffelSoftware/EiffelStudio ]
+
+# Clone your fork of the repository into the current directory: git clone https://github.com//
+# Navigate to the newly cloned directory: cd
+# Assign the original repository to a remote one called "upstream": git remote add upstream https://github.com//
+
+If you cloned a while ago, get the latest changes from upstream:
+
+
+git checkout
+git pull upstream
+
+
+
+== New branch ==
+Create a new topic branch (off the main project development branch) to contain your new code template
+git checkout -b
+Commit your changes in logical chunks. Before to commit double check [http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html Tim Pope's A Note About Git Commit Messages].
+Use Git's interactive rebase feature to tidy up your commits before making them public.
+
+Locally merge (or rebase) the upstream development branch into your topic branch:
+
+git pull [--rebase] upstream
+
+Push your topic branch up to your fork:
+
+git push origin
+
+
+==Pull request==
+Open a pull request with a clear title and description
+
+== Code template review ==
+For your work to be integrated into the project, the maintainers will review your work and either request changes or merge it.
+
+
+=Associating a user interface with a template definition=
+The following image shows the relationship between the template definition and how they will look in the GUI.
+
+[[Image:target_template_1_2|780px]]
+Figure 8. UI and template relationship.
+
+
+* Feature name or metadata `title` if present will be used as the value in the list of completion possibilities.
+* Feature comment will be used in the tooltip description of a selected template.
+* Feature body will be used in the tooltip code preview.
+
+
+
+
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-editor/automatic-completion/class-name-auto-complete.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-editor/automatic-completion/class-name-auto-complete.wiki
new file mode 100644
index 00000000..368654b0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-editor/automatic-completion/class-name-auto-complete.wiki
@@ -0,0 +1,68 @@
+[[Property:title|Class name auto complete]]
+[[Property:weight|3]]
+[[Property:uuid|0f11a078-7dab-54d1-b624-4c04476564a5]]
+==Overview==
+The EiffelStudio editor will complete class names automatically. This means, for example, when you type in the editor pane:
+
+ a_variable_name: LI
+and then triggers the class name auto-completion, one of two things will happen:
+* If there is only one accessible class name that begins `LI', then that class name will be automatically placed in the editor pane at the cursor.
+* If there is more than one such class name, the editor will propose a list of possible valid class names, as seen in Figure 1.
+
+Class name auto-completion can be triggered by pressing Ctrl+Shift+Space or by following the [[Edit menu commands|edit menu]] path:
+
+Edit --> Advanced --> Complete Class Name
+
+
+Class name auto-completion is most commonly used in the Editor Pane. But the same functionality is also available in other areas of EiffelStudio, for example:
+* The "Entry:" text box on the New Class tool.
+* Expressions in the editable grid of the Watch tool
+* "Class name:" in the New Expression dialog of the Watch tool.
+* "Edit Contract" in the Contract tool
+* "Add New Contract" in the Contract tool
+LI". So, you can think of the auto-completion as a search for class names using the characters you type followed by a wild card character, the asterisk ('*'). Of course, you don't have to put the asterisk at the end, it's always there by implication. Once you've triggered the auto-completion, you can however use the wild card character in the middle of a string, like this:
+
+ a_variable_name: LI*R
+
+which would list all class names starting with "LI" and containing the character 'R' appearing at some point after the "LI".
+
+
+{{note|Using the wild card character with auto-completion is valid only '''after''' auto-completion is triggered.}}
+
+
+When the list appears, the first list item will be selected. You can select a class name from the list by double-clicking a name in the list or by using the keyboard Up and Down buttons to navigate the list, then pressing Enter to select a highlighted class name. You can also continue to type characters and the list will automatically narrow, provided that you have non-matching entries filtered out (see [[#Auto-completion list display options|Auto-completion list display options]] below.)
+
+To validate your choice, press Enter.
+
+If there is no selected item when you validate, then the content of the text you have type will be inserted.
+
+The auto-completion can be cancelled by clicking outside the window or pressing Esc.
+
+
+[[Image:editor-class-auto-completion-window]]
+
+Figure 1. The class name auto-completion window
+
+===Auto-completion list display options===
+
+At the bottom of the auto-completion window you will find a row of icons labeled "Options:". These icons help you control which choices are presented to you and the format of their presentation.
+
+Each icon can be toggled between an "up" position and a "down" position by clicking on it. You can also toggle the option icons up and down by using the function keys F1 through F7.
+
+Note that not all of the options are applicable to class name auto-completion. Some apply only to feature name completion or to both class names and feature names.
+
+* [[Image:hide non-matching entries icon]] (F1) Hide non-matching entries.
+* [[Image:query return type icon]] (F2) Show query return types.
+* [[Image:feature signatures icon]] (F3) Show feature signatures.
+* [[Image:disambiguated name icon]] (F4) Show disambiguated names. (Applicable to .NET overloaded feature names.)
+* [[Image:obsolete items icon]] (F5) Show obsolete items.
+* [[Image:show descriptions icon]] (F6) Show description of selected item in the ''tool tip'' area at the bottom of the window. (See Figure 1)
+* [[Image:remember list size icon]] (F7) Remember the size of the completion list between triggerings.
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-editor/automatic-completion/feature-call-auto-complete.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-editor/automatic-completion/feature-call-auto-complete.wiki
new file mode 100644
index 00000000..1fa622ce
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-editor/automatic-completion/feature-call-auto-complete.wiki
@@ -0,0 +1,82 @@
+[[Property:title|Feature call auto complete]]
+[[Property:weight|2]]
+[[Property:uuid|40ae30a6-c033-dae7-8dae-2569e7ba0adc]]
+==Overview==
+
+EiffelStudio editor provides automatic help for completing feature calls.
+
+With the default EiffelStudio preferences, feature call auto-completion occurs automatically when you type a dot ('.') character after a feature name.
+
+This means, for example, that in the Editor pane when you type:
+
+ my_string.
+the editor will propose a list of possible valid feature names from which to choose, as seen in Figure 1.
+
+Feature call auto-completion can also be triggered:
+
+# By pressing crtl+space
+# By following the edit menu path:
+
+
+Edit --> Advanced --> Complete word
+
+
+
+Feature call auto-completion is most commonly used in the Editor pane. But the same functionality is also available elsewhere in EiffelStudio, for example:
+
+* Expressions in the editable grid of the Watch tool.
+* "Expression" in the New Expression dialog of the Watch tool.
+* "Condition" in the Breakpoints dialog
+
+
+==The feature call auto-completion window==
+
+Using the example above, when auto-completion is triggered, the feature call auto-completion window will pop up and display a list of feature names which can be applied in the current context.
+
+
+[[Image:editor feature auto-completion window]]
+
+Figure 1. The feature auto-completion window.
+
+
+When the auto-completion window appears, the first item in the list, if any, will be selected. To complete your code with the selected item, press "Enter" or "Ctrl+Space". To choose another item, use keyboard Up and Down arrows or the mouse.
+
+You can also continue typing characters and the list will automatically be narrowed provided that you have non-matching entries filtered out (see '''Auto-completion list display options''' below). So, you can think of the auto-completion as a search for feature names using the characters you type followed by a wild card character, the asterisk ('*'). Of course, you don't have to put the asterisk at the end, it's just always implied. Once you've triggered auto-completion, you can however use the wild card character in the middle of a string, like this:
+
+
+ my_string.a*int
+
+which would narrow the list to all feature names starting with "a" and also containing the string "int".
+
+To validate your choice, press "Enter" or "Ctrl+Space".
+
+If there is no selected item, the content of the text you have typed will be inserted.
+
+The auto-completion can be cancelled by clicking outside the window or pressing Esc.
+
+==Entering routine arguments==
+
+After you have selected a feature, if the feature is a routine requiring arguments, the argument prototypes will be included in the generated feature text, and the text for the first argument will be selected, as in Figure 2.
+
+
+[[Image:feature_call_auto-complete_example_1]]
+
+Figure 2. Auto-completion of a routine with arguments.
+
+
+Because the text for the first argument is already selected, you can go ahead and type a value for that argument. When you've completed the first argument, press Tab, and the next argument will be selected, and you can type a value for it. When you Tab after entering the final argument, the cursor will be positioned after the right parenthesis, so you are ready to move on.
+
+==Auto-complete list display options==
+
+At the bottom of the auto-completion window you will find a row of icons labeled "Options:". These options help you control which choices are presented to you and the format of their presentation. The options are described in the [[Class name auto complete#Auto-completion list display options|section on class name auto-completion]].
+
+
+{{tip|The following tips can help you get the most out of feature call automatic completion:
+View --> Toolbars
+
+
+In the figure below, all four toolbars are visible.
+
+
+[[Image:standard-toolbars]]
+
+
+The standard buttons toolbar and the project toolbar are docked next to each other on the same toolbar line. So the standard buttons toolbar is indicated here:
+
+[[Image:standard-buttons-toolbar]]
+
+
+and the project toolbar is indicated here:
+
+
+[[Image:project-toolbar]]
+
+
+The address toolbar shows the currently targeted class and feature, and has button-holes for advanced views:
+
+
+[[Image:address-toolbar]]
+
+
+The refactoring toolbar has button-holes for Pull-Up and Rename Class/Feature [[Refactoring|refactoring actions]]:
+
+
+[[Image:refactoring-toolbar]]
+
+
+{{note|For each toolbar, it is possible to choose which buttons are displayed and which ones are not. See the [[Toolbar customization|Toolbars customization page]] for more information. Also, you can change the location of the toolbars by undocking and/or redocking them. See more at [[Customizing the tools layout and toolbars]].}}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-preferences/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-preferences/index.wiki
new file mode 100644
index 00000000..7791988f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-preferences/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|EiffelStudio Preferences]]
+[[Property:weight|1]]
+[[Property:uuid|780757a6-f04a-97d4-5069-d22328e6492f]]
+Many of EiffelStudio's properties may be customized. A tool has been designed to help you set your preferences.
+if
+next_line_of_code
+
+if then
+
+end
+next_line_of_code
+
+
+as you press Space just after typing if.
+
+To make this happen, you should define the "Customized auto complete (Space after keyword was typed)" string for if as :
+
+
+$cursor$ then%N$indent$%T%N$indent$end
+
+
+First, EiffelStudio editor has to insert a blank space after if. The string begins therefore by a blank space. then is inserted after the cursor position. then. if plus a tabulation. end will be inserted in this new line with the same indentation as if.
+
+
+2) You want the lines of code :
+
+
+end
+next_line_of_code
+
+
+to become:
+
+
+end
+
+next_line_of_code
+
+
+as you press Return just after typing end.
+
+To make this happen, you should define the "Customized auto complete (Return after keyword was typed)" string for end as :
+
+
+%B%B%B%Bend%N$indent$%B$cursor$
+
+
+The four ''%B'' will remove end plus one character before end (the tabulation character). end will be inserted at this new position. end will have been inserted.
+
+
+{{note|EiffelStudio editor can insert spaces instead of tabulation when you use special character ''%T''. This is set in [[General Editor Preferences|another section of the preferences]] .}}
+
+{{seealso|CTRL, ALT or SHIFT have to be pressed at the same time. You will find a combination of all in each shortcut subfolder. The customizable shortcuts are:
+* Autocomplete: Shortcut to trigger the feature call automatic completion. The default key combination is CTRL+SPACE.
+* Class name autocomplete: Shortcut to trigger the class name automatic completion. The default key combination is CTRL+SHIFT+SPACE.
+* Search selection: Shortcut to launch a search of the currently selected item. If there is no selected item, the editor will look for the next occurrence of the last searched pattern. The default key combination for this command is F3.
+* Search again: Shortcut to move to the next occurrence of the searched pattern. If the shortcut is the same as for Search Selection, the effect of the command will be to search for the next occurrence of the currently searched pattern unless something else is selected in the editor. In that case, the editor will look for the next occurrence of the selected text. The default key combination for this command is F3.
+* Search backwards: Shortcut to move to the previous occurrence of the searched pattern. The default key combination for this command is SHIFT+F3.
+* Show search panel: Shortcut to make the search panel appear if it is not displayed and to give the focus to the "Search for" field. The default key combination for this command is CTRL+F.
+* Show search and replace panel: Shortcut to make the search panel with the "Replace with" field appear if it is not displayed. The focus will be given to the "Search for" field. The default key combination for this command is CTRL+H.
+
+
+{{note|You should avoid using key combinations made of only ALT and another key as they are reserved for menu shortcuts. }}
+
+
+{{Tip|You may use combinations made of only one key to create very fast shortcuts, for example with the function keys. To know what string corresponds to a given key, you can look up in the EV_KEY_CONSTANTS of EiffelVision2.The `key_strings` table links keys with a string representation. }}
+
+
+There are three other categories in the shortcut preferences. These can be used to automatically insert a user-defined string in the editor. If you find yourself typing some strings very often, these preferences can be handy.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-preferences/preferences-reference/eiffelstudio-tools-preferences/context-tools.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-preferences/preferences-reference/eiffelstudio-tools-preferences/context-tools.wiki
new file mode 100644
index 00000000..8ca20cc3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-preferences/preferences-reference/eiffelstudio-tools-preferences/context-tools.wiki
@@ -0,0 +1,111 @@
+[[Property:title|Context Tools]]
+[[Property:weight|1]]
+[[Property:uuid|40300782-f154-3a13-acd4-ee48184be315]]
+This category gathers the preferences related to context tools.
+{| border="1"
+|-
+| '''Label in the preferences window'''
+| '''Complete Description'''
+|-
+| Default class formatter index
+| Class view format that is selected by default (see table below for available format indexes).
+|-
+| Default feature formatter index
+| Feature view format that is selected by default (see table below for available format indexes).
+|-
+| Excluded indexing items
+| Indexing items that need not be included in formatted texts.
+|-
+| Formatters history size
+| Number of cached formatted text in history.
+|-
+| Show all callers
+| Show all callers (as opposed to local callers) in `callers` form.
+|}
+
+
+Class views indices:
+{| border="1"
+|-
+| '''Index'''
+| '''Class view'''
+|-
+| 1
+| Clickable view
+|-
+| 2
+| Flat view
+|-
+| 3
+| Contract view
+|-
+| 4
+| Interface view
+|-
+| 5
+| Ancestors
+|-
+| 6
+| Descendants
+|-
+| 7
+| Clients
+|-
+| 8
+| Suppliers
+|-
+| 9
+| Attributes
+|-
+| 10
+| Routines
+|-
+| 11
+| Deferred features
+|-
+| 12
+| Once routines and constants
+|-
+| 13
+| External features
+|-
+| 14
+| Exported features
+|}
+
+
+Feature views indices:
+{| border="1"
+|-
+| '''Index'''
+| '''Feature view'''
+|-
+| 1
+| Basic text view
+|-
+| 2
+| Flat view
+|-
+| 3
+| Callers
+|-
+| 4
+| Implementers
+|-
+| 5
+| Ancestor versions
+|-
+| 6
+| Descendants versions
+|-
+| 7
+| Homonyms
+|}
+
+
+{{seealso|ANY, and then assigning `s.to_c` to `a` and passing `$a`.
+{{Caution|Turn this option on only if you have advanced knowledge of the garbage collector internals, because using this syntax in some situations could lead to bugs that are very hard to trace. }}
+* Automatic Backup: generate a backup of the class and configuration files during recompilation?
+* Check VAPE: Enforce VAPE validity constraint: lets you disable type checking for VAPE errors in preconditions, which correspond to insufficiently exported features used in preconditions (ETL 2nd edition page 122).
+* Check for Void target: Should "Feature call on Void target" exceptions be raised?
+* Console Application: has no effect on Unix systems. It lets Windows users choose between creating a console application or a GUI application (in which case a console will be created if needed, instead of using the console the program was launched from).
+* Dead Code Removal: should unused code be removed? (C code generation mode only)
+* Dynamic Runtime: makes the generated executable use a shared library version of the runtime on both Windows (DLL) and Unix platforms (.so) that supports shared libraries.(C code generation mode only)
+
+{{note|On Windows, the dynamic run-time is available only if you compile with the Microsoft Visual compiler. }}
+* Enforce unique class names: enforce all class names to be system wide unique?
+* Exception Trace: makes it possible to see a complete exception trace in a finalized application. Because it is adding some code to remember where the application was during the crash it can slow down the performance of your application by a factor of 5% to 30% depending of your platform. (C code generation mode only)
+* Inlining, Inlining Size: enables inlining on Eiffel features that can be inlined, i.e. whose size is less or equal to the specified size in the combo box. The size value given in parameter corresponds to the number of instructions as seen by the Eiffel compiler (for example a := b.f corresponds to 2 instructions). The inlining is very powerful since it can inline a function in all your Eiffel code, without scope limitation as found in C or C++ compilers. (C code generation mode only)
+* Platform: override platform value used for checking conditions, useful for cross compilation
+* Shared Library Definition: lets you specify a `file_name.def' as the file where the Eiffel compiler will look when it tries to generate the exported functions of the shared library you are developing (C code generation mode only). To have more information concerning definition files, see the [[Dynamic library generation]] .
+* Total Order on REALs: Allow a total order on REAL data types? Allows NaN (Not a Number) equal NaN, and NaN to be the smallest number of all.
+* Library Root: Absolute path to use as base for relative paths. If this is not defined, the path to the configuration file will be used.
+
+==.NET Options==
+* Use Optimized Precompile: use an optimized version of a precompile
+* Use Cluster Name as Namespace: See [[Advanced Options|Class and feature naming]]
+* Use Recursive Cluster Name as Namespace: See [[Advanced Options|Class and feature naming]]
+* .NET Naming Convention: See [[Advanced Options|Class and feature naming]]
+* IL Verifiable: in the .NET world, verifiability is important. This is the only way to ensure that an application is not going to crash or to crash your system by accessing not authorized memory locations. Due to some semantic differences between Eiffel and.NET, our code generation is not always verifiable for performance reasons. If you want your code to be verifiable, you need to select this option. The compiler will then generate a code that will be slightly slower.
+* CLS Compliant: mark generated assemblies as CLS compliant
+
+* Metadata Cache Path: Location where information about external assemblies is stored.
+* Classes per Module: Number of classes generated per .NET module during incremental compilation. Increasing this value will slow down the incremental recompilation, but speed up the time to load the assembly while debugging in workbench mode.
+* .NET Runtime Version: .NET version to use
+* Generation Type: generate an exe or a dll (exe is default)
+* Signing Key: specify a cryptographic key for your application so that the compiled assembly can be added to the Global Assembly Cache (GAC). If a non existing filename is chosen, a key will be automatically generated.
+* Force 32bit: on a 64bit machine, forces compilation for 32 bit.
+
+===Class and feature naming===
+
+
+The standard naming conventions for .NET and Eiffel are different. To accommodate this difference Eiffel Studio provides a number of options to the developer, allowing for consistent naming of classes and features within and between .NET systems. To illustrate this we shall consider a system using the EiffelBase library and focus on the CURSOR class. The base cluster is included in the project settings Cluster tab as shown below, where $ISE_EIFFEL is the environment variable pointing to the location of Eiffel on your hard disk.
+
+
+The CURSOR class is located at '$ISE_EIFFEL\library\base\structures\cursors'.
+
+
+* Follow .NET naming guidelines: this option determines whether the generated .NET code uses the Eiffel or .NET naming convention. Using Ildasm, the IL disassembler tool provided with the .NET Framework, we can see the difference between them. The Eiffel naming convention uses uppercase characters for all classes whereas the .NET nomenclature uses the Camel Case style. Note that this option is only available in a non-compiled system. Once the system has been compiled the naming standard is fixed for the project.
+
+No .NET naming guidelines
+
+[[Image:ildasm-no-dotnet-naming]]
+
+.NET naming guidelines
+
+[[Image:ildasm-dotnet-naming]]
+
+
+* Use cluster names and Use recursive cluster names: These options dictate how a class is known to the system. In our CURSOR example there are 4 main scenarios. For a quick overview of all scenarios refer to the table at the bottom of the page. If neither box is selected we just have 'CURSOR' or 'Cursor' (depending on whether the .NET naming guidelines are used), as seen above. If 'Use cluster names' is checked then the cluster name is pre-pended to the class name, so 'CURSOR' now becomes 'base.CURSOR'.
+
+[[Image:use-cluster-names]]
+
+
+
+If 'Use recursive cluster names' is true then the full cluster name is pre-pended to the class name, so it thus becomes 'base.structures.cursors.CURSOR'.
+
+
+
+[[Image:use-full-cluster-names]]
+
+
+
+The final scenario is where a namespace has been defined for the cluster in the Clusters tab of the Project Settings. In this situation the namespace overrides the name of the cluster. In the example below the namespace name 'MyBaseNameSpace' is used so the resulting name is 'MyBaseNameSpace.structures.cursors.CURSOR'.
+
+
+
+[[Image:use-namespace-name]]
+
+
+
+===Naming Scenarios===
+
+This table shows how the class name generation is affected by the naming options using the CURSOR class found in '$ISE_EIFFEL\library\base\structures\cursors' as an example.
+{|
+|-
+| Use .NET naming guidelines
+| Use cluster names
+| Use full cluster names
+| Namespace Name
+| Generated Name
+|-
+| no
+| no
+| no
+| (empty)
+| CURSOR
+|-
+| yes
+| no
+| no
+| (empty)
+| Cursor
+|-
+| no
+| yes
+| no
+| (empty)
+| base.CURSOR
+|-
+| yes
+| yes
+| no
+| (empty)
+| Base.Cursor
+|-
+| no
+| no
+| yes
+| (empty)
+| structures.cursors.CURSOR
+|-
+| yes
+| no
+| yes
+| (empty)
+| Structures.Cursors.Cursor
+|-
+| no
+| yes
+| yes
+| (empty)
+| base.structures.cursors.CURSOR
+|-
+| yes
+| yes
+| yes
+| (empty)
+| Base.Structures.Cursors.Cursor
+|-
+| no
+| no
+| no
+| MyNameSpace
+| MyNameSpace.CURSOR
+|-
+| yes
+| no
+| no
+| MyNameSpace
+| MyNameSpace.Cursor
+|-
+| no
+| yes
+| no
+| MyNameSpace
+| MyNameSpace.CURSOR
+|-
+| yes
+| yes
+
+| no
+| MyNameSpace
+| MyNameSpace.Cursor
+|-
+
+| no
+| no
+| yes
+| MyNameSpace
+| MyNameSpace.structures.cursors.CURSOR
+|-
+| yes
+| no
+| yes
+| MyNameSpace
+| MyNameSpace.structures.cursors.Cursor
+|-
+| no
+| yes
+| yes
+| MyNameSpace
+| MyNameSpace.structures.cursors.CURSOR
+|-
+| yes
+| yes
+| yes
+| MyNameSpace
+| MyNameSpace.Structures.Cursors.Cursor
+|}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/tasks-options.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/tasks-options.wiki
new file mode 100644
index 00000000..0ef1fad6
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/tasks-options.wiki
@@ -0,0 +1,26 @@
+[[Property:title|Tasks Options]]
+[[Property:weight|8]]
+[[Property:uuid|48d23a04-22cc-8676-f163-31c3848e86e7]]
+[[Image:task-options|Tasks dialog]]
+
+It is possible to have a command executed before/after an eiffel compilation.
+Tasks have these properties:
+* Command: command to execute
+* Description: an optional description about the external
+* Working directory: an optional working directory, if nothing is specified, the path to the configuration file will be used
+* Must succeed: does the task have to finish successful for the compilation to continue?
+* Condition: allows the same configuration with tasks to work in different situations (e.g. windows and unix) (see [[General Target Options|conditions]] )
+
+==Examples==
+
+===Windows===
+Execute a command and pause until user presses a key
+{{sample|cmd /c "dir && pause"}}
+
+===Unix===
+Execute a command and pause for 10 seconds
+{{sample|bash -c "ls;sleep 10"}}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/type-mapping.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/type-mapping.wiki
new file mode 100644
index 00000000..7c74f6e5
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/type-mapping.wiki
@@ -0,0 +1,10 @@
+[[Property:title|Type mapping]]
+[[Property:weight|10]]
+[[Property:uuid|0c504ee9-fa7b-f425-0b80-53344618d995]]
+[[Image:mapping-options|Type mappings dialog]]
+
+Type mappings map one class name to another. E.g. STRING can be mapped to STRING_32. So whenever STRING is used in a class, STRING_32 will be used instead.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/variables.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/variables.wiki
new file mode 100644
index 00000000..8caf7775
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/variables.wiki
@@ -0,0 +1,10 @@
+[[Property:title|Variables]]
+[[Property:weight|9]]
+[[Property:uuid|af9e24a2-f3c6-17fd-b490-db5c93c8ccec]]
+[[Image:variable-options|Variables dialog]]
+
+Variables specified here can be used in locations of groups and take precedence over environment variables. They can also be used in conditions.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/warning-options.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/warning-options.wiki
new file mode 100644
index 00000000..ea54fbce
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/advanced-options/warning-options.wiki
@@ -0,0 +1,21 @@
+[[Property:title|Warning Options]]
+[[Property:weight|5]]
+[[Property:uuid|0fa4cc8e-a96f-1044-e2d5-2bdf7884d462]]
+[[Image:warning-options|Warning dialog]]
+* Enabled: globally enabled/disable warnings.
+* Old Syntax: warn about the use of old syntax
+* Same UUID: different configuration files with the same uuid
+* Old Verbatim Strings: warn about usage of old verbatim strings
+* Assignment on Formal/Expanded: warn about assignment attempts on formal or expanded targets
+* Options Unknown Class: class options for an unknown class
+* Onces in Generics: once features in a generic
+* Obsolete Features: features that are obsolete
+* Missing Class Export: features are exported to a class that does not exist
+* Obsolete Classes: classes that are obsolete
+* Incompatible Types Equality: incompatible types in equality comparison
+* Unused Locals: locals that are not used
+* Renaming Unknown Class: renaming was defined for a class that does not exist
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/assertion-options.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/assertion-options.wiki
new file mode 100644
index 00000000..8b6ddaba
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/assertion-options.wiki
@@ -0,0 +1,16 @@
+[[Property:title|Assertion Options]]
+[[Property:weight|2]]
+[[Property:uuid|12520e45-beb4-2200-9e60-91736a3ed092]]
+'''Assertions''' allows you to configure the assertion checking levels for your project. This means that any assertion type marked '''True''' in the '''Assertions''' table will be checked at runtime. So, in the example screen shown below, only preconditions (denoted in the table by '''Require''') will be checked at runtime. All other assertion types will not be checked at runtime.
+
+Each assertion setting can be configured independently of the others.
+
+'''Supplier Precondition''' is a special case. When you develop new software, your software reuses libraries of existing software from other sources, such as the Eiffel Libraries. This library software is often well-established and highly reliable. Setting '''Supplier Precondition''' to '''True''' is a convenient way of setting only precondition checking on libraries, while allowing your own software to be checked to whatever degree you've determined by adjusting the other assertion level settings.
+
+
+[[Image:assertion-options|Condition dialog]]
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/group-options.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/group-options.wiki
new file mode 100644
index 00000000..a7735496
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/group-options.wiki
@@ -0,0 +1,79 @@
+[[Property:title|Group Options]]
+[[Property:weight|3]]
+[[Property:uuid|a321f24d-3158-d123-f2f6-cf7b38172877]]
+This is where you can configure the groups of your project. A group is a container for classes and has some additional options associated. There are five types of groups
+* Cluster: represents a directory or directory structure on the disk with class files in it
+* Override cluster: similar to cluster but overrides classes in other clusters with the same name, can only appear in an application, never in a library
+* Library: a configuration of a library is included, all classes in clusters are accessible
+* Precompile: a [[Melting Ice Technology#Precompiling|precompile]] is similar to a library, but the contents of the library or libraries that make up the precompile have already been compiled and therefore the compilation of your project is faster. There can be only one precompile per project.
+* Assembly: classes in an assembly (.NET code generation mode only)
+
+To add a new group, choose the corresponding add group button or context menu entry and enter a name and location or choose from a list (for assemblies and libraries).
+
+[[Image:group-options|Group dialog]]
+
+==Common Group Options==
+* Name: name of the group
+* Description: an optional description of the group
+* Read Only: in a read only group, classes cannot be modified
+* Location: directory for clusters, assembly file for assemblies and ecf file for libraries and precompiles
+* [[Profiling]]: turn on the Eiffel profiler during the application execution (C code generation mode only). The results can be seen at the end of the execution in the profiler window.
+* [[Tracing|Trace]]: display on the console all the features that are called during the system execution (C generation mode only).
+* .NET Namespace: specify the namespace for this group (.NET code generation mode only)
+* Assertions: [[Assertion Options|assertion level]] for this group
+* Warning: [[Warning Options|warnings]] for this group
+* Debug: [[Debug Options|debugs]] for this group
+
+===Advanced===
+* Condition: group nodes can be [[General Target Options|conditioned]] to only be used under certain conditions.
+* Prefix: name prefix for classes in this group (see [[#Renaming|Renaming]] )
+* Renaming: renamings for classes in this group (see [[#Renaming|Renaming]] )
+* Class Options: options specific for certain classes
+
+==(Override) Cluster Options==
+Clusters can be added as a sub clusters of other clusters, just select the parent cluster before adding the cluster.
+* Recursive: should subdirectories automatically be included?.
+* Hidden: Is this a hidden cluster that can not be used if the system is used as a library?
+* Exclude Rules: [[General Target Options#file_pattern|exclude rules]] for this group
+* Dependencies: specify which groups are checked for classes if the class cannot be found in the group itself
+* Type Mapping: [[Type mapping|mapping]] of types, e.g. STRING is mapped to STRING_32
+* Visible Classes: visible classes (see [[#Visible classes|Visible classes]] )
+
+==Override Cluster Options==
+* Overrides: which groups are overridden by this override (default to all).
+
+==Library/Precompile Options==
+If a library is not read only, the configuration can be directly edited by clicking on the edit library button.
+* Visible Classes: visible classes (see [[#Visible classes|Visible classes]] )
+* Use Application Options: Should this library use options from the application instead of from the library?
+
+==Assembly Options==
+It is possible (but not recommended) to specify an assembly only with GAC information. To do this set the location to ''none'' and specify:
+* Assembly Name: Full name of the assembly as found in the GAC.
+* Assembly Culture: Culture of the assembly.
+* Assembly Version: Version of the assembly.
+* Assembly Public Key Token: Public key token that identifies the asssembly.
+
+==Resolving Conflicts==
+
+There are multiple ways to resolve conflicts between different classes with the same name.
+
+===Renaming===
+
+A class can be renamed with a renaming or a group can have a name prefix which will get added to every class. Outside of this group, the class can then be reached by the renamed name.
+
+===Dependencies===
+
+It is possible to specify which other groups will be searched if a class cannot be found in the current group.
+
+==Visible classes==
+
+If a feature needs to be reachable from [[CECIL]], but the feature is not called from any Eiffel code, then it must be forced to be ''visible'', otherwise it will be removed by the dead code optimizer. This is done by using the ''Visible Classes'' option. In addition it is also possible, but rarely necessary, to rename a class or a feature. In most cases it suffices to make a class completely visible and renaming is unnecessary.
+
+[[Image:visible-dialog|Visible dialog]]
+
+To make a class visible, enter the class name and press ''Add class''. Optionally it is possible to specify a different name under which it is accessible. After a class has been added, it is possible to restrict the access to certain features only. To do this, enter the name of the feature (and optionally a renamed name), select the class it belongs to and click on ''Add feature''.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/index.wiki
new file mode 100644
index 00000000..20b088b0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-project-settings-window/general-target-options/index.wiki
@@ -0,0 +1,58 @@
+[[Property:title|General Target Options]]
+[[Property:weight|1]]
+[[Property:uuid|a50e6063-8b23-0813-26d2-06b25f0a882e]]
+This is where you can configure most general aspects of your target.
+
+Here is what you will see when you switch to the target section in the project settings of the calculator example:
+
+[[Image:target-options|General target properties]]
+
+You can change the name of the target and give it a description. A target can be marked as abstract if it should not appear in the list of targets when opening a configuration.
+
+Targets can inherit from each other, which means they take certain settings from a base target if they don't specify it themselves. Inherited values are displayed with a light grey, overridden values with a light red background. Overridden values can be reset to their inherited value, by right clicking on them and choosing ''Use inherited value'' from the context menu.
+
+An important setting that affects other settings is the compilation type. Here you can specify if you want to generate normal C/byte code (classic application) or if you want to generate .NET code.
+
+With the output name option you can change the name of the generated executable if you want this to be different than the name of the system.
+
+If you want to change the root of your system, you will see a dialog like this:
+
+[[Image:root-dialog|Root dialog]]
+
+You can specify a root class, root cluster and root feature. Both root cluster and root feature are optional. Instead of specifying a root class it is also possible to choose ''Compile all classes'' which doesn't generate a binary but checks all classes in the target. This can be used for making sure that a library doesn't have any compiler errors.
+
+The version dialog looks similar to this one:
+
+[[Image:version-dialog|Version dialog]]
+
+It allows a version number and some copyright information to be set. On .NET this information will be put into the generated assembly.
+
+
+The Exclude Rules setting allows to define rules to exclude certain files from every cluster. This can be used to exclude CVS or SVN directories globally instead of excluding them on each cluster. The dialog looks like this:
+
+[[Image:exclude-dialog|Exclude Rules dialog]]
+
+Exclude rules are regular expressions which are matched against directories and file names. The basic semantics are that everything is included that either does not match an exclude pattern or does match an include pattern. Matching is done against the path relative to the location of the cluster and / is used as a directory separator.
+
+{{sample| We have a recursive cluster in c:\projects\calculator\cluster and in there we have a file c:\projects\calculator\cluster\interface\ignore_me.eROUTINE class in 15.12 (see bug#19212).
+
+==Compiler==
+* Click [[Major changes between ISE Eiffel 15.12 and ISE Eiffel 16.05|here]] for the '''compiler release notes'''.
+
+==Libraries==
+===General===
+* Update to the latest version of the Eiffel Gobo library
+* New library ''etar'' located at $ISE_LIBRARY/contrib/library/utility/archive/etar.
+
+===Vision2===
+* upper_bar and lower_bar are now obsolete. Use instead a vertical box where the first item is the upper_bar and the last item the lower_bar.
+* Vision will now keep windows open even if not referenced. This address a long standing gotcha for beginners. As a consequence, it is critical that code close or destroy windows when they are not needed anymore, otherwise they will be displayed until the application termination.
+* Fix issue preventing Vision applications to work correctly in SCOOP mode
+* For proper SCOOP handling, the last instruction in a creation procedure that initializes GUI objects should be {EV_APPLICATION}.launch.
+* Use a passive region for an application cell to avoid creating a new thread for no reason.
+* Fix minimum size computation of windows with Aero Glass. When compiling code using the latest versions of Visual Studio, the minimum size of a window was slightly smaller than what it should have been.
+
+===WEL===
+* Fix invalid computation of null_terminated_strings.
+* Fix improper wrapping of WEL_HD_NOTIFY we used an INTEGER_32 when a POINTER should have been used (causing some possible loss of data and some memory access violation).
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-17.01.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-17.01.wiki
new file mode 100644
index 00000000..faed6536
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-17.01.wiki
@@ -0,0 +1,37 @@
+[[Property:uuid|925835D5-E5F1-4FE2-BF6A-5F350C4083CC]]
+[[Property:title|Release notes for EiffelStudio 17.01]]
+[[Property:link_title|17.01]]
+[[Property:weight|3]]
+
+==Graphical environment==
+===What's new===
+* Added support for '''code templates''' via completion dialog. Code templates provide predefined but customizable program schemes for frequently encountered situations. Potentially applicable code templates come up automatically, as part of the completion mechanism; you can select any relevant one and then update the details that correspond to the specific situation (variable names etc.). The mechanism also includes an easy way to add your own code templates, to complement those included as part of the delivery (only a few at the moment). Code templates are a major new addition to EiffelStudio’s extensive existing mechanism to support software reuse.[https://www.eiffel.org/doc/eiffelstudio/Code%20Templates learn more].
+* Added new solution to '''import settings''' from previous installation. A dialog is popuped when a new version of EiffelStudio is first launched, and available at any time from the `Tools > Import Settings` menu. This functionality addresses a frequently expressed request.
+
+===Improvements===
+* Changed how the debugger objects tool displays the `Result` value, now it does not have any parent row.
+* Added `ISE_COMPILE_ALL_FLAGS` environment variable support to the `compile_all` tool (its value is added to compile_all command line arguments).
+* Modified `compile_all` tool, to exclude ecf redirection file from its scope.
+
+==Compiler==
+* Added notion of '''capability''' for specifying what settings a particular '''library supports'''. The key advantage is that even if you compile in different settings and use libraries with different properties (for void safety, SCOOP concurrency etc.) you can now use a '''single ECF''' (Eiffel Configuration File) rather than maintaining different ECFs for different configurations. This mechanism fulfills a wish often expressed by Eiffel developers, particularly those in charge of large applications. At the moment the settings include cat-call detection, concurrency and void safety. A project or a library with a specific setting cannot rely on a library with insufficient capabilities.
+* Configuration option "Are types attached by default?" defaults to True when reading non-void-safe projects so that if the project is changed to be void-safe, the recommended default for attachment status of class types without marks is used.
+* Removed a possibility to set void safety level for a specific class or cluster, it can be done only for a whole library or project.
+
+==Libraries==
+===General===
+* Added new JSON serialization solution under `contrib/library/text/parser/json/library/serialization`.
+
+===EiffelNet===
+* Added receive and send timeout.
+* Added C functions to use socket functions without raising exception on I/O networking error.
+
+===EiffelWeb===
+* Changed the standalone connector implementation to avoid raising exception for any networking error (it brings better debugger experience).
+* Added new websocket standalone connector to be able to build within the same processor a web service and a websocket service.
+* Change the networking programing in EiffelWeb components, to benefit from recent improvements on EiffelNet.
+* Added finer control on standalone connector. It is now possible to fine tune the standalone connector (concurrent settings, timeout values, ...)
+
+----
+
+See [https://dev.eiffel.com/EiffelStudio_17.01_Releases change log]. for more details.
\ No newline at end of file
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-17.05.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-17.05.wiki
new file mode 100644
index 00000000..ea659ea8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/Release-notes-for-EiffelStudio-17.05.wiki
@@ -0,0 +1,55 @@
+[[Property:uuid|A8615DC3-B389-44AA-9BCB-7E9B793A1599]]
+[[Property:weight|2]]
+[[Property:title|Release notes for EiffelStudio 17.05]]
+[[Property:link_title|17.05]]
+==Graphical environment==
+===What's new===
+* The EiffelStudio Inspector was extended to check for '''obsolete features''' and '''obsolete calls''' and to make the users aware of coming removal. For that, the inspector checks for presence of well formatted '''date in obsolete message''' (following the ISO-like `[yyyy-mm-dd]` format). Reported '''severity of obsolete calls''' depends on the associated date ({{Inline-Info|suggestion}} when the date is in the future, {{Inline-Warning|warning}} for less than 1 year old, and {{Inline-Error|error}} for more than 1 year old). '''Removal of obsolete features''' is suggested when the specified date is more than 1.5 year old.
+* Added a shortcut ({{Key|Ctrl-Shift-T}} by default) and a contextual menu item (on editor tabs) to '''restore a recently closed tab'''.
+* Using Pick&Drop functionality, users can now '''pick token for local variables and arguments''' from the EiffelStudio editor and formatters. Drop it into editor, and cursor will be moved to related declaration. Note that for now only normal feature locals and arguments are supported (this excludes inline agent, inline separate, object tests, and across variables).
+
+===Improvements===
+* Improved the '''completion mechanism''' within the editor (especially when inline agent, or inline separate are before the cursor).
+
+==Compiler==
+* Added '''Visual Studio 2017''' support for C compilation on Windows.
+* Improved performance of object initialization checks in complete void safe mode when a class has hundreds of attributes and features (including inherited ones).
+* On Windows, you may experience a '''breaking change''' with respect to the compilation of Eiffel libraries wrapping the Win32 API.
+** Indeed, to allow users to use in the same system libraries such as cURL, SSL, zeroMQ, ... ; the C generated code is now compiled using `WIN32_LEAN_AND_MEAN`.
+** As a result, it is not sufficient anymore to just include `OpenSSL 1.1.1a and supports new asymmetric algorithms (RSA).
+* JWT (JSON Web Token) supports custom JWT algorithms. The associated extension library provides RSA signing algorithms.
+* Performance of the JSON parser is improved by 40% on large regular files.
+* The new function `JSON_VALUE.chained_item (a_key): JSON_VALUE` allows for expressions `json @ "person" @ "address" @ "city" ` to get associated JSON value.
+* ''ROC CMS'' implements protection against cross-site scripting attacks.
+* ''EiffelWeb'' adopts nanoseconds timeout precision and supports suffixes ns, us, ms, s for the standalone connector in the initialization file.
+* ''EiffelWeb'' correctly uses the setting socket.timeout for ''httpd'' (before the misuse of the setting caused high CPU usage for WebSocket).
+* Creation procedures of some container classes are now secret. {{Inline-Warning|Potential incompatibility}} for clients of the classes.
+
+==Tools==
+* Code analyzer does not report false positives for the rules about an unread variable (CA020) and replacement of a regular loop with an iterative form (CA024).
+
+==Examples==
+* `processor_pool` demonstrates how a pool of active SCOOP processors can be used to execute tasks from passive regions.
+----
+
+See [https://dev.eiffel.com/EiffelStudio_18.11_Releases change log] for more details.
\ No newline at end of file
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/index.wiki
new file mode 100644
index 00000000..23e43d20
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|EiffelStudio 5 release notes]]
+[[Property:link_title|5.x]]
+[[Property:weight|15]]
+[[Property:uuid|f4a705a2-86ac-013e-21f2-a99affd7b450]]
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-50.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-50.wiki
new file mode 100644
index 00000000..09cb5680
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-50.wiki
@@ -0,0 +1,63 @@
+[[Property:title|Release notes for EiffelStudio 5.0]]
+[[Property:link_title|5.0]]
+[[Property:weight|-8]]
+[[Property:uuid|943526cc-28e6-748d-a790-502c05c723f6]]
+==Graphical environment==
+* New Look and feel.
+* New way of starting EiffelStudio and simplified the process of compiling an existing project.
+* New editor with:
+** smart syntax highlighting
+** feature completion (by pressing Ctrl+Space after an identifier).
+** syntax completion of major control statement (if, from, is,...)and of symbols such as `{`, `[`, `(`, `"`,...
+** smart auto indenting
+** block indent and exdent.
+** infinite level of Undo/Redo
+
+* When edition of a class text which has been successfully compiled, the class will be fully `pick-and-droppable`.
+* Faster rendering for Clickable, Flat, Contract (previously known as Short) and Flat Contract views.
+* System tool has been replaced by a `project settings` window. The underlying mechanism of the configuration file is kept, but all changes are done through a nice GUI making it simpler for beginners to create their first configuration file.
+* Toolbars are now customizable
+* EiffelCase has been merged within EiffelStudio to provide a true reverse engineering using the BON notation.
+
+==Compiler==
+The compiler has been improved in many ways and some functionality have been added. [[Major changes between ISE Eiffel 4.5 and ISE Eiffel 5.0|Check it out]] .
+==Debugger==
+* New debugger functionalities:
+** one can step-in, step-out, step-by-step when they want to.
+** one can put a breakpoint on the fly (Windows Only)
+** one can see all local variables and arguments.
+** one can set breakpoints in all kind of assertion clauses except in invariants.
+
+* Debugging is faster.
+
+==Documentation==
+* New documentation generation (limited now to HTML) which is completely clickable as if within EiffelStudio. It also includes an EiffelCase-like documentation generation.
+* Generation of XMI which can be used in tools such as Rational Rose.
+
+==Libraries==
+
+===EiffelBase:===
+* No more GENERAL class as proposed by the NICE committee. It has been replaced by ANY which does not inherit any more from PLATFORM.
+* Adaptation of the ARRAY class to the ELKS 2000 standard.
+* This implies a change in our CONTAINER class where we renamed empty into is_empty and made empty obsolete. If you were inheriting from CONTAINER and redefining empty, make sure to update your code so that you redefine is_empty instead. That way your polymorphic calls will still work as expected without having to change all call to empty into calls to is_empty.
+* New implementation of is_equal on LIST which will now check that two lists are identical if their items are identical.
+* New implementation of copy on LIST.
+* New implementation of an iterative is_equal on TREE which will now check that two trees are identical if their items are identical.
+* New implementation of an iterative copy on TREE, which recursively copies the tree.
+* New ROUTINE classes which perform better type checking on argument passing.
+* Introduction of binary operations on INTEGER types: infix "&",infix "|", bit_xor, bit_not, bit_shift, infix "|>>", infix "|<<"and bit_text.
+* Removed infix "^" from NUMERIC. It does not break any inheritance, but break clients that were using this operator on an entity declared of type NUMERIC. This is due to the different return type of this operator depending the NUMERIC type you are handling.
+* Changed the signature of pruned in BINARY_SEARCH_TREE to take an extra argument. This was necessary to fix a problem that caused the `parent` attributes to become inconsistent under certain conditions when calling pruned.
+* Re-implemented the features disjoint and symdif of SUBSET. These features caused problems under certain conditions and were also quite inefficient. The new implementation of these features uses the strategy pattern to choose among different versions of these calculations depending on the properties of the elements contained in the set.
+* All features on SUBSET that take another subset as an argument(e.g. intersect) now accept any other subset type as an argument, independent of its underlying implementation, and not only subsets of type `like Current`.
+* Many smaller bug fixes for bugs that were reported by our customers or that have been discovered during our development andtesting.
+
+===WEL:===
+
+Modified classes relative to the use of registry keys to be written only using Eiffel and externals to Win32 API (no more C intermediates). In the process close_key and delete_key are now commands and not queries. To find out if it their call was successful, you can query last_call_successful.
+
+[[EiffelStudio release notes|Click here to check out what was new in other versions]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-51.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-51.wiki
new file mode 100644
index 00000000..e2bec516
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-51.wiki
@@ -0,0 +1,36 @@
+[[Property:title|Release notes for EiffelStudio 5.1]]
+[[Property:link_title|5.1]]
+[[Property:weight|-9]]
+[[Property:uuid|cab7da39-416f-3330-0f67-b41cb425b537]]
+==Graphical environment==
+* Numerous improvements in usability and bug fixes.
+* Richer class and cluster creation dialogs.
+* Class name completion in the editor (by pressing Ctrl+Shift+Space half-way through the class name).
+* Editor now supports drag-and-drop of the selection.
+* When debugging a project from EiffelStudio, the current directory will be your project directory. It is a change from previous version where:
+** on Windows, it used to be launched in the W_code subdirectory of your project directory
+** on Unix, it used to be launched from the same directory where `estudio` (or `ebench`) was launched.
+
+* EiffelStudio GUI now also available on Unix platforms and Windows 9x/Me
+
+==Compiler and .NET==
+* Click [[Major changes between ISE Eiffel 5.0 and ISE Eiffel 5.1|here]] for more details on compiler improvements and full Eiffel support on .NET
+
+==Libraries==
+
+===EiffelBase===
+* It is now forbidden to create a BIT_REF or a BIT X object using its creation procedure (before it was accepted but did not work)
+* Added make_temporary_name in FILE_NAME
+* Made to_c obsolete from class INTEGER_INTERVAL
+* Changed semantic of split from class STRING
+* Fixed a bug in clear_all from HASH_TABLE that kept a reference to the last found item. Now it does not keep the reference after a call to clear_all .
+
+===Vision2===
+* Support for Vision2 applications on GTK platforms.
+* Some changes in the Vision2 library have been made, [[Revisions and Bug Fixes|check here on how to update your code]] .
+
+[[EiffelStudio release notes|Click here to check out what was new in other versions]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-52.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-52.wiki
new file mode 100644
index 00000000..1a4d8571
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-52.wiki
@@ -0,0 +1,110 @@
+[[Property:title|Release notes for EiffelStudio 5.2]]
+[[Property:link_title|5.2]]
+[[Property:weight|-10]]
+[[Property:uuid|4e54c64b-d9a3-8683-d266-1972217a7a1a]]
+==Graphical environment==
+* Added a status bar, which gives a lot of information, such as the state of the compilation or the name of the current project.
+* Clicking feature clauses in the feature tree now centers the editor on the selected feature clause.
+* More specific icons in the feature and cluster trees, so that identifying deferred classes and the nature of features is now straightforward.
+* Up to 10 [[External commands editor dialog|external commands]] can now be defined and called from the '''Tools''' menu.
+* The new '''Quick compile''' command lets you recompile only the classes that have been edited in EiffelStudio, skipping the sometimes tedious degree 6, that looks for modified classes.
+* Control picking now has a configurable effect.
+* More improvements in usability and bug fixes.
+
+==Compiler==
+* Click [[Major changes between ISE Eiffel 5.1 and ISE Eiffel 5.2|here]] for more details on compiler improvements and full Eiffel support on .NET
+
+==Debugger==
+* Right-clicking on one of the run buttons will pop up a dialog enabling you to choose the command line argument (it is a shortcut for `Project Settings`-> Debug tab).
+* Expressions can now be dynamically evaluated in the debugger. ( [[Expression evaluation|info]] )
+* Conditional breakpoints. ( [[Breakpoints|info]] )
+* Classes can now define debug_output , a feature inherited from DEBUG_OUTPUT , whose string result is automatically displayed in the debugger for all objects of that type. ( [[Debug output|info]] )
+* Possible stack overflows can now be detected in the debugger before they occur. ( [[Stack overflow prevention|info]] )
+
+==Libraries==
+
+===EiffelBase===
+* Improved speed of search operations in ARRAYED_LIST and HASH_TABLE .
+* Reduced number of exported features in TUPLE .
+* Updated INTERNAL and TUPLE to accept INTEGER_XX based queries/commands.
+* STRING changes:
+** Fixed is_integer to return False for strings of the form "(-|+)[a-zA-Z]+[0-9]*)"
+** Improved speed of to_lower and to_upper .
+** Updated for ELKS 2001 conformance:
+*** Changed signature of out and replace_substring to use STRING instead of `like Current`.
+*** Added keep_tail , keep_head , remove_tail , remove_head and make head and tail obsolete.
+*** Added string , same_string , has_substring , fill_with , insert_string , insert_character , as_lower , as_upper .
+*** Modified make_from_string so that no sharing of internal string is done.
+*** Made remake , replace_character and insert obsolete.
+
+
+
+===EiffelThread===
+* Fixed crashes when using join or terminated from THREAD_CONTROL .
+
+===EiffelTime===
+* Rewritten so that no additional C libraries is needed. Therefore you have to update your project configuration files to reflect this change, i.e. removing the include directory and the object file of the old EiffelTime library.
+
+===EiffelVision2===
+* [[Revisions and Bug Fixes|Click here to see list of update and modification to Eiffel Vision2]] .
+
+===WEL===
+* Changed type of non-exported feature internal_data of WEL_WINDOW from INTEGER to POINTER .
+* Fixed a GDI memory leak when creating/releasing instances of descendant of WEL_CONTROL .
+
+==Patch releases==
+
+===Version 5.2.1402:===
+* Put Windows and Unix version to the same version number.
+* Fixed EiffelWeb documentation and example.
+* Fixed minor issues found with EiffelVision2 on Unix and Windows which were affecting EiffelBuild.
+* Fixed incorrect configuration file specification for EiffelVision2 examples and wizards on Unix platforms where application could be linked dynamically with `libpng` but should not.
+* Fixed EiffelStore handle for Oracle so that it works fine when compiled with the Borland C compiler.
+* Fixed incorrect version number in VERSION file on Unix platforms.
+
+===Version 5.2.1313:===
+* Fixed resource leak on Windows 98 and Windows Me.
+* Fixed incorrect implementation of area and substring for STRING in dotnet mode.
+* Fixed issue with setting of arguments. After restarting EiffelStudio the command line argument contains an extra `]` character.
+* Fixed issue with working directories where only the first one ever set was used even if new ones have been set afterwards.
+* Fixed issue in IL code generation where having a class that inherits from a non-Eiffel .NET class. And the class has the following features:
+a: ARRAY [like f]
+f: STRING is
+ do
+ end
+
+Then you could neither load nor execute the generated code.
+
+* Fixed issue with incorrect C code generation of inspect instruction based on character values above 128.
+* Fixed bug in copy from STRING where following code was violating valid_count invariant from STRING :
+
+local
+ s, t: STRING
+do
+ create s.make (9)
+ create t.make (10)
+ t.append ("1234567890")
+ s.copy (t)
+end
+
+* Fixed incorrect C file naming when generating a .NET system that uses a C++ external (it should be .cpp, not just .c).
+* Enabled support for Borland C compiler in .NET.
+* Fixed issue where generating documentation for all/library cluster would stop during generation without completing.
+* Fixed crash in diagram tool when moving label on client/supplier link between two classes.
+
+===Version 5.2.1123:===
+* Fixed issue when inheriting a .NET class that has some static constants defined.
+
+===Version 5.2.1122:===
+* Fixed issue when opening the about dialog of EiffelStudio.
+* Enabled EiffelStudio for all users on a machine, not just for the one installing EiffelStudio.
+
+===Version 5.2.1118:===
+* First initial release of EiffelStudio 5.2
+
+[[EiffelStudio release notes|Click here to check out what was new in other versions]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-53.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-53.wiki
new file mode 100644
index 00000000..78f08512
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-53.wiki
@@ -0,0 +1,98 @@
+[[Property:title|Release notes for EiffelStudio 5.3]]
+[[Property:link_title|5.3]]
+[[Property:weight|-11]]
+[[Property:uuid|dd116cc7-40cf-b317-b9c0-b05d4fe0edf7]]
+==Graphical environment==
+
+===Changes===
+* In project settings, we now accept a root class without creation procedure.
+* In .NET code generation, we do not force the C compilation at each compilation. It is only done when necessary (for example when a C external has been added).
+* Incremental .NET code generation (See [[Major changes between ISE Eiffel 5.2 and ISE Eiffel 5.3|compiler release notes]] for more info).
+* Recoverable storable (See [[Major changes between ISE Eiffel 5.2 and ISE Eiffel 5.3|compiler release notes]] for more info).
+
+===Bug fixes===
+* Fixed issue with setting of arguments. After restarting EiffelStudio the command line argument contains an extra `]` character.
+* Fixed issue with working directories where only the first one ever set was used even if new ones have been set afterwards.
+* Fixed issue where generating documentation for all/library cluster would stop during generation without completing.
+* Fixed crash in diagram tool when moving label on client/supplier link between two classes.
+* Fixed resource leak on Windows 98 and Windows Me.
+* Fixed issue in projects where clusters are specified with relative path would not compile after adding a local assembly.
+* Fixed problem with cluster tool management where moving classes around or looking up a class will generate an error box instead of performing the requested operation.
+* Fixed incorrect configuration file specification for EiffelVision2 examples and wizards on Unix platforms where application could be linked dynamically with `libpng` but should not.
+* Fixed disappearance of EiffelStudio when debugging a routine `infix` or `prefix` in which an exception was raised. This issue was only occurring with melted code (usually noticeable when using a precompiled library).
+* Changing the project specific command line arguments will not touch the project settings configuration file (ace file).
+
+==Compiler==
+* Click [[Major changes between ISE Eiffel 5.2 and ISE Eiffel 5.3|here]] for the compiler release notes.
+
+==Libraries==
+
+===CECIL===
+* Enforced definition of EIF_OBJECT so that it is different from EIF_REFERENCE to better catch errors when passing a protected reference to a feature accepting an unprotected reference and vice versa. Because of this change some C code might not compile anymore which is good as it points out that code was doing something wrong that could corrupt the Eiffel memory.
+
+===EiffelBase===
+* Added in INTERNAL the following new features: field_static_type_of_type , class_name_of_type , type_name and type_name_of_type .
+* Added truncated_to_integer_64 in REAL and DOUBLE .
+* Added to_integer_64 in STRING .
+* Added new classes MEMORY_STRUCTURE , MANAGED_POINTER and C_STRING to better manage access to C and C++ memory structure.
+* Fixed incorrect implementation of area and substring for STRING in dotnet mode.
+* Fixed bug in copy from STRING where following code was violating valid_count invariant from STRING :
+
+local
+ s, t: STRING
+do
+ create s.make (9)
+ create t.make (10)
+ t.append ("1234567890")
+ s.copy (t)
+end
+
+* Added support for storable in .NET. However .NET and classic implementation are completely different and independent_store will not be able to retrieve a storable file if not made using the same code generation.
+* Fixed a bug in is_equal from LIST where comparing two lists of different counts could break the comparison:
+make is
+ local
+ a, b: LIST [INTEGER]
+ do
+ create {ARRAYED_LIST [INTEGER]} a.make (2)
+ a.extend (10)
+
+ create {ARRAYED_LIST [INTEGER]} b.make (2)
+ b.extend (10)
+ b.extend (11)
+
+ print (equal (b, a))
+ end
+
+* Fixed .NET implementation of open_write and create_read_write in FILE . They were not resetting the file size to zero if file already existed.
+* Added correct_mismatch on ANY used for `recoverable storable`.
+* Added correct_mismatch on HASH_TABLE to enable retrieval of the 5.1 and older version of HASH_TABLE.
+* Fixed bug in implementation of copy and is_equal for TREE and descendant classes. Now descendants of TREE that would like to compare additional attributes of their class needs to redefine node_is_equal whose default implementation will always result in a true value.
+* Changed default semantic of make and put_child from FIXED_TREE, to preserve existing semantic, you should use make_filled and replace_child instead.
+
+===Eiffel2Java===
+* Updated library so that it works both in classic and dotnet mode.
+
+===EiffelCOM===
+* Fixed crash in ccom_set_name from FONT_IMPL_PROXY.
+
+===EiffelNet===
+* Fixed assertion violation of call to to_integer in feature get_content_length from HTTP_PROTOCOL if assertions are enabled on EiffelBase.
+
+===EiffelStore===
+* Updated library so that it works both in classic and dotnet mode.
+* Fixed issue with oracle handle which did not work with the included Borland C compiler.
+* Removed nb_classes from EXT_INTERNAL .
+* Removed need for additional object file (`support.lib' on Windows and `libsupport.a` on Unix platforms), so make sure to remove it from your project configurations.
+
+===EiffelVision2===
+* [[Revisions and Bug Fixes|Click here to see list of update and modification to Eiffel Vision2]] .
+
+===WEL===
+* Removed inheritance to WEL_STRUCTURE in WEL_STRING, it now inherits from new C_STRING class. In the process removed the following features which were inherited from WEL_STRUCTURE and did not make sense to WEL_STRING memory_copy, structure_size, dispose, set_item, set_shared, set_unshared, shared, to_integer. No replacements have been provided for those features. Made initialize and initialize_with_character obsolete, instead we now provide two features inherited from C_STRING fill_blank and fill_value.
+
+[[EiffelStudio release notes|Click here to check out what was new in other versions]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-54.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-54.wiki
new file mode 100644
index 00000000..3a193447
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-54.wiki
@@ -0,0 +1,96 @@
+[[Property:title|Release notes for EiffelStudio 5.4]]
+[[Property:link_title|5.4]]
+[[Property:weight|-12]]
+[[Property:uuid|185d86b7-8ddc-20ad-6343-eeb86f413739]]
+==Graphical environment==
+
+===Improvements===
+* Added support for mouse wheel in editor and associated parameterization in preferences.
+* Cluster tree is not collapsed anymore between compilation.
+* All callers will not show empty entries.
+
+===Bug fixes===
+* Fixed issue where setting the string background color to `auto` in the preferences will set it to a black color next time your relaunch EiffelStudio.
+* Fixed issue where typing in an empty features tree will close down EiffelStudio.
+* Fixed issue with BON diagram where expanded client links were not properly displayed (the expanded bar was drawn on top of classes instead of on the link itself).
+
+==Debugger==
+
+===Improvements===
+* Ability to debug .NET applications from EiffelStudio. It behaves like the traditional debugger except with the current limitations:
+** no conditional breakpoints
+** no expression evaluation
+** no expansion to see attributes of non-Eiffel objects
+
+
+===Bug fixes===
+* Fixed issue on Unix platforms where passing more than 5 arguments will disable debugging and ultimately crash the environment.
+
+==EiffelBuild==
+* Click [[EiffelBuild Version History|here]] for the EiffelBuild release notes.
+
+==Compiler==
+* Click [[Major changes between ISE Eiffel 5.3 and ISE Eiffel 5.4|here]] for the compiler release notes.
+
+==Libraries==
+
+===Eiffel2Java===
+* Fixed incorrect memory freeing in get_string in JNI_ENVIRONMENT that could cause some memory corruption.
+* Fixed VDRD error in method_id from JAVA_OBJECT.
+
+===EiffelBase===
+* Optimized i_th from PRIMES for the first 200 prime numbers.
+* Fixed bug in generic_typecode from TUPLE in .NET implementation which fixed an issue with is_reference_item.
+* Made TUPLE a descendant of HASHABLE and defined hash_code (based on the hash_codes of the elements of a TUPLE).
+* Added default_create as creation procedure of TUPLE and made make obsolete.
+* Added convenience features to TUPLE: put_XX_item where `XX` can be replaced by `character, boolean, integer, double,...`.
+* Optimized ROUTINE, PROCEDURE and FUNCTION implementation to speed up agent calls by a factor of 2 to 3. Removed open_operand_type from ROUTINE as its specification was only used internally and specification was not precise enough to be used by clients of ROUTINE.
+* Fixed append from SEQUENCE to not perform a deep_clone when passed argument is the same reference as Current. This was a problem when the base class of the type of the elements inherited from MEMORY and redefined dispose. You could possibly end up freeing twice an external resource.
+* Changed implementation of INTERACTIVE_LIST to be based on ARRAYED_LIST rather than on LINKED_LIST.
+* Added efficient implementation of append in ARRAYED_LIST.
+* Fixed bug in multithreaded mode when you open in two different threads a different file with a different mode. For example one is in read mode, the other one is in write mode. If the operation happens at the same time, you could end up with two files open in read mode or two files open in write mode, which is not the expected behavior.
+
+===EiffelNet===
+* Fixed bug in set_delay and set_nodelay in NETWORK_STREAM_SOCKET, because their implementations were inverted.
+* Fixed incorrect spelling of maximum_seg_size in NETWORK_STREAM_SOCKET.
+* Added recoverable storable to EiffelNet (was not included in previous version although recoverable storable was available for files).
+* Fixed SMTP_PROTOCOL to follow more closely SMTP RFCs.
+* Added support for multi-line error codes in SMTP_PROTOCOL.
+
+===EiffelTime===
+* Improved speed of DATE and TIME comparison.
+* In DATE_VALUE added ordered_compact_date and made compact_date obsolete.
+* In DATE added make_by_ordered_compact_date and make_by_compact_date obsolete.
+* In DATE_VALIDITY_CHECKER added ordered_compact_date_valid.
+* Fixed C_DATE to buffer the current time rather than querying it for each of the time components. Not doing that was causing a bug in DATE, DATE_TIME and TIME where if the computation was done on December 31st at 23:59:59 2003, we could end up with a date of January 1st 2003, therefore being one year off. This is a breaking change from before and if you are using C_DATE, use update before each call to the *_now queries if you expected to reflect the time at the time of the query.
+
+===EiffelThread===
+* Added support for .NET
+* Made OBJECT_OWNER obsolete
+* Added wait_with_timeout in CONDITION_VARIABLE
+* Added READ_WRITE_LOCK class to be used in a system where few writes are done compare to reads. A typical example of its use would be to have a thread safe lookup table where few insertions are done.
+* Now a C externals that might block the execution of a system, should be marked `blocking`. [[Major changes between ISE Eiffel 5.3 and ISE Eiffel 5.4|See compiler changes for more details]] .
+
+===EiffelVision2===
+* [[Revisions and Bug Fixes|Click here to see list of update and modification to EiffelVision2]] .
+
+===EiffelWeb===
+* Fixed issue when sending exception trace to browser. On most servers you were getting an internal error rather than the exception trace.
+* Fixed issue with cookies from CGI_ENVIRONMENT as keys were stored as items, now the keys are stored as keys, items as items.
+
+===WEL===
+* Renamed convert from CONVERTER class into extract_definition.
+* Renamed convert from WEL_FONT_FAMILY_ENUMERATOR class into update_current.
+* In WEL_TREE_VIEW, calling deselect_item will now really deselect the item, whereas previously, it only caused the item to be redrawn without selection.
+* In WEL_REGISTRY, open_value_key will now accept an empty string so that the default key value can be read.
+* Fixed issue with dword_value in WEL_REGISTRY_KEY_VALUE which returned incorrect values.
+* Made make in WEL_REGISTRY_KEY_VALUE accepts only string values, if you want to create a new instance with a value of a different type you need to use the new creation procedure make_with_value.
+
+===.NET libraries===
+* Renamed THREAD and MUTEX into SYSTEM_THREAD and SYSTEM_MUTEX to avoid name conflicts with EiffelThread.
+
+[[EiffelStudio release notes|Click here to check out what was new in other versions]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-55.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-55.wiki
new file mode 100644
index 00000000..14594c47
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-5-release-notes/release-notes-eiffelstudio-55.wiki
@@ -0,0 +1,83 @@
+[[Property:title|Release notes for EiffelStudio 5.5]]
+[[Property:link_title|5.5]]
+[[Property:weight|-13]]
+[[Property:uuid|0d5bdd1d-e35b-a37e-009f-f19fae0771db]]
+==Graphical environment==
+
+===Improvements===
+* Added full configuration of colors used in editor
+* Added docking facilities for various tools. It permits the re-ordering of tools within the interface, including making them "float" externally [[Docking|(See EiffelBuild documentation on docking mechanism for more details)]] .
+* Ability to see when a class is deferred in the context tool formatters. It is shown by adding the `*' character at the end of the class name.
+
+===Changes===
+* One cannot add a .NET assembly from the GAC anymore, instead you have to specify the path to the assembly in the assembly references list.
+
+===Bug fixes===
+* Fixed a crash when performing feature completion on classes with errors.
+* On Windows, prevented the EiffelStudio window to go to the back of all windows when you click Ok on the dialog box which appears when a syntax error occurs while compiling a project.
+
+==Debugger==
+* Enabled conditional breakpoint and expression evaluation for .NET
+* Improved expression evaluation abilities (full range of Eiffel expressions are now supported).
+* Improved object viewer window (word wrapping for large text, ability to see the whole content in one click without having to enter the lower and upper index of a range).
+
+==EiffelBuild==
+* Click [[EiffelBuild Version History|here]] for the EiffelBuild release notes.
+
+==Compiler==
+* Click [[Major changes between ISE Eiffel 5.4 and ISE Eiffel 5.5|here]] for the compiler release notes.
+
+==Libraries==
+
+===CECIL===
+* Added ability to query type of a generic class where an actual generic parameter is expanded although its base class is not. It suffices to prefix the class name with "expanded ". Reciprocally, you can use the reference version of an expanded class by prefixing with "reference ".
+
+===EiffelBase===
+* Removed Void is now a keyword.
+* Added l_date: DATE_TIME
+...
+create l_date.make_now
+print (l_date.formatted_out ("[0]mm/[0]dd/yy"))
+
+
+
+===EiffelThread===
+* Added a new C routine assign.
+
+===Bug fixes===
+* Fixed infinite loop in finish_freezing which could use all the available memory.
+* Fixed some issues with formatting of agent using expressions as target, and display of character and string constants in context tool.
+* Fixed issue where tools that have been externally docked were not properly restored when reopening EiffelStudio.
+* Fixed issue where one could not remove entries added to the list of external commands.
+* Supported keyword highlighting for the keywords infix and prefix in editor and different views.
+
+==Compiler==
+* Click [[Major changes between ISE Eiffel 5.5 and ISE Eiffel 5.6|here]] for the compiler release notes.
+
+==Debugger==
+===Graphical environment===
+* The stack, objects and evaluator tools now use a grid display instead of simply a tree view
+* A mixed multicolumn list and tree view display which display item only when shown, this make debugger much faster to display values
+* The evaluator tool renamed as "watch tool" has more features than previously, such as browsing the objects value directly in the tool, moving up and down the expression, dopped objects as them self, ....
+* The new watch tool can be used instead of the objects view to display current, and dropped objects (and of course expressions).
+* You can close and create new watch tools
+* Each tool has its hexdecimal/decimal format switch command.
+* Most of the debugging tools are now inside a notebook, and are dockable outside this notebook
+* Various minor bug fixes and improvements regarding the interface
+
+===Debugger engine===
+* Fixed a memory leak with the `estudio` process when conditional breakpoints are enabled.
+* Improved speed of execution when conditional breakpoints are enabled (about 20 times faster).
+* Fixed a bug where after killing a debugged process, the debugger could not be launched anymore.
+* Improved speed regarding STRING and SPECIAL manipulation in the debugger
+* Dotnet: fixed memory/handle leak when debugging dotnet system
+* Dotnet: fixed memory corruption while debugging dotnet system
+* Dotnet: EiffelStudio do not hang (100% CPU) anymore during dotnet debugging.
+* Dotnet: make EiffelStudio much more stable while debugging dotnet system.
+* Dotnet: fixed various issues which occurred on killing debugged application
+* Dotnet: improved support for dotnet v2.0.x debugging
+* Dotnet: fixed expression evaluation on pure dotnet object
+* Evaluation: fixed remaining error status on expression (sometimes when an expression has an error, changing the expression to a valid expression was not reseting the error status)
+* Evaluation: improved error message reporting for expression evaluation
+* Evaluation: improved the stability and the result validity of expression
+* Breakpoint: fixed some issues related to setting, removing breakpoints, and remaining hidden breakpoints
+* Breakpoint: now the debugger stops on a condition breakpoint when the condition's result is True, but also if the expression is not supported, or if it raises an exception
+
+==EiffelBuild==
+* Click [[EiffelBuild Version History|here]] for the EiffelBuild release notes.
+
+==Libraries==
+
+===CECIL===
+* Due to renaming of EIF_REAL and EIF_DOUBLE into EIF_REAL_32 and EIF_REAL_64, we have also changed the names of some CECIL facilities. Although old names are still valid we may remove their definition in future releases of the compiler. Below is the list of old names and their corresponding new names:
+{|
+|-
+| '''Old name'''
+| '''New name'''
+|-
+| EIF_REAL_FUNCTION
+| EIF_REAL_32_FUNCTION
+|-
+| EIF_DOUBLE_FUNCTION
+| EIF_REAL_64_FUNCTION
+|-
+| eif_real_function
+| eif_real_32_function
+|-
+| eif_double_function
+| eif_real_64_function
+|-
+| EIF_REAL_TYPE
+| EIF_REAL_32_TYPE
+|-
+| EIF_DOUBLE_TYPE
+| EIF_REAL_64_TYPE
+|-
+| EIF_FN_FLOAT
+| EIF_FN_REAL_32
+|-
+| EIF_FN_DOUBLE
+| EIF_FN_REAL_64
+|}
+
+
+===EiffelBase===
+* Added new storable facility entierly written in Eiffel which enables you to exchange data between classic and .NET. Former version built-in in the Eiffel run-time did not apply for .NET. The classes are located in the new like Current.
+** Fixed True when searching for Void when comparing objects in an array containing a Void element.
+** Fixed issue on .NET with occurences that returned 0 when called with void argument and object_comparision is true.
+** Fixed a bug in feature is_equal that caused stack overflow when some array item is the array itself and object_comparision is true.
+
+* list: ARRAYED_LIST [INTEGER]
+
+create list.make (5)
+list.put_i_th (3, 3)
+
+** Added implementation query like Current instead of replace_substring that might produce incorrect result when argument and target of the call is the same object.
+** Merged .NET and classic implementation of STRING so that all features of STRING are now properly implemented for both platforms.
+** Fixed sleep to class THREAD_CONTROL.
+* Provided inheritance link between classes THREAD and THREAD_CONTROL on all platforms.
+
+===EiffelTime===
+* Breaking changes:
+** In time format, the use of hh12 alone without specifying AM or PM will default to AM.
+** Changed implementation of Void.
+* Fixed False where True was expected.
+
+===EiffelVision2===
+* [[Revisions and Bug Fixes|Click here for EiffelVision2 release notes.]]
+
+===WEL===
+* Made WEL 64 bits compliant. This required a breaking change in signatures. Some routines were actually using an 1.e-4 was not considered a valid floating point value.
+** Changed behavior of start_pos was greater than 1.
+
+* rescue clause indicator in call stack tool's grid.
+* One can decide to stay in debugging mode even when compiling.
+* Added possibility to continue on conditional breakpoint evaluation failure.
+* Removed useless ''Attributes'' row in debugger's objects tree.
+* The once routines node now shows states of once procedures in addition of the state of once functions.
+* Improved cosmetic of debugger's exception handling dialog.
+
+===Debugger engine===
+* Added support for creation of instance of class (including generic).
+* Added support for manifest TUPLE, and manifest ARRAY.
+* Added support for static routine evaluation.
+* Added ability to disable/restore assertion checking during debugging.
+* Added evaluation of instructions with the debugger (i.e: procedure call).
+* Fixed bug#12934 where the debugger would cause a memory corruption in a running multithreaded program.
+* Fixed bug#12750 where the stack overflow detection was not working on Linux.
+* Fixed bug#11755 where empty strings with a large capacity were slow to be displayed.
+
+==EiffelBuild==
+* Click [[EiffelBuild Version History|here]] for the EiffelBuild release notes.
+
+==Libraries==
+
+===EiffelBase===
+* Fixed issue with in your descendant comment to reuse the parent one which is shown in all our formatter tools..
+* Added new light batch compiler `ecb`. It provides the same features as `ec` when using the batch mode. Currently projects compiled with `ec` are not compatible with those compiled with `ecb`. The main difference between the two is that `ec` is compiled with exception trace and multithreading support which could slow down the compiler by a factor of 20 to 40% depending on your platform.
+* Added experimental unit testing tool.
+
+===Improvements===
+* Error list tool now supports multiple selection, for better copy to clipboard usage.
+* Enhanced some errors to report better context information.
+* Optimized adding of items to the Error List by circumventing an expensive search when adding single items.
+
+===Changes===
+* Error list items context now shows the full group name but after CLASS.feature because it is of lesser importance.
+* Restructured layout of user files to support unification and user-override files of Eiffel compiler installation files. Relocated default Eiffel projects location into the user files folder (windows and mac only).
+
+===Bug fixes===
+* Fixed the EiffelCOM wizard so that it generates C code that compiles.
+
+==Compiler==
+* Click [[Major changes between ISE Eiffel 6.1 and ISE Eiffel 6.2|here]] for the compiler release notes.
+
+==Debugger==
+===Graphical environment===
+* New breakpoint editor, which centralizes in a unique dialog the parameters of the breakpoint.
+* Added tag support for breakpoints.
+* Added new "When hits.." actions (such as enable/disable breakpoints, start/stop execution recording, and others...).
+* Better breakpoints tool, to see, sort or filter the breakpoints
+* Enhanced execution record and replay mechanism. This allows to record the execution, and replay the recording in EiffelStudio and see/browse the recorded values, and the calls executed.
+* Better dialog to change the layout of the Objects tool grid. It is possible to easily change the order of 'Current, arguments, locals, ...'.
+* Added a toggle button, to ignore or not the breakpoints.
+* Added dropdown menu on the "[Start]" button to have quicker access to useful features.
+
+===Debugger engine===
+* Watch tool: added support for "create .." expression.
+
+==EiffelBuild==
+* Click [[EiffelBuild Version History|here]] for the EiffelBuild release notes.
+
+==Libraries==
+
+===EiffelBase===
+* Changed signature of {`SPECIAL`}.`same_items` and {`SPECIAL`}.`all_default` to take an extra argument. Our analysis shows that it was only used by `ARRAY` and that it should be harmless. If you have a compilation error, simply add `0` as first argument of your call.
+* Changed `physical_size` in `INTERNAL` to return the real allocated size of an object along with its header size.
+* Added `deep_physical_size` in `INTERNAL` to compute the size of an object and all its dependencies.
+* Improved speed of `read_stream` in `FILE` so that it used underlying `fread` once rather than calling `getc` for each requested character. Our benchmarks show that you can save up to 2s for 1000 calls.
+* Added an assigner routine for `item` in `ARRAY2`. This might break descendant classes of `ARRAY2` redefining `item`.
+* Updated code toward Void-safety.
+
+===EiffelNet===
+* Fixed bug in {`SOCKET`}.`read_stream` where if there was a socket error, then it would cause a precondition violation in `C_STRING`.
+
+===EiffelTime===
+* Added support for `DEBUG_OUTPUT` for `DATE`, `TIME` and `DATE_TIME` objects making it easier to debug code based on them.
+* Fixed bug where duration in days between two dates overlapping a leap year would yield a result off by +1 or -1.
+* 10% speed improvement on certain date operations (can be seen on eweasel test#time002).
+
+===EiffelVision2===
+* [[Revisions and Bug Fixes|Click here for EiffelVision2 release notes.]]
+
+===EiffelVision2===
+* Fixed a bug in {`WEL_REGISTRY`}.`enumerate_key` where the routine would go in an infinite loop if the key name was larger than 64 characters.
+
+[[EiffelStudio release notes|Click here to check out what was new in other versions]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-6-release-notes/release-notes-eiffelstudio-63.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-6-release-notes/release-notes-eiffelstudio-63.wiki
new file mode 100644
index 00000000..94e1bd01
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-6-release-notes/release-notes-eiffelstudio-63.wiki
@@ -0,0 +1,77 @@
+[[Property:title|Release notes for EiffelStudio 6.3]]
+[[Property:link_title|6.3]]
+[[Property:weight|-10]]
+[[Property:uuid|524a2b27-872c-1fd9-8de1-651128f11155]]
+==Graphical environment==
+
+===What's new===
+* Innovative testing tools let you automatically test your software, extract test cases from failed execution as well as manually creating your own test cases.
+* Added brace matching in the editor.
+* Added ability to automatically license your Eiffel classes each time you save a class.
+* Added the '''argument_parser''' library which provides an easy way to manipulate command line arguments.
+* Added a new version of the EiffelNet library with IPv6 support. Because it has some breaking changes, the library is called '''net_ipv6''' and can be, in most cases, be used in place of the original EiffelNet library.
+
+===Improvements===
+* Improved the library choice dialog which can also be customized to include your own locations.
+* Added support for across) form of the [[ET: Instructions#Loop|loop construct]] in clickable views.
+* Fixed feature call on void target when reopening a project with diagram tool that contains cluster legend.
+* Fixed a bug in the Info tool: when deleting an EIS entry, selecting "No" did not actually cancel the deletion.
+
+==Compiler==
+* Click [[Major changes between ISE Eiffel 6.7 and ISE Eiffel 6.8|here]] for the compiler release notes.
+
+==Debugger==
+===Graphical environment===
+* It is now possible to [[Detach application|detach the debugger]] from the application (without killing the application).
+* It is now possible to [[Attach application|attach the debugger]] to associated eiffel application launched outside EiffelStudio
+** The application has to be launched in a specific way to wait for the debugger, that is, either
+*** by setting ISE_DBG_PORTNUM environment variable to a specific port number, or
+*** by calling {RT_DEBUGGER}.rt_workbench_wait_for_debugger (a_port_number) from the program itself
+** Then with EiffelStudio, menu Execution->Attach Debuggee and provide the same port number.
+** At this point EiffelStudio is able to debug the application
+
+==EiffelBuild==
+* Click [[EiffelBuild Version History|here]] for the EiffelBuild release notes.
+
+==Libraries==
+
+===EiffelBase===
+* Minimized interface of IMMUTABLE_STRING_* are now correctly displayed in the debugger's tools.
+* Added a toolbar button for the "Attach" command.
+* The exception trace is now included when watch evaluation fails due to an internal error.
+* Fixed various issues in which the debugger is unable to retrieve information about an object, especially from the current object.
+* Fixed various watch evaluation issues involving argument variables.
+
+===Developer changes===
+* The {DB_BREAKABLE_POINT_INFO}.text is no longer truncated, allowing the retention of the full line of Eiffel code.
+
+==EiffelBuild==
+* Click [[EiffelBuild Version History|here]] for the EiffelBuild release notes.
+
+==Libraries==
+
+===EiffelBase===
+* Prevented creation of instances of USE_BIT.
+* Made {ARRAY}.force when the new lower index is less than the old lower index - count.
+* Fixed a bug with {ARRAY}.force where if the items had to move, the newly allocated area was not reset.
+* Corrected precondition of {ARRAY}.force that did not allow storing elements at existing indexes.
+* Added {PLATFORM}.is_scoop_capable to find out if a system is compiled using a SCOOP capable runtime.
+* Added ability to create a local string using a separate string.
+* Moved most of the queries of strings descendants (e.g. is_real, is_integer, ...) to class READABLE_STRING_GENERAL to make it easier to handle all the various kinds of strings.
+* Added {HASH_TABLE}.disjoint to find out if 2 tables have some common elements or not based on the key comparison criteria.
+* Made explicit that the `area` is shared between an ARRAY and an ARRAYED_LIST created via conversion.
+* Fixed improper implementation of `copy` for UNIX_FILE_INFO and BOOL_STRING which caused for the former a sharing of some FILE specific information.
+* Fixed {STRING_32}.left_adjust that did not work properly when the string contained only white spaces.
+* Fixed an issue with {FILE}.exists on Windows 32-bit when files are larger than 2GB. It only occurs with the latest version of the Microsoft C++ compiler (VS2010 or later).
+
+===EiffelStore===
+* Added support for XML data in ODBC.
+* Fixed an issue with retrieving blob of null-size.
+* Added ability to connect to several databases at once for the same database handle.
+* Added ability to connect to an ODBC database using a connection string.
+* Improved support for MySQL.
+* Added query to find out how many rows have been affected by the last query.
+* Made sure that errors are properly propagated when calling {DATABASE_MANAGER}.execute_query_without_commit.
+* Properly handled {DB_CHANGE}.reset.
+* Improved SQL string escaping. Fixed bug escaping ''' for ODBC.
+* Added capability to enable multi-statements execution for MySQL.
+
+===EiffelThread===
+* Breaking change in class THREAD, descendants should now call {THREAD}.make in order to initialize threads properly. This change was required to have a project using SCOOP be able to use libraries that are only aware of multithreading.
+* Fixed a memory corruption issue occurring when many threads are exiting at once, or that a child thread exits immediately after its parent but the parent is not yet finished in its termination.
+
+===EiffelTime===
+* Fixed improper parsing of 2 digit hours.
+
+===EiffelVision2===
+* [[Revisions and Bug Fixes|Click here for EiffelVision2 release notes.]]
+
+===Web Browser Library===
+* Fixed a C compilation issue when finalizing a project using this library.
+
+===WEL===
+* Added ability to print to a specific printer or the default printer without having to show the printer dialog.
+* Added support for loading EMF files through WEL_GDIP_METAFILE.
+* Fixed an issue with WEL_DISK_SPACE that was not working in 64-bit mode. The fix implies a breaking change in that now a NATURAL_64 is returned instead of an INTEGER_32.
+* Added SCOOP support.
+
+
+
+[[EiffelStudio release notes|Click here to check out what was new in other versions]]
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-7-release-notes/release-notes-eiffelstudio-72.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-7-release-notes/release-notes-eiffelstudio-72.wiki
new file mode 100644
index 00000000..609f94f8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/eiffelstudio-release-notes/eiffelstudio-7-release-notes/release-notes-eiffelstudio-72.wiki
@@ -0,0 +1,62 @@
+[[Property:title|Release notes for EiffelStudio 7.2]]
+[[Property:link_title|7.2]]
+[[Property:weight|11]]
+[[Property:uuid|579e75a9-9e50-41ba-70e1-211a092d0f87]]
+==Graphical environment==
+
+===What's new===
+* Added support for handling Unicode file names, environment variables, command line arguments and exception messages to your applications while preserving backward compatibility for existing code.
+
+===Improvements===
+* Usability improvements in the Eiffel Information System:
+** Find elements in deeper levels of referenced libraries
+** Try to locate links even if no system or cluster is specified
+** Better error messages
+* Allowed refactoring tool to rename a feature or a class by reusing an existing name.
+* Added support of class text containing Unicode characters when prettifying code.
+
+===Changes===
+* To support Unicode file names a new class
+View --> Tools --> Error List
+
+or from the default shortcut key CTRL+ALT+E.
+
+
+==Reading Errors and Warnings==
+
+There are numerous ways to gather information on the errors and warnings logged to the tool. Even when the tool is not shown directly, because it is displayed tabbed behind another tool or docked as a hidden slide-in tool on one of the EiffelStudio's bounding window edges, there's enough visible information to indicate how many errors and warnings were generated during the last compilation or in another processing task.
+
+By default, the tool's title (in the tab-docked tab or on the tool's title bar when visible) will read'' 'Error List'''. In its default state there are no errors or warnings. When performing a compilation resulting in the logging of any number of errors or warnings the tool title will be update to indicate the respective number of errors and warning as '''Error List (#Errors, #Warning)''' where '''#Errors''' indicates the number of logged errors and '''#Warnings''' indicates the number of logged warnings. When there are no errors or warnings the tool's title will be reset to the default title '''Error List'''.
+
+When the tool is visible, not only does the tab (if docked) and the title bar reflect the number of logged errors and warnings but the tool bar '''Errors''' and '''Warnings''' filter toggle buttons also reflect the number of respective logged errors and warnings. For more information on filtering error and warnings, see [[#filtering_errors_and_warnings|Filtering Errors and Warnings]] .
+
+===Reading Logged Error and Warning Reports===
+
+When performing a task that produces errors and/or warning the tool will display a number of rows containing information on the logged errors and warnings. Error rows are indicated with the error icon ( [[Image:error]] ) and warnings with the exclamation icon ( [[Image:warning]] ). Both errors and warnings show a single-line, terse description of the offending issue. Error and warning entries can be expanded by clicking the adjacent (+) to reveal a verbose description and an indication on how possibly to fix the problem. You can also press RIGHT (right arrow) or + (plus) to expand a selected row. To collapse a row either click the (-), or press LEFT or - .
+
+Error can be automatically expanded to reveal the more verbose information immediately. Toggling the Expand Errors ( [[Image:expand-errors]] ) button will automatically expand or collapse when toggled on or off respectively.
+
+===Error and Warning Help===
+
+If you are unsure exactly what the error or warning code means, then you can receive help by selecting the error and pressing the Error Info tool bar button ( [[Image:error-info]] ). Alternately [[Pick-and-drop mechanism|pick and drop]] may be used to pick the error code from the error or warning onto the Error Info button.
+
+==Filtering Errors and Warnings==
+
+There is no limit on the number of errors or warnings that can be shown in the tool. All the errors and warnings mean something and should be addressed. However, sometimes it is desirable to filter errors and warnings while you work through the process of fixing the causes of them. Also sometimes it is advantageous to set temporarily the level of warnings you receive without modifying the project configuration.
+
+There are two types of filtration, basic and fine-grained. Basic filtering can be applied to both warnings and errors. Fine-grained filtering applies only to warnings.
+
+Basic filtering of the errors and warnings can be achieved by toggling with tool bar '''Errors''' and/or '''Warnings''' button. Both are toggled on by default so all errors and warnings are displayed. Toggling either off will hide the error or warnings respectively.
+
+For warnings, it might be desirable to filter out specific warnings temporarily without modifying the project's configuration file. You can do this by using the Filter ( [[Image:filter]] ) tool bar button. Uncheck any warnings that you do not want to be shown in the tool. When warnings are being filtered, the Filter button is displayed with exclamation icon overlay ( [[Image:filter-active]] ) to indicate that some warnings may not appear in the tool because they are being filtered out. The fine-grained filter state is only effective during the current EiffelStudio project session. Anything more permanent should be done by changing the [[EiffelStudio: Project settings window|project settings]].
+
+When performing any type of filtering, the error and warning count information is unaffected. This indicates that there can be more errors and warnings than are actually visible in the tool.
+
+==Navigating Errors and Warnings==
+
+There are multiple ways to navigate the logged errors and warnings in the Error List Tool and for some, it doesn't even require the tool to be in view or even opened at all.
+
+All navigation functions off of the currently selected logged error or warning. When the Error List tool is open and in view the most direct way to navigate between the errors and warnings is through the tool itself. There are four tool bar buttons designed for this purpose:
+* Go to Next Error ( [[Image:next-error]] )
+* Go to Previous Error ( [[Image:previous-error]] )
+* Go to Next Warning ( [[Image:next-warning]] )
+* Go to Previous Warning ( [[Image:previous-warning]] )
+
+These tool bar buttons are mirrored in the '''Project''' main menu. Those actions mirrored in the '''Project''' menu do not require the tool to be opened or be in view, providing a shortcut to their actual function.
+
+There are also a matching number of keyboard shortcuts that can be used with or without the Error List tool being in view; To go to the next error use CTRL+F8, To go to the previous error use CTRL+SHIFT+F8, to go to the next warning use CTRL+ALT+F8 and to go to the previous warning use CTRL+ALT+SHIFT+F8.
+
+In the event of no visible errors or warnings, the respective Next/Previous buttons and menu items will be unavailable. This is also effective when [[#filtering_errors_and_warnings|filtering errors and warnings]], as the unseen logged error and warnings are treated as if they had never been logged ensuring that, when navigating, the irrelevant errors and warnings are bypassed.
+
+When navigating between a logged error or warning the context where the error/warning occurred is shown. At anytime, double-left clicking on an error or warning will show the corresponding context to that logged error/warning. Pressing ENTER on the selected error or warning will also show the correspond context.
+
+The [[Pick-and-drop mechanism|pick and drop]] mechanism may also be used to navigate to any part of an error's or warning's context. Any colored text in the logged error/warning description is pickable, even the '''Position''' information.
+
+==Copying Errors and Warnings==
+
+From time to time it may be helpful to copy the information in one or more logger errors and/or warnings. To perform a copy of the information, select one or more logged errors and/or warning in the tool and press CTRL+C. The selected error and warning information will then be placed into the clipboard of the resident operating system.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/formatted-information-about-compiled-classes-and-features/class-views/ancestors.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/formatted-information-about-compiled-classes-and-features/class-views/ancestors.wiki
new file mode 100644
index 00000000..d0b18131
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/formatted-information-about-compiled-classes-and-features/class-views/ancestors.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Ancestors]]
+[[Property:weight|-9]]
+[[Property:uuid|b30f3c56-dbeb-06ac-4775-30a5f1d56966]]
+The ancestors view [[Image:class-ancestors-icon]] displays all the classes from which the current class inherits, directly or not, using a tree-like indented layout.
+ foo
+ local
+ l_str: STRING
+ l_file: FILE
+ do
+ create l_str.make_empty
+ end
+
+note lines or inherit clauses.
+* The shortest path will always be used. So if you transform a target element to a line element, the path: Target -> Group -> Class -> Line will be used instead of Target -> Group -> Class -> Feature -> Line
+* Paths from element to the element of the same unit are omitted. i.e., there are paths such as Target -> Target, Group -> Group, Class -> Class
+
+==Domain Filtering==
+
+After domain transformation, we get a destination domain with all candidate code elements. Then we perform a filtering operation using the specified criterion in a basic metric to get rid of all unsatisfied candidates. At last, we'll get the desired result domain. Using the above example, for every class in the destination domain, we test if that class is compiled using the specified criterion is_compiled. If it's a compiled class, keep it in the destination domain, if not, remove it from the destination domain.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/definitions/units.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/definitions/units.wiki
new file mode 100644
index 00000000..2f054159
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/definitions/units.wiki
@@ -0,0 +1,137 @@
+[[Property:title|Units]]
+[[Property:weight|2]]
+[[Property:uuid|fa08d5aa-7ea4-e7bb-bb59-e4982a583976]]
+Metrics will be expressed in units, such as Line (numbers of source lines) or Feature (number of features).
+
+{{rule|name=Unit rule|text=The definition of any metric must specify an associated unit. }}
+
+
+Different metrics may be marked with the same unit; for example metrics such as number of non-comment lines and number of comment lines may both be marked with the unit Line.
+
+Whenever we need to express ratios of one measurement to another, as in computing the average number of features per class by dividing the number of features by the number of classes, we will use a specific unit, Ratio:
+
+{{definition|Ratio unit|The name Ratio denotes a predefined unit, whose values are arbitrary real numbers, expressed either as numbers or in percentage style (as in 35.3%). }}
+
+As a result of this choice, we will consider every division to yield a result of unit, Ratio.
+
+The following predefined units are available in the metric tool:
+{|
+|-
+| '''Unit'''
+| '''Quantities measured'''
+| '''Kind'''
+|-
+| Class
+| Number of classes or types
+| Product
+|-
+| Generic
+| Number of class generics
+| Product
+|-
+| Feature
+| Number of features
+| Product
+|-
+| Target
+| Number of targets
+| Product
+|-
+| Group
+| Number of groups
+| Product
+|-
+| Assertion
+| Number of assertion clauses
+| Product
+|-
+| Argument
+| Number of arguments of a routine
+| Product
+|-
+| Local
+| Number of locals of a routine
+| Product
+|-
+| Line
+| Number of source lines
+| Product
+|-
+| Compilation
+| Number of compilations
+| Process
+|-
+| Ratio
+| Results of divisions
+| Product
+|}
+
+The units listed here are '''minimal''' in the sense that it is not possible to add the properties measured by any two of them; for example it makes no sense to add a number of features to a number of classes.
+
+In the future, it might be desirable to include more specific units, such as "features per class" , and an associated calculus of units (as in the physical sciences, where multiplying a quantity expressed in g /cm by one in cm yields a result in g). This has not appeared necessary for the typical uses of division envisioned in this note, answering such questions as "What percentage of routines have a header comment" can all be expressed simply as ratio.
+
+==Code Element==
+
+For most of units, an item of that unit represents a code element in a real system. For example, an item of class unit represents a class and an item of line unit represents a line of code. All supported code elements are listed as follows:
+{|
+|-
+| '''Code Element'''
+| '''Unit'''
+| '''Description'''
+|-
+| Class
+| Class
+| Represents a class
+|-
+| Generic
+| Generic
+| Represents the piece of the code related to generics definition in a class definition.
+|-
+| Feature
+| Feature
+| A feature or an invariant clause. In metrics tool, a feature can be one of two things: a traditional feature, or an invariant clause. That is to say, an invariant clause is treated as a special feature. To avoid ambiguity, we call a traditional feature a "feature" and an invariant clause an "invariant feature".
+|-
+| Target
+| Target
+| Represents a target
+|-
+| Group
+| Group
+| Represents a group in system. A group can be either a cluster, a library or an assembly
+|-
+| Assertion
+| Assertion
+| Represents an assertion
+|-
+| Argument
+| Argument
+| Represents a formal argument in features
+|-
+| Local
+| Local
+| Represents a local defined in features
+|-
+| Line
+| Line
+| Represents a line of code
+|-
+| Folder
+| -
+| Represents a physical concept to store classes. The semantic of a folder in metrics tool is equal to a list all classes which are located in that folder (not recursively). So a folder item doesn't provide new functionality, it just facilitates the operation to select a set of classes.
+|-
+| Delayed item
+| -
+| A delayed item is a place holder, it will be replaced by the candidate code element over which a domain criterion is evaluated
+|-
+| Input domain item
+| -
+| An input domain item is a place holder, it will be replaced by the domain selected as input to the metric. In the case that the input domain is presents in a basic metric definition, when that metric is calculated, the metric will use the current application target as the input domain.
+|-
+| Current application item
+| Target
+| Represents the application target of the current Eiffel system
+|}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/index.wiki
new file mode 100644
index 00000000..be8b2e55
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/index.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Metrics tool]]
+[[Property:weight|-5]]
+[[Property:uuid|e76d1c3b-773f-c051-bd94-3272f3ccadc6]]
+One of the innovations of the EiffelStudio development environment is a set of metric facilities enabling developers and managers to obtain quantitative information about software systems and the process of producing them.
+* Find out basic quantitative properties of a system, such as the number of classes, the number of features, how many times the system has been compiled and many others
+* Define new properties as mathematical combinations of the basic ones, and compute the resulting values, to get the answers to such questions as what percentage of my system's routines have precondition clauses' or what is the average number of features, lines, or invariant clauses per class?
+* Vary the scope of such measurements, so that the measured result may cover a single feature, a class, a cluster, an entire system or an archive of another system to make comparisons with other projects.
+* Compare the result of the same metric over several of these scopes, to see for example how a project differs from those on record, or whether some parts of a project depart from the norms applied in others.
+
+The environment will support such measurements through a simple graphical interface, closely integrated with the rest of the Eiffel Explorer. Users of the environment can start applying these facilities to their systems without learning any theory.
+
+Metrics, however, are notoriously subject to abuse; we must be wary of the temptation to revere numbers just because they are numbers (lies, damn lies and metrics). This note presents a simple approach to software metrics designed to establish a clear and sound basis, so that we know what we are measuring, why we are measuring it, and how much value we may attach to the results.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/requirements.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/requirements.wiki
new file mode 100644
index 00000000..ff13c2cc
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/requirements.wiki
@@ -0,0 +1,20 @@
+[[Property:title|Requirements]]
+[[Property:weight|1]]
+[[Property:uuid|834b134f-b4a5-08a7-e41c-804c0954b008]]
+All engineering disciplines other than software rely on quantitative approaches to design their products, organize the production process, and assess the results. Software engineering too can benefit from measuring relevant properties of its products and processes.
+
+Measurements are not an end in themselves; they must be related to broader goals of software engineering:
+
+The purpose of software measurements is to provide quantitative assessments or predictions of properties of software products and processes
+
+For any numerical measure that we propose we must have precise information on four properties: coverage, trustworthiness, relevance, theory.
+
+Any quantitative report on software products or processes should satisfy the following properties:
+* '''Coverage''': include a definition of what is being measured, sufficient to enable repetition of the measurements.
+* '''Trustworthiness''': include an estimate of how much the results can be believed, in particular of their precision (expected variations in case of repetition).
+* '''Relevance''': specify interesting properties of software products or processes on which the measurement may provide insight.
+* '''Theory:''' include arguments backing the statement of relevance.
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/detailed-result-panel.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/detailed-result-panel.wiki
new file mode 100644
index 00000000..cdb57772
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/detailed-result-panel.wiki
@@ -0,0 +1,16 @@
+[[Property:title|Detailed Result Panel]]
+[[Property:weight|1]]
+[[Property:uuid|35018218-cf90-5aca-dc47-205bb351592e]]
+The Detailed result panel is where detailed metric result and archive comparison result are displayed. In the following two figures, a detailed metric result and an archive comparison result are shown.
+
+Detailed metric result:
+
+[[Image:interface4|Defining an input domain]]
+
+Archive comparison result:
+
+[[Image:interface5|Defining an input domain]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/index.wiki
new file mode 100644
index 00000000..bba98147
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|User interface basics]]
+[[Property:weight|3]]
+[[Property:uuid|c2b8d8b6-661c-1cb5-a991-388e8374c696]]
+EiffelStudio includes a Metric tool based on the previously defined metric theory. This tool provides many facilities like computing measures over a project, including smaller scopes, defining new metrics according to users needs, and handling archives to compare projects.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/metric-archive-panel.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/metric-archive-panel.wiki
new file mode 100644
index 00000000..39dc8ca3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/metric-archive-panel.wiki
@@ -0,0 +1,34 @@
+[[Property:title|Metric Archive Panel]]
+[[Property:weight|4]]
+[[Property:uuid|c8793405-c91d-c04b-10ed-07739728f697]]
+The metric archive panel is used to calculate and restore metric archives and to do metric archive comparison.
+
+==Metric Archive Calculation==
+
+Let's have a look at the buttons and options related to metric archive calculataion:
+
+[[Image:metrics-tool--debug-run-icon|calculate archive]] Start metric archive calculationCTRL+Space in a cell in the criterion column (the first column in "definition" area) to get a list of all applicable criteria. You can also type "and" or "or" in that cell to get criterion connectors. And you can put "not" in front of a criterion name to get its negation. After typing the criterion name and hitting enter, if the criterion needs further setup, the property cell of that criterion will be highlighted. For domain criterion such as ancestor_is, caller_is, you can pick an item and drop it into this property cell.
+
+The following figure shows a new linear feature metric:
+
+[[Image:interface10|linear metric]]
+
+For every metric referenced in a linear metric, you need to specify a coefficient. You can pick a metric and drop it into a cell of the "Metrics" column in the "Metric Definition" area.
+
+The following figure shows a new ratio metric:
+
+[[Image:interface11|ratio metric]]
+
+For the numerator or denominator metric, you need to specify a coefficient. When the denominator part evaluates to zero, the result of the ratio metric will be "Undefined". You can pick a metric and drop it into the numerator or denominator metric area.
+
+==Import Metrics==
+
+In order to reuse metrics defined in a different system, you need to import them into current system. The following figure shows how to import metrics:
+
+[[Image:interface12|Import metrics]]
+
+==Backup User-defined Metrics==
+
+The following figure shows how to back user-defined metrics:
+
+[[Image:interface13|Backup metrics]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/metric-evaluation-panel.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/metric-evaluation-panel.wiki
new file mode 100644
index 00000000..5e88ba7f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/metrics-tool/user-interface-basics/metric-evaluation-panel.wiki
@@ -0,0 +1,39 @@
+[[Property:title|Metric Evaluation Panel]]
+[[Property:weight|0]]
+[[Property:uuid|c31fddbb-7421-fe4b-57d3-7eea32f5e9e0]]
+The Metric Evaluation panel is the place to do metric evaluation. After selecting a metric from the "Select metric" area and setting an input domain in the "Setup input domain" area, you can click the run button to start metric evaluation. You can start metric evaluation with and empty input domain and the result will be always zero.
+
+[[Image:interface1|Defining an input domain]]
+
+Let's first have a look at the buttons in the main toolbar, see the following figure in which the main toolbar is highlighted:
+
+[[Image:interface2|Defining an input domain]]
+
+[[Image:metrics-tool--debug-run-icon|Defining an input domain]] Start metric evaluation make and dropping it on the '''send to external editor''' button.
+
+[[Image:External compilation pane edit feature]]
+
+You can also drop a class or feature pebble on the '''open folder''' or '''terminal''' icon. This will get you to the folder in which the generated code for the class or feature resides.
+
+===View external code from the finalized folder===
+
+By default the code that you see in an external editor is from the workbench (W_code) folder. You can see the corresponding external code from the finalized (F_code) folder by holding the CTRL key while you drop the class or feature pebble.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/outputs-tool/general-output-pane.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/outputs-tool/general-output-pane.wiki
new file mode 100644
index 00000000..406147f2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/outputs-tool/general-output-pane.wiki
@@ -0,0 +1,7 @@
+[[Property:title|General output pane]]
+[[Property:weight|0]]
+[[Property:uuid|549e254e-3653-db7a-8874-c71b05c9295a]]
+The General output pane contains information about the current EiffelStudio project.
+
+[[Image:Outputs tool General pane]]
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/outputs-tool/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/outputs-tool/index.wiki
new file mode 100644
index 00000000..77f00a58
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/outputs-tool/index.wiki
@@ -0,0 +1,61 @@
+[[Property:title|Outputs tool]]
+[[Property:weight|-3]]
+[[Property:uuid|4f35254c-9a22-7773-21ed-aa740c3eddd5]]
+==Overview==
+
+[[Image:Outputs tool 01]]
+
+
+Several EiffelStudio facilities log their progress to the various panes of the '''Outputs tool'''.
+
+You can view the outputs from different facilities by selecting the name of a pane from the '''Output:''' drop-down list, as shown below.
+
+
+[[Image:Outputs tool 02]]
+
+
+The output panes you see listed depend somewhat upon how you've been using EiffelStudio. A few of the panes are always present, but other panes only show up in the list after you used the facilities or tools that log information to those panes. For example, if during a session you edit and compile a project but never run it, you would not see the Debugger output pane. Then after you had run the system, the Debugger output pane would join the list.
+
+==Common functionality==
+
+On the top bar, the Outputs tool provides some functionality that is always present, and available to all output panes.
+#The '''save''' button ( [[Image:16x16--general-save-icon]] )will allow you to save the content of the currently displayed output pane to a file.
+#The '''search''' button ( [[Image:tool-search-icon]] ) will provide you with a search bar at the bottom of the current pane.
+#The '''clear''' button ( [[Image:general-reset-icon]] ) clears the content of the output pane that is currently being displayed.
+
+==Transient functionality==
+
+As you work with EiffelStudio you will notice that some icons appear on the Outputs tool's top bar only occasionally. Generally, the Outputs tool will automatically change to the appropriate pane depending upon what's going on in EiffelStudio. For example, when you compile the Eiffel Compilation output pane appears, and when you run a system, the Debugger output pane appears.
+
+You can adjust how panes change to some extent as you will see in the [[#Relevant EiffelStudio preferences|section on preferences]].
+
+But sometimes things happen that change more than one output pane during an action. When this occurs, one or more transient buttons will be added to the Outputs tool's top bar to the right of the search button. This lets you know that there have been modifications to a pane other than the one that is currently displayed. If you click on one of these buttons, you will be taken to that pane, and the button will be dismissed.
+
+The figure below shows the Outputs tool during an external compilation. Notice the transient button that has become visible indicating that new changes have been made in the Eiffel Compilation pane.
+
+
+[[Image:Outputs tool transient functionality]]
+
+
+==Relevant EiffelStudio preferences==
+
+There are two EiffelStudio preferences that can control some of the behavior of the Outputs tool. Both can be found in the preferences path ''Interface -> Development window''.
+
+===Outputs tool prompted===
+
+The preference '''Outputs tool prompted''' controls whether the Outputs tool is made visible automatically whenever a compilation is launched. The value is '''True''' by default. So, in the default case, the Ouputs tool will be visible whenever you compile. If you have closed the tool, and recompile, the tool will reappear.
+
+If you choose a value of '''False''', then the Outputs tool will remain visible if it is already visible. But if you close it, a recompile will not cause it to reappear.
+
+===External compilation output prompted===
+
+The preference '''External compilation output prompted ''' (''C output panel prompted'', in earlier versions) controls whether the [[External compilation pane|External compilation pane]] appears whenever an external compilation (usually a C compilation) occurs.
+
+The default value is '''False'''. In this case, the External compilation pane does not appear automatically when an external compilation occurs, except when both of the following conditions are ture:
+# The Outputs tool is already displayed, and
+# The Eiffel Compilation pane is active.
+
+So, regardless of the preference value, when an external compilation is performed, and the Eiffel Compilation output pane is already active in the Outputs tool, the External Compilation pane will become the active pane. When the external compilation completes, under most circumstances the Eiffel Compilation pane will become active again. However, the Eiffel Compilation pane will not become active if there were external compilation errors, or if you activated some other output pane during the external compilation.
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/error-wizard.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/error-wizard.wiki
new file mode 100644
index 00000000..6a5ac030
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/error-wizard.wiki
@@ -0,0 +1,24 @@
+[[Property:title|Error wizard]]
+[[Property:weight|2]]
+[[Property:uuid|0c9686a0-2b9b-291f-4f01-930d9017810b]]
+More often than wanted, Eiffel compilations are not successful. The good point is that when an error is detected by the compiler, it will not be a problem at run-time. The bad point is that you have to fix compilation errors before being able to launch and debug your system.
+
+When an error occurs during an Eiffel compilation in EiffelStudio, the '''Output''' tab of the context tool displays a description of the error and its location, which looks more or less like this:
+
+
+[[Image:error-message]]
+
+
+In this case, the compiler tries to explain that the identifier "sessionid" is not a known identifier in the context where it was typed. This is a common error that mainly occurs when making typos in the code. Assuming the message does not make sense to you (which may happen in more complex cases), you can query more information about the encountered error.
+
+To do this:
+* [[Pick-and-drop mechanism|Pick]] the code of the error, in this case VEEN.
+* [[Pick-and-drop mechanism|Drop]] it either in the editor or on the error help button [[Image:command-error-info-icon]] .
+* A dialog is then popped up that describes extended information concerning this error type:
+
+
+[[Image:error-description-dialog]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/external-commands-editor-dialog.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/external-commands-editor-dialog.wiki
new file mode 100644
index 00000000..a2348574
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/external-commands-editor-dialog.wiki
@@ -0,0 +1,60 @@
+[[Property:title|External commands editor dialog]]
+[[Property:weight|4]]
+[[Property:uuid|9f8de904-3d17-7ce2-1df8-f4824fab5ae3]]
+From EiffelStudio, you can define up to 10 external commands. Those commands will execute and display their output in the [[Console tool]]. You can execute them through the Tools menu. A typical usage is to use those external commands to integrate with your source control management solution (e.g. CVS, Visual SourceSafe,...)
+
+
+==Defining external commands==
+
+To define your own command, select "External commands..." in the Tools menu. Then the following dialog will appear:
+
+
+[[Image:external-commands-dialog]]
+
+
+With this dialog you can:
+* add new commands
+* edit existing commands
+* delete existing commands
+
+To add your first command, simply click on the "Add..." button and the following command editor will appear:
+
+
+[[Image:external-commands-dialog-editor]]
+
+
+In this dialog you can give a name to the command, this name will be displayed in the Tools menu. The index (0 thru 9) is the position among the external commands of the command in the Tools menu. The command line is the command you want to execute. In order to execute correctly, the application you will execute needs to be in your PATH environment variable or if it is not you must provide an absolute path to the external command. And you can specify the working directory for that command.
+
+In addition to the external command name, you can pass as many options as you want. You can also use placeholders that will be translated before calling the external command. Some of those placeholders are:
+* $class_name: this will be replaced by the name in lower case of the targeted class in editor
+* $file_name: this will be replaced by the path to the targeted class in editor
+* $file: this will be replaced by the simple file name without the path
+* $directory_name: this will be replaced by the directory location of the targeted class in editor
+* $group_name: this will be replaced by the group name of the targeted class in editor
+* $line: this will be replaced by the line number of the cursor of the targeted class in editor
+* $w_code: this will be replaced by the W_code directory of current system, if defined
+* $f_code: this will be replaced by the F_code directory of current system, if defined
+You can see the complete [[Console tool#Placeholders|list]] in the Console tool documentation.
+
+==Executing external commands==
+
+When you look at the EiffelStudio '''Tools''' menu, you will see that the external commands that you have added have also been added to the bottom of the menu. In the figure below, you see the command we added at index 4:
+
+
+[[Image:External commands tools menu]]
+
+
+To execute that command, you can select it from the '''Tools''' menu, or you can use the keyboard shortcut provided. In this case the keyboard shortcut is the default value of '''Alt+4'''.
+
+The shortcuts for the command indexes can be changed in the EiffelStudio preferences by following the preference path:
+
+ shortcuts -> external_commands
+
+
+External commands execute in the context of the [[Console tool]]. The Console tool should appear automatically, but you can make it visible by following the menu path:
+
+ View -> Tools -> Console
+
+Then you can dock the console tool, if you would like to have it constantly visible.
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/index.wiki
new file mode 100644
index 00000000..cb755d96
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|Dialogs]]
+[[Property:weight|1]]
+[[Property:uuid|5d543cd3-8e54-e090-44d4-ee3b51009fe6]]
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/index.wiki
new file mode 100644
index 00000000..d1942991
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/index.wiki
@@ -0,0 +1,14 @@
+[[Property:title|New feature dialog]]
+[[Property:weight|0]]
+[[Property:uuid|deb4901a-7b5a-f669-802e-de1efefcc1a0]]
+The new feature dialog window lets you create simple Eiffel features using the coding standards described in [[Object-Oriented Software Construction, 2nd Edition]]. It automates the task of writing set-procedures for attributes and it makes it easy for you to find the right feature clause for a new feature. The new feature dialog can be invoked whenever you have a class open in a development window. It is also used by the diagram tool when creating a client-supplier link.
+
+==Use it when...==
+* You want to be introduced to the style rules for Eiffel code as described in [[Object-Oriented Software Construction, 2nd Edition]], chapter 26.5 (page 891).
+* You want to create an attribute and you also want an invariant and/or a set-procedure generated for it.
+* You want to add a feature in a feature clause that is not in your class yet, and you do not remember the feature clause order, or you want to add it in a feature clause that is in your class, but you cannot find it.
+
+==Do not use it when...==
+* You want to edit an existing feature. This is not possible, you can only create new features with it.
+* You want to write a more advanced feature. With the feature wizard, you can enter only a single line of code.
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-attribute-layout.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-attribute-layout.wiki
new file mode 100644
index 00000000..075af333
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-attribute-layout.wiki
@@ -0,0 +1,45 @@
+[[Property:title|New attribute layout]]
+[[Property:weight|4]]
+[[Property:uuid|b13c9004-c8a0-6628-5c70-42c3e2617c10]]
+
+class
+ PRODUCT
+
+feature {NONE} -- Access
+
+ price: DOUBLE
+ -- Cost in dollars.
+
+feature -- Element change
+
+ set_price (a_price: DOUBLE)
+ -- Assign `a_price' to `price'.
+ require
+ a_price_non_negative: a_price >= 0.0
+ do
+ price := a_price
+ ensure
+ price_assigned: price = a_price
+ end
+
+invariant
+ price_non_negative: price >= 0.0
+
+end -- class PRODUCT
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/argument-list.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/argument-list.wiki
new file mode 100644
index 00000000..56c378e8
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/argument-list.wiki
@@ -0,0 +1,23 @@
+[[Property:title|Argument list]]
+[[Property:weight|2]]
+[[Property:uuid|f2d63c29-6be2-b3d9-a735-b18e08c5a678]]
+For functions and procedures, you can build a formal argument list. You can do this by clicking on the '''New argument''' button as many times as you need arguments.
+
+{{note|Even though this dialog always shows parentheses, if the list is empty, empty parentheses will not generated. In other words, the dialog will generate the correct Eiffel syntax. }}
+
+
+
+ set_name (s: STRING)
+ do
+ end
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/feature-body.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/feature-body.wiki
new file mode 100644
index 00000000..b87ed57c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/feature-body.wiki
@@ -0,0 +1,35 @@
+[[Property:title|Feature body]]
+[[Property:weight|6]]
+[[Property:uuid|8f9f0b70-e884-73f1-e270-f1b51ef672c6]]
+What goes into the feature body field is dependent on what kind of feature you wish to generate.
+* '''do''': this is the normal procedure type. Enter in the field below '''do''' a body for your feature.
+
+ do_something
+ do
+ a := b
+ end
+
+* '''once''': this is the type for a routine that is executed once per execution. As a once routine cannot have arguments, it is disabled when you added one or more arguments.
+
+ init
+ once
+ load
+ end
+
+* '''deferred''': this creates a routine of deferred type. The local and body fields gray out as they serve no use anymore.
+
+ do_something
+ deferred
+ end
+
+* '''external''': this creates an Eiffel wrap routine around a routine written in another language. Use the body field to enter a string containing the necessary information about the routine using the external syntax.
+
+ do_something
+ external
+ "C | %"location.h%""
+ end
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/feature-clauses.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/feature-clauses.wiki
new file mode 100644
index 00000000..5aabca52
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/feature-clauses.wiki
@@ -0,0 +1,39 @@
+[[Property:title|Feature clauses]]
+[[Property:weight|0]]
+[[Property:uuid|019ea318-e0e0-dae9-a818-e12232aa8431]]
+The feature you create will be inserted in the feature clause you specified. If the feature clause was not already in your class, or not in the right place, EiffelStudio adds the feature clause to the class text based on the feature clause order specified in the [[Preferences Reference|preferences]] . By default, this is the order used by the Eiffel Software libraries, such as EiffelBase.
+==Export status==
+The export status is the class the feature is accessible for. Usually, this is
+feature {EXPORT} -- Clause name
+feature --Clause name
+
+feature {NONE} -- Initialization
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/header-comment.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/header-comment.wiki
new file mode 100644
index 00000000..d0084229
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/header-comment.wiki
@@ -0,0 +1,15 @@
+[[Property:title|Header comment]]
+[[Property:weight|3]]
+[[Property:uuid|45ecda88-003d-fe59-5d4c-3a84d488b6a2]]
+In the header comment field you can type a description of the feature. For style guidelines in writing a header comment, see [[Object-Oriented Software Construction, 2nd Edition]], chapter 26, section 4. The description should be informative, clear and terse.
+
+For example, suppose you have an attribute
+ count: INTEGER
+ -- Number of students in course
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/index.wiki
new file mode 100644
index 00000000..15ab8fa0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|New feature dialog: feature properties modification]]
+[[Property:weight|5]]
+[[Property:uuid|60825ef4-7bc2-d472-8b09-25769689bb34]]
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/invariant-field.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/invariant-field.wiki
new file mode 100644
index 00000000..5c9ed3a4
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/invariant-field.wiki
@@ -0,0 +1,24 @@
+[[Property:title|Invariant field]]
+[[Property:weight|9]]
+[[Property:uuid|9f7ec967-0a45-4ad6-4393-521097467192]]
+When creating an attribute, you can optionally enter or select an invariant for that feature. That invariant will be added to the end of the existing invariant clause. If the invariant clause did not exist before, it is now created.
+
+
+[[Image:feature-wizard-invariant]]
+
+
+If the attribute is of a reference type, you may select the invariant that the attribute may never be void. If it is of a basic expanded type, some other standard options may be chosen. For example, for
+invariant
+ count_positive: count > 0
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/local-variable.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/local-variable.wiki
new file mode 100644
index 00000000..4217d693
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/local-variable.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Local variable]]
+[[Property:weight|5]]
+[[Property:uuid|423aa67d-99f4-0f81-3709-161a6be43af9]]
+Enter a local variable in the local field. A local variable clause will be added to the feature:
+
+ ...
+ local
+ n: INTEGER
+ ...
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/name-field.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/name-field.wiki
new file mode 100644
index 00000000..81617b27
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/name-field.wiki
@@ -0,0 +1,11 @@
+[[Property:title|Name field]]
+[[Property:weight|1]]
+[[Property:uuid|850bd867-5cbf-34d0-f94c-97a75bfa244b]]
+The feature name field is a text box that lets you enter a name for the feature. For help on how to choose the right name for a feature, see: [[Object-Oriented Software Construction, 2nd Edition]], chapter 26, section 2.
+
+
+{{warning|EiffelStudio performs no validation on the name you choose. For example if you type a space in it, it will generate the code, and detect a syntax error only when compiling. }}
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/postcondition.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/postcondition.wiki
new file mode 100644
index 00000000..6b595a30
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/postcondition.wiki
@@ -0,0 +1,12 @@
+[[Property:title|Postcondition]]
+[[Property:weight|7]]
+[[Property:uuid|b8196d6c-2a0f-c06e-855f-d9fe23cbe950]]
+Enter a postcondition in the ensure field. A postcondition clause will be added to the feature:
+
+ ...
+ ensure
+ n = count
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/precondition.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/precondition.wiki
new file mode 100644
index 00000000..022b6b91
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/precondition.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Precondition]]
+[[Property:weight|4]]
+[[Property:uuid|29b32f9e-799d-de91-d62d-79bdb509144b]]
+Enter a precondition in the require field. A precondition clause will be added to the feature:
+
+ ...
+ require
+ n >= 0
+ ...
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/set-procedure.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/set-procedure.wiki
new file mode 100644
index 00000000..ba0e068c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/set-procedure.wiki
@@ -0,0 +1,32 @@
+[[Property:title|Set-procedure]]
+[[Property:weight|10]]
+[[Property:uuid|46b84038-099b-070c-15d7-2b7884a50e01]]
+When creating an attribute, it is common that you will also need a set-procedure for it. For example, for attribute Element change and is exported to all classes. If you have selected or entered an invariant, the precondition will protect this invariant. Example of a generated set-procedure:
+
+
+[[Image:feature-wizard-setprocedure-example]]
+
+
+
+feature -- Element change
+
+ set_button (a_button: EV_BUTTON)
+ -- Assign `a_button' to `button'
+ require
+ a_button_not_void: a_button /= Void
+ do
+ button := a_button
+ ensure
+ button_assigned: button = a_button
+ end
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/type-selection.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/type-selection.wiki
new file mode 100644
index 00000000..7bb9a499
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-feature-properties-modification/type-selection.wiki
@@ -0,0 +1,45 @@
+[[Property:title|Type selection]]
+[[Property:weight|8]]
+[[Property:uuid|b2bd8280-a738-dae4-73aa-c1e232245022]]
+Whenever you need to give a type of something in the dialog, the type selection component is used. The type selection lets you type any class name or you can pick one from the list.
+
+
+[[Image:feature-wizard-typeselection]]
+
+
+When you select a class that is in the system and has formal generic parameters, the type selection component lets you specify an actual generic parameter in another type selection.
+
+
+[[Image:feature-wizard-generictype]]
+
+
+{{note|The window might grow in size because of the added component. }}
+
+
+Since the actual generic type selection is also a type selection, you can select another class with generic parameters and nest them as deep as you need.
+
+
+[[Image:feature-wizard-generictyperec]]
+
+
+You can also select the type
+ new_feature: FUNCTION [TUPLE [INTEGER], BOOLEAN]
+
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-overview.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-overview.wiki
new file mode 100644
index 00000000..b2fa5ce3
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-feature-dialog-overview.wiki
@@ -0,0 +1,17 @@
+[[Property:title|New feature dialog overview]]
+[[Property:weight|1]]
+[[Property:uuid|c0708842-e5e0-5d5c-5746-0507d1709a3e]]
+There are two parts in the window. The upper part allows you to choose what type of feature you want to create, a procedure, a function or an attribute.
+
+
+[[Image:feature-wizard]]
+
+
+The rest of the window is used to set the characteristics of the new feature. Information you will be asked depends on the type you chose. For more information, click on one of the links below:
+* [[New procedure layout|New procedure layout]]
+* [[New function layout|New function layout]]
+* [[New attribute layout|New Attribute layout]]
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-function-layout.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-function-layout.wiki
new file mode 100644
index 00000000..d5b2e73f
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-function-layout.wiki
@@ -0,0 +1,40 @@
+[[Property:title|New function layout]]
+[[Property:weight|3]]
+[[Property:uuid|ae292b6e-7274-47a5-59f1-0f625493474f]]
+
+class
+ PRODUCT
+
+feature -- Status report
+
+ order_price (quantity: INTEGER): DOUBLE
+ -- Total price when ordering `quantity'.
+ require
+ quantity_non_negative: quantity >= 0
+ do
+ Result := quantity * price
+ ensure
+ correct: Result = quantity * price
+ end
+
+end -- class PRODUCT
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-procedure-layout.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-procedure-layout.wiki
new file mode 100644
index 00000000..4e7deaeb
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/dialogs/new-feature-dialog/new-procedure-layout.wiki
@@ -0,0 +1,41 @@
+[[Property:title|New procedure layout]]
+[[Property:weight|2]]
+[[Property:uuid|586fd664-1be4-f588-5350-c7c703145c11]]
+
+class
+ PRODUCT
+
+feature {PERSON} -- Element change
+
+ place_order (person: PERSON; quantity: INTEGER)
+ -- Mail `quantity' to `person'.
+ require
+ person /= Void and quantity > 0
+ do
+ person.mail_order (Current, quantity)
+ ensure
+ person.has_ordered (Current)
+ end
+
+end -- class PRODUCT
+
+
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/index.wiki
new file mode 100644
index 00000000..0658de31
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|Wizards and dialogs]]
+[[Property:weight|0]]
+[[Property:uuid|b216d12e-20a4-5479-18d2-02e622db5322]]
+
+
diff --git a/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/profiler-wizard/index.wiki b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/profiler-wizard/index.wiki
new file mode 100644
index 00000000..83052af0
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/eiffelstudio-reference/wizards-and-dialogs/profiler-wizard/index.wiki
@@ -0,0 +1,22 @@
+[[Property:title|Profiler Wizard]]
+[[Property:weight|0]]
+[[Property:uuid|f3509b1b-8ff1-c385-3bc1-4e800195f8a4]]
+The profiler wizard lets you analyze the result of a profiling session. It helps you optimize your system by pointing out the features where your system spends most of its time.
+
+Before using the profiler wizard you must have generated a ''Run-time information record''. A ''Run-time information record'' is generated by a profiler when a program is executed under its control. Most of the time, the ''Run-time information record'' is generated by the profiler integrated into EiffelStudio. See [[Profiling|How to profile a system]] for more information about how to generate a ''Run-time information record'' with the integrated profiler.
+
+{{note|You can also use a ''Run-time information record'' generated by an external profiler such as GNU's gprof, Pure Atricia's Quantify, Visual C++ profiler, etc. }}
+number_of_columns: 7
+ -- Number of columns in the file.
+
+index_column: 1
+ -- Column where the index is stored.
+
+function_time_column: 3
+ -- Column where the time spent in the function is stored.
+
+descendent_time_column: 4
+ -- Column where the time spent in the descendents of a function is stored.
+
+number_of_calls_column: 5
+ -- Column where the number of calls to a function is stored.
+
+function_name_column: 6
+ -- Column where the name of the function is stored.
+
+percentage_column: 2
+ -- Column where the percentage of time spent in the function is stored.
+
+second_percentage_column: 0
+ -- Column where the second percentage of time spent in the function is stored.
+
+generates_leading_underscore: no
+ -- Says whether the profiler generates leading underscores (yes) or not (no).
+
+As in Eiffel, -- introduces a comment, which has no effect on the specification. If one of the xxx_column options has a value of 0, this means that the files generated by the given profiler contain no such column. The order of the options is not significant.
+
+cd ) and listing the files of a directory ( ls ).
+
+The more you already know about object technology and object-oriented environments, the better. But remember, if you have used other environments before, keep a fresh outlook; EiffelStudio is different, and it may take a while before you fully understand why it does some things in a certain way.
+
+==A note on platform differences==
+
+EiffelStudio is one of the most portable environments in the industry, running in an almost identical fashion on Windows, on the new Microsoft .NET environment, on many variants of Unix, on Linux, on OpenVMS.
+
+Once an EiffelStudio session has been started, you can largely forget about the operating system. But a few operations -- mostly at the beginning, to launch EiffelStudio -- require platform-dependent mechanisms: starting a program, traversing the file structure, selecting a file. These cases will be marked accordingly below.
+
+Windows users should particularly note the following two conventions of terminology:
+* Operating systems store files into hierarchically nested structures called folders or directories. Although "folder" is the more common term for Windows, we will mostly speak of "directories". It's exactly the same thing.
+* A file has a full path name, used to describe how to reach it from the root of its file system, as in c:\d1\d2\f . This example uses the Windows notation, which separates successive components of a path name by a backward slash character \ . On Unix and Linux, the separator is a forward slash / , as in /d1/d2/f ; this is also the convention on the Internet for denoting addresses (URLs). Most file names in this manual appear in this Unix/Internet style. On Windows you will normally have to use the backslash convention, although EiffelStudio also accepts forward slashes. In any case you must be consistent: don't mix backward and forward slashes in the same path name. Also note that some names, such as those of object files to be linked with your system, will be passed to outside tools -- C compilers, loaders -- that may not accept the forward slash.
+
+OpenVMS users may similarly use either the Unix convention or the specific OpenVMS path naming convention.
+
+If you are a one-platform person, just ignore, for the next few pages, all references to any platform other than your heart's favorite. They will quickly go away.
+
+==What should I have done first?==
+
+To run the example you must have installed EiffelStudio and set up the environment. Check in particular the following:
+* On Windows, you must have run the installation procedure; it will have put EiffelStudio in the Programs section of the start menu, subsection "EiffelStudio version", where version is the version number, e.g. 6.0.
+* The environment variable ISE_EIFFEL must be set to the installation directory, and the environment variable ISE_PLATFORM to the platform. On Windows this is taken care of automatically by the installation procedure, but on Unix/Linux and OpenVMS you must update your path and environment manually. Throughout this discussion the notations $ISE_EIFFEL and $ISE_PLATFORM will refer to the values of these variables -- the installation directory, and the platform. (The Windows notation would be %ISE_EIFFEL% and %ISE_PLATFORM%.)
+* On Unix/Linux and OpenVMS, your "path" must include the place where EiffelStudio executables reside. (On Windows the installation procedure takes care of this.)
+* Also, the discussion assumes that as part of the installation you have included the EiffelBase library, in precompiled form. EiffelBase is automatically included if you have installed another precompiled library, such as WEL, the Windows Eiffel Library. The installation procedure takes care of precompiling EiffelBase.
+
+==Locating the example==
+
+Please take a moment to locate the example files on your installation. They all appear in the following directory, part of the Eiffel delivery:
+$ISE_EIFFEL/examples/studio/tour
+
+(Windows users: remember that instead of the slash / your platform uses a backslash \ . OpenVMS users: this is to be replaced by the OpenVMS path naming conventions.)
+
+
+{{seealso|For a quick introduction to EiffelStudio, see the online EiffelStudio presentation available on the Eiffel Software [http://www.eiffel.com/developers/presentations/ developers' presentations web page].}}
+
+
+
diff --git a/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/index.wiki b/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/index.wiki
new file mode 100644
index 00000000..5b02ab77
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|Setup and installation]]
+[[Property:weight|1]]
+[[Property:uuid|90bc1970-bd1d-9707-3030-a4a9f613524a]]
+For detailed installation instructions please follow the link for the product your are installing.
+
diff --git a/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/software-installation-eiffelstudio/OpenBSD.wiki b/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/software-installation-eiffelstudio/OpenBSD.wiki
new file mode 100644
index 00000000..9531838c
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/software-installation-eiffelstudio/OpenBSD.wiki
@@ -0,0 +1,117 @@
+[[Property:uuid|A98B98AA-B61C-464E-BD49-6E63C3249341]]
+[[Property:weight|6]]
+[[Property:title|OpenBSD]]
+[[Property:link_title|OpenBSD]]
+==Requirements==
+
+{| class="doctable"
+|-
+| '''Computer/Processor'''
+| x86 or x86-64
+|-
+| '''Operating System'''
+| OpenBSD 6 with GTK+ 2.4 or greater
+|-
+| '''C compiler'''
+| gcc
+|-
+| '''Memory'''
+| 4GB of RAM
+|-
+| '''Hard Disk'''
+| 1GB of free space
+|-
+| '''ISE_PLATFORM'''
+| '''openbsd-x86''' for x86 based CPU and '''openbsd-x86-64''' for x64 based CPU.
+|}
+
+
+==Checking your environment==
+
+EiffelStudio requires GTK+ 2.4.0 or above to function properly. You can check that you have this installed correctly by typing the following command:
+pkg-config --modversion gtk+-2.0
+The command should succeed and the version number of GTK+ should appear. If it is not 2.4.0 or above then you cannot continue the installation of EiffelStudio. You first need to install GTK+ 2.4.0.
+
+==Installing EiffelStudio from the Web==
+
+After downloading the installation package, you should manually extract its contents to your hard drive. For example, you can extract it into /usr/local using the following commands (assuming that you have permission to /usr/local and that the installation package was saved in /tmp/EiffelXX.tar.bz2, where XX corresponds to the EiffelStudio version number):
+
+cd /usr/local
+tar xvfj /tmp/EiffelXX.tar.bz2
+
+This will install EiffelStudio files into /usr/local/EiffelXX. Once this is done, jump to the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section in order to complete the installation of EiffelStudio.
+
+==Installing EiffelStudio from a CD-ROM==
+
+Insert the CD into your CD-ROM drive. You should manually extract its contents to your hard drive. For example you can extract it in /usr/local using the following commands (assuming that you have permission to /usr/local and that the CD is mounted on /mnt/cdrom):
+cd /usr/local
+cp -r /mnt/cdrom/EiffelXX .
+
+This will install the EiffelStudio files into /usr/local/EiffelXX. To complete the installation of EiffelStudio, jump to the next section, [[#Setting up EiffelStudio|Setting up EiffelStudio]].
+
+==Setting up EiffelStudio==
+
+Once the files have been installed, you should define the following environment variables in order to run EiffelStudio:
+* '''ISE_EIFFEL''' to /usr/local/EiffelXX
+* '''ISE_PLATFORM''' to openbsd-x86-64.
+and add $'''ISE_EIFFEL'''/studio/spec/$'''ISE_PLATFORM'''/bin to your '''PATH''' environment variable.
+
+Using sh or bash as a shell, it suffices to type the following commands:
+
+export ISE_EIFFEL=/usr/local/EiffelXX
+export ISE_PLATFORM=openbsd-x86-64
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+
+
+Using csh or tcsh as a shell, it suffices to type the following commands:
+
+setenv ISE_EIFFEL /usr/local/EiffelXX
+setenv ISE_PLATFORM openbsd-x86-64
+set path = ($path $ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin)
+
+
+If you are using the Enterprise edition, please follow the instructions of the next section, [[#Registering the Enterprise Edition|Registering the Enterprise Edition]], otherwise jump to the [[#Using EiffelStudio|Using EiffelStudio]] section at the end of this document.
+
+==Registering the Enterprise Edition==
+
+This step assumes you have followed the instructions in the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section. Perform the following commands to start the registration process:
+cd $ISE_EIFFEL
+./register
+
+A dialog asking for your '''Username''' and '''CD Key''' should appear as it does below:
+
+pkg-config --modversion gtk+-2.0
+The command should succeed and the version number of GTK+ should appear. If it is not 2.4.0 or above then you cannot continue the installation of EiffelStudio. You first need to install GTK+ 2.4.0.
+
+==Installing EiffelStudio from the Web==
+
+After downloading the installation package, you should manually extract its contents to your hard drive. For example, you can extract it into /usr/local using the following commands (assuming that you have permission to /usr/local and that the installation package was saved in /tmp/EiffelXX.tar.bz2, where XX corresponds to the EiffelStudio version number):
+
+cd /usr/local
+tar xvfj /tmp/EiffelXX.tar.bz2
+
+This will install EiffelStudio files into /usr/local/EiffelXX. Once this is done, jump to the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section in order to complete the installation of EiffelStudio.
+
+==Installing EiffelStudio from a CD-ROM==
+
+Insert the CD into your CD-ROM drive. You should manually extract its contents to your hard drive. For example you can extract it in /usr/local using the following commands (assuming that you have permission to /usr/local and that the CD is mounted on /mnt/cdrom):
+cd /usr/local
+cp -r /mnt/cdrom/EiffelXX .
+
+This will install the EiffelStudio files into /usr/local/EiffelXX. To complete the installation of EiffelStudio, jump to the next section, [[#Setting up EiffelStudio|Setting up EiffelStudio]].
+
+==Setting up EiffelStudio==
+
+Once the files have been installed, you should define the following environment variables in order to run EiffelStudio:
+* '''ISE_EIFFEL''' to /usr/local/EiffelXX
+* '''ISE_PLATFORM''' to freebsd-x86.
+and add $'''ISE_EIFFEL'''/studio/spec/$'''ISE_PLATFORM'''/bin to your '''PATH''' environment variable.
+
+Using sh or bash as a shell, it suffices to type the following commands:
+
+export ISE_EIFFEL=/usr/local/EiffelXX
+export ISE_PLATFORM=freebsd-x86
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+
+
+Using csh or tcsh as a shell, it suffices to type the following commands:
+
+setenv ISE_EIFFEL /usr/local/EiffelXX
+setenv ISE_PLATFORM freebsd-x86
+set path = ($path $ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin)
+
+
+If you are using the Enterprise edition, please follow the instructions of the next section, [[#Registering the Enterprise Edition|Registering the Enterprise Edition]], otherwise jump to the [[#Using EiffelStudio|Using EiffelStudio]] section at the end of this document.
+
+==Registering the Enterprise Edition==
+
+This step assumes you have followed the instructions in the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section. Perform the following commands to start the registration process:
+cd $ISE_EIFFEL
+./register
+
+A dialog asking for your '''Username''' and '''CD Key''' should appear as it does below:
+
+gtk-config --version
+The command should succeed and the version number of GTK+ should appear. If it is not 1.2.10 or above then you cannot continue the installation of EiffelStudio. You first need to install GTK+ 1.2.10.
+
+==Installing the Enterprise Edition==
+
+===From the Web===
+
+After downloading the '''eifXXvms.zip''' installation package (where XX stands for the EiffelStudio version number), unzip the distribution into temp:[dir] where where temp:[dir] is the location of a temporary directory:
+unzip eifXXvms.zip temp:[dir]
+
+And use the following commands to install the files into eiffel_installation_path where eiffel_installation_path is a device:[directory] on an ODS-5 volume:
+set file/attrib=(org:seq,rfm:fix,lrl:9216) temp:[dir]eifXXvms.save
+backup temp:[dir]eifXXvms.save/save eiffel_installation_path
+
+===From a CD===
+
+You must mount the installation CD-ROM volume with the following qualifier:
+mount cd_dev:/media_format=cdrom/undefined_fat=fixed:cr:9216
+
+where cd_dev: is the CD-ROM device. And use the following commands to install the files into eiffel_installation_path where eiffel_installation_path is a device:[directory] on an ODS-5 volume:
+backup cd_dev:[000000]eifXXvms.save/save eiffel_installation_path
+
+===Completing the installation===
+
+You must define a system-wide rooted logical name to reference the installation directory, for instance:
+define/system EIFFELXX eiffel_installation_path:[directory.] /trans=conceal
+
+To use EiffelStudio for OpenVMS, run the setup procedure to define the environment:
+@eiffel_installation_path:[000000]setup
+This will define the logical names and DCL symbols required to run Eiffel.
+
+Once the files are copied and once the environment is setup up set, you need to register EiffelStudio. To do so type the following command:
+RUN ISE_EIFFEL:[000000]register
+
+A dialog asking for your '''Username''' and '''CD Key''' should appear as it does below:
+
+pkg-config --modversion gtk+-2.0
+The command should succeed and the version number of GTK+ should appear. If it is not 2.4.0 or above then you cannot continue the installation of EiffelStudio. You first need to install GTK+ 2.4.0.
+
+==Installing EiffelStudio from the Web==
+
+After downloading the installation package, you should manually extract its contents to your hard drive. For example, you can extract it into /usr/local using the following commands (assuming that you have permission to /usr/local and that the installation package was saved in /tmp/EiffelXX.tar.bz2, where XX stands for the EiffelStudio version):
+
+cd /usr/local
+tar xvfj /tmp/EiffelXX.tar.bz2
+
+This will install EiffelStudio files into /usr/local/EiffelXX. Once this is done, jump to the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section in order to complete the installation of EiffelStudio.
+
+==Installing EiffelStudio from a CD-ROM==
+
+Insert the CD into your CD-ROM drive. You should manually extract its contents to your hard drive. For example you can extract it in /usr/local using the following commands (assuming that you have permission to /usr/local and that the CD is mounted on /mnt/cdrom):
+cd /usr/local
+cp -r /mnt/cdrom/EiffelXX .
+
+This will install the EiffelStudio files into /usr/local/EiffelXX. To complete the installation of EiffelStudio, jump to the next section, [[#Setting up EiffelStudio|Setting up EiffelStudio]].
+
+==Setting up EiffelStudio==
+
+Once the files have been installed, you should define the following environment variables in order to run EiffelStudio:
+* '''ISE_EIFFEL''' to /usr/local/EiffelXX
+* '''ISE_PLATFORM''' to alpha.
+and add $'''ISE_EIFFEL'''/studio/spec/$'''ISE_PLATFORM'''/bin to your '''PATH''' environment variable.
+
+Using sh or bash as a shell, it suffices to type the following commands:
+
+export ISE_EIFFEL=/usr/local/EiffelXX
+export ISE_PLATFORM=alpha
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+
+
+Using csh or tcsh as a shell, it suffices to type the following commands:
+
+setenv ISE_EIFFEL /usr/local/EiffelXX
+setenv ISE_PLATFORM alpha
+set path = ($path $ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin)
+
+
+If you are using the Enterprise edition, please follow the instructions of the next section, [[#Registering the Enterprise Edition|Registering the Enterprise Edition]], otherwise jump to the [[#Using EiffelStudio|Using EiffelStudio]] section at the end of this document.
+
+==Registering the Enterprise Edition==
+
+This step assumes you have followed the instructions in the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section. Perform the following commands to start the registration process:
+cd $ISE_EIFFEL
+./register
+
+A dialog asking for your '''Username''' and '''CD Key''' should appear as it does below:
+
+pkg-config --modversion gtk+-2.0
+The command should succeed and the version number of GTK+ should appear. If it is not 2.4.0 or above then you cannot continue the installation of EiffelStudio. You first need to install GTK+ 2.4.0.
+
+==Installing EiffelStudio from the Web==
+
+After downloading the installation package, you should manually extract its contents to your hard drive. For example, you can extract it into /usr/local using the following commands (assuming that you have permission to /usr/local and that the installation package was saved in /tmp/EiffelXX.tar.bz2, where XX stands for the EiffelStudio version number):
+
+cd /usr/local
+tar xvfj /tmp/EiffelXX.tar.bz2
+
+This will install EiffelStudio files into /usr/local/EiffelXX. Once this is done, jump to the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section in order to complete the installation of EiffelStudio.
+
+==Installing EiffelStudio from a CD-ROM==
+
+Insert the CD into your CD-ROM drive. You should manually extract its contents to your hard drive. For example you can extract it in /usr/local using the following commands (assuming that you have permission to /usr/local and that the CD is mounted on /mnt/cdrom):
+cd /usr/local
+cp -r /mnt/cdrom/EiffelXX .
+
+This will install the EiffelStudio files into /usr/local/EiffelXX. To complete the installation of EiffelStudio, jump to the next section, [[#Setting up EiffelStudio|Setting up EiffelStudio]].
+
+==Setting up EiffelStudio==
+
+Once the files have been installed, you should define the following environment variables in order to run EiffelStudio:
+* '''ISE_EIFFEL''' to /usr/local/EiffelXX
+* '''ISE_PLATFORM''' to hpux-11.
+and add $'''ISE_EIFFEL'''/studio/spec/$'''ISE_PLATFORM'''/bin to your '''PATH''' environment variable.
+
+Using sh or bash as a shell, it suffices to type the following commands:
+
+export ISE_EIFFEL=/usr/local/EiffelXX
+export ISE_PLATFORM=hpux-11
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+
+
+Using csh or tcsh as a shell, it suffices to type the following commands:
+
+setenv ISE_EIFFEL /usr/local/EiffelXX
+setenv ISE_PLATFORM hpux-11
+set path = ($path $ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin)
+
+
+If you are using the Enterprise edition, please follow the instructions of the next section, [[#Registering the Enterprise Edition|Registering the Enterprise Edition]] , otherwise jump to the [[#Using EiffelStudio|Using EiffelStudio]] section at the end of this document.
+
+==Registering the Enterprise Edition==
+
+This step assumes you have followed the instructions in the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section. Perform the following commands to start the registration process:
+cd $ISE_EIFFEL
+./register
+
+A dialog asking for your '''Username''' and '''CD Key''' should appear as it does below:
+
+pkg-config --modversion gtk+-2.0
+The command should succeed and the version number of GTK+ should appear. If it is not 2.4.0 or above then you cannot continue the installation of EiffelStudio. You first need to install GTK+ 2.4.0.
+
+On some Linux distribution the Xtst library is required but not installed by default. You have to make sure it is installed by using the instruction of your Linux distribution.
+
+For example, on Debian based distribution you need to do:
+
+sudo apt-get install libgtk2.0-dev
+sudo apt-get install libxtst-dev
+
+
+==Installing EiffelStudio from the Web==
+
+After downloading the installation package, you should manually extract its contents to your hard drive. For example, you can extract it into /usr/local using the following commands (assuming that you have permission to /usr/local and that the installation package was saved in /tmp/EiffelXX.tar.bz2, where XX stands for the EiffelStudio version):
+
+cd /usr/local
+tar xvfj /tmp/EiffelXX.tar.bz2
+
+This will install EiffelStudio files into /usr/local/EiffelXX. Once this is done, jump to the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section in order to complete the installation of EiffelStudio.
+
+==Installing EiffelStudio from a CD-ROM==
+
+Insert the CD into your CD-ROM drive. You should manually extract its contents to your hard drive. For example you can extract it in /usr/local using the following commands (assuming that you have permission to /usr/local and that the CD is mounted on /mnt/cdrom):
+cd /usr/local
+cp -r /mnt/cdrom/EiffelXX .
+
+This will install the EiffelStudio files into /usr/local/EiffelXX. To complete the installation of EiffelStudio, jump to the next section, [[#Setting up EiffelStudio|Setting up EiffelStudio]].
+
+
+==Setting up EiffelStudio==
+
+Once the files have been installed, you should define the following environment variables in order to run EiffelStudio:
+* '''ISE_EIFFEL''' to /usr/local/EiffelXX
+* '''ISE_PLATFORM''' to linux-x86 for the 32 bits version or linux-x86-64 for the 64 bits version. We will be using '''linux-x86-64''' in the examples below.
+and add $'''ISE_EIFFEL'''/studio/spec/$'''ISE_PLATFORM'''/bin to your '''PATH''' environment variable.
+
+Using sh or bash as a shell, it suffices to type the following commands:
+
+export ISE_EIFFEL=/usr/local/EiffelXX
+export ISE_PLATFORM=linux-x86-64
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+
+
+Using csh or tcsh as a shell, it suffices to type the following commands:
+
+setenv ISE_EIFFEL /usr/local/EiffelXX
+setenv ISE_PLATFORM linux-x86-64
+set path = ($path $ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin)
+
+
+If you are using the Enterprise edition, please follow the instructions of the next section, [[#Registering the Enterprise Edition|Registering the Enterprise Edition]], otherwise jump to the [[#Using EiffelStudio|Using EiffelStudio]] section at the end of this document.
+
+== Installing EiffelStudio on Ubuntu ==
+An alternative to previous solution for Ubuntu, is to use the ppa repository.
+```shell
+sudo add-apt-repository ppa:eiffelstudio-team/ppa
+sudo apt-get update
+sudo apt-get install eiffelstudio
+```
+It installs EiffelStudio using the linux layout, so no specific environment variables are needed (note: ISE_EIFFEL and ISE_PLATFORM should not be set to use this linux layout).
+The executable are located under `/usr/bin`, libraries under `/usr/lib/eiffelstudio`, ...
+
+To reinstall, or update:
+```shell
+sudo apt-get purge eiffelstudio
+sudo apt-get update
+sudo apt-get install eiffelstudio
+```
+
+
+==Registering the Enterprise Edition==
+
+This step assumes you have followed the instructions in the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section. Perform the following commands to start the registration process:
+cd $ISE_EIFFEL
+./register
+
+A dialog asking for your '''Username''' and '''CD Key''' should appear as it does below:
+
++sudo port install eiffelstudio ++ + +When a new release of the same version EiffelStudio becomes available, you can upgrade like so: +
+sudo port selfupdate +sudo port upgrade outdated ++ +==Installing EiffelStudio from a compressed package== +This section only applies if you have installed all the required prerequisites. If you are not sure, use the installation from MacPorts as described in the previous section. + +After downloading the compressed package, you should manually extract its contents to your hard drive. For example, you can extract it into /usr/local using the following commands (assuming that you have permission to /usr/local and that the installation package was saved in /tmp/Eiffel_X.Y.tar.bz2, where X.Y stands for the EiffelStudio version): +
+cd /usr/local
+tar xvfj /tmp/Eiffel_X.Y.tar.bz2
+
+This will install EiffelStudio files into `/usr/local/Eiffel_X.Y` . Once this is done, jump to the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section in order to complete the installation of EiffelStudio.
+
+== Setting up EiffelStudio ==
+Once the files have been installed, you should define the following environment variables in order to run EiffelStudio:
+* ISE_EIFFEL to `/usr/local/Eiffel_X.Y`
+* ISE_PLATFORM to `macosx-x86` for the 32 bits version or `macosx-x86-64` for the 64 bits version. We will be using `macosx-x86-64` in the examples below.
+and add `$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin` to your PATH environment variable.
+
+Using sh or bash as a shell, it suffices to type the following commands:
+```shell
+export ISE_EIFFEL=/usr/local/Eiffel_X.Y
+export ISE_PLATFORM=macosx-x86-64
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+```
+(Note: you can write this into your .profile file).
+
+== Starting EiffelStudio ==
+
+Now everything should be properly installed and you should be able to run the compiler. Simply navigate to /Applications/MacPorts/Eiffel''XX'' and double click the EiffelStudio icon.
+
+Alternatively, you can also start EiffelStudio from the command line by entering the command '''estudio''' or use the command-line eiffel compiler '''ec'''.
+
+If you are a new user to EiffelStudio, we recommend that you follow [[Introducing EiffelStudio|the EiffelStudio guided tour]].
+
+
diff --git a/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/software-installation-eiffelstudio/eiffelstudio-sgi-irix.wiki b/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/software-installation-eiffelstudio/eiffelstudio-sgi-irix.wiki
new file mode 100644
index 00000000..d929ace2
--- /dev/null
+++ b/documentation/18.11/eiffelstudio/getting_started/setup-and-installation/software-installation-eiffelstudio/eiffelstudio-sgi-irix.wiki
@@ -0,0 +1,113 @@
+[[Property:title|SGI Irix]]
+[[Property:weight|7]]
+[[Property:uuid|f8de85e3-0786-071c-3ece-bbde6656dc20]]
+==Requirements==
+
+{| class="doctable"
+|-
+| '''Computer/Processor'''
+| MIPS.
+|-
+| '''Operating System'''
+| Irix 6.5 with either Gnome 2.6 or GTK+ 2.4.
+|-
+| '''C compiler'''
+| MIPSPro C compiler V2.4 or later.
+|-
+| '''Memory'''
+| 4GB of RAM
+|-
+| '''Hard Disk'''
+| 1GB of free space
+|-
+| '''ISE_PLATFORM'''
+| '''irix-mips''' for 32 bits, '''irix-mips-64''' for 64 bits.
+|}
+
+
+==Checking your environment==
+
+EiffelStudio requires GTK+ 2.4.0 or above to function properly. You can check that you have this installed correctly by typing the following command:
+pkg-config --modversion gtk+-2.0
+The command should succeed and the version number of GTK+ should appear. If it is not 2.4.0 or above then you cannot continue the installation of EiffelStudio. You first need to install GTK+ 2.4.0.
+
+==Installing EiffelStudio from the Web==
+
+After downloading the installation package, you should manually extract its contents to your hard drive. For example, you can extract it into /usr/local using the following commands (assuming that you have permission to /usr/local and that the installation package was saved in /tmp/EiffelXX.tar.bz2, where XX stands for the EiffelStudio version):
+
+cd /usr/local
+tar xvfj /tmp/EiffelXX.tar.bz2
+
+This will install EiffelStudio files into /usr/local/EiffelXX. Once this is done, jump to the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section in order to complete the installation of EiffelStudio.
+
+==Installing EiffelStudio from a CD-ROM==
+
+Insert the CD into your CD-ROM drive. You should manually extract its contents to your hard drive. For example you can extract it in /usr/local using the following commands (assuming that you have permission to /usr/local and that the CD is mounted on /mnt/cdrom):
+cd /usr/local
+cp -r /mnt/cdrom/EiffelXX .
+
+This will install the EiffelStudio files into /usr/local/EiffelXX. To complete the installation of EiffelStudio, jump to the next section, [[#Setting up EiffelStudio|Setting up EiffelStudio]].
+
+==Setting up EiffelStudio==
+
+Once the files have been installed, you should define the following environment variables in order to run EiffelStudio:
+* '''ISE_EIFFEL''' to /usr/local/EiffelXX
+* '''ISE_PLATFORM''' to irix-mips for the 32 bits version or irix-mips-64 for the 64 bits version. We will be using '''irix-mips''' in the examples below.
+and add $'''ISE_EIFFEL'''/studio/spec/$'''ISE_PLATFORM'''/bin to your '''PATH''' environment variable.
+
+Using sh or bash as a shell, it suffices to type the following commands:
+
+export ISE_EIFFEL=/usr/local/EiffelXX
+export ISE_PLATFORM=irix-mips
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+
+
+Using csh or tcsh as a shell, it suffices to type the following commands:
+
+setenv ISE_EIFFEL /usr/local/EiffelXX
+setenv ISE_PLATFORM irix-mips
+set path = ($path $ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin)
+
+
+If you are using the Enterprise edition, please follow the instructions of the next section, [[#Registering the Enterprise Edition|Registering the Enterprise Edition]], otherwise jump to the [[#Using EiffelStudio|Using EiffelStudio]] section at the end of this document.
+
+==Registering the Enterprise Edition==
+
+This step assumes you have followed the instructions in the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section. Perform the following commands to start the registration process:
+cd $ISE_EIFFEL
+./register
+
+A dialog asking for your '''Username''' and '''CD Key''' should appear as it does below:
+
+pkg-config --modversion gtk+-2.0
+The command should succeed and the version number of GTK+ should appear. If it is not 2.4.0 or above then you cannot continue the installation of EiffelStudio. You first need to install GTK+ 2.4.0.
+
+EiffelStudio requires the library file libmlib.so.2. If this file is missing from your Solaris installation, you can install it by installing medialib.
+
+==Installing EiffelStudio from the Web==
+
+After downloading the installation package, you should manually extract its contents to your hard drive. For example, you can extract it into /usr/local using the following commands (assuming that you have permission to /usr/local and that the installation package was saved in /tmp/EiffelXX.tar.bz2, where XX stands for the EiffelStudio version):
+
+cd /usr/local
+tar xvfj /tmp/EiffelXX.tar.bz2
+
+This will install EiffelStudio files into /usr/local/EiffelXX. Once this is done, jump to the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section in order to complete the installation of EiffelStudio.
+
+==Installing EiffelStudio from a CD-ROM==
+
+Insert the CD into your CD-ROM drive. You should manually extract its contents to your hard drive. For example you can extract it in /usr/local using the following commands (assuming that you have permission to /usr/local and that the CD is mounted on /mnt/cdrom):
+cd /usr/local
+cp -r /mnt/cdrom/EiffelXX .
+
+This will install the EiffelStudio files into /usr/local/EiffelXX. To complete the installation of EiffelStudio, jump to the next section, [[#Setting up EiffelStudio|Setting up EiffelStudio]] .
+
+==Setting up EiffelStudio==
+
+Once the files have been installed, you should define the following environment variables in order to run EiffelStudio:
+* '''ISE_EIFFEL''' to /usr/local/EiffelXX
+* '''ISE_PLATFORM''' to solaris-sparc for the 32 bits version or solaris-sparc-64 for the 64 bits version, respectively solaris-x86 and solaris-x86-64 for Solaris on Intel processors. We will be using '''solaris-sparc''' in the examples below.
+and add $'''ISE_EIFFEL'''/studio/spec/$'''ISE_PLATFORM'''/bin to your '''PATH''' environment variable.
+
+Using sh or bash as a shell, it suffices to type the following commands:
+
+export ISE_EIFFEL=/usr/local/EiffelXX
+export ISE_PLATFORM=solaris-sparc
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+
+
+Using csh or tcsh as a shell, it suffices to type the following commands:
+
+setenv ISE_EIFFEL /usr/local/EiffelXX
+setenv ISE_PLATFORM solaris-sparc
+set path = ($path $ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin)
+
+
+If you are using the Enterprise edition, please follow the instructions of the next section, [[#Registering the Enterprise Edition|Registering the Enterprise Edition]] , otherwise jump to the [[#Using EiffelStudio|Using EiffelStudio]] section at the end of this document.
+
+==Registering the Enterprise Edition==
+
+This step assumes you have followed the instructions in the [[#Setting up EiffelStudio|Setting up EiffelStudio]] section. Perform the following commands to start the registration process:
+cd $ISE_EIFFEL
+./register
+
+A dialog asking for your '''Username''' and '''CD Key''' should appear as it does below:
+
+EIFGENs directories (including those in precompiles).
+# Setup Visual Studio 2017 environment in 64-bit mode by running
+#:...\vsdevcmd.bat -arch=amd64
+# Setup EiffelStudio environment by running (most probably, this step is unnecessary if using GUI only)
+#:...\esvars.bat
+# Tell EiffelStudio to use Visual Studio 2017-compatible libraries
+#:set ISE_C_COMPILER=msc_vc140
+# Launch EiffelStudio from the command prompt:
+#:estudio
+
+
+=== See also: ===
+*[https://www.eiffel.org/doc/uuid/B2E4622A-2495-47DD-9C02-B9940A026EC1 Mini How-tos]
+* [https://www.eiffel.com/resources/faqs/eiffel-language/ General Eiffel FAQ]
+* [https://www.eiffel.com/resources/faqs/eiffel-studio/ EiffelStudio FAQ]
+
diff --git a/documentation/18.11/glossary/index.wiki b/documentation/18.11/glossary/index.wiki
new file mode 100644
index 00000000..2242bc34
--- /dev/null
+++ b/documentation/18.11/glossary/index.wiki
@@ -0,0 +1,423 @@
+[[Property:title|Glossary]]
+[[Property:link_title|Glossary]]
+[[Property:description|Glossary of Object Technology]]
+[[Property:weight|4]]
+[[Property:uuid|b8c10baa-4f50-adfe-a6f8-9cb56a8f1917]]
+This glossary provides brief definitions of the principal terms of object technology, discussed in detail in the book ''[[uuid:496983ef-b86e-772e-16b9-39b37ef80e37|Object-Oriented Software Construction, 2nd Edition]]'' and used in this website. ''Italics font'' in a definition marks a term or phrase, other than the ubiquitous "class", that is itself the subject of another definition.
+
+==Abstract class==
+:See ''[[#Deferred class|deferred class]]''.
+
+==Abstract data type (ADT)==
+:A set of mathematical elements specified by listing the functions applicable to all these elements and the formal properties of these functions.
+
+==Abstract object==
+:An element of an [[#Abstract data type (ADT)|''abstract data type (ADT)'']].
+
+==Ancestor (of a class)==
+:The class itself, or one of its direct or indirect ''[[#Parent (of a class)|parents]]''.
+
+==Assertion==
+:A formal condition describing the semantic properties of software elements, especially routines and loops. Used in expressing ''[[#Contract|contracts]]''. Assertions include in particular ''[[#Precondition|preconditions]]'', ''[[#Postcondition|postconditions]]'', ''[[#Class invariant|class invariants]]'' and ''[[#Loop invariant|loop invariants]]''.
+
+==Assignment attempt==
+:An operation that conditionally attaches an ''[[#Object|object]]'' to a ''[[#Reference|reference]]'', only if the object’s type ''[[#Conformance|conforms]]'' to the type declared for the corresponding ''[[#Entity|entity]]''.
+
+==Asynchronous call==
+:A call which lets its caller proceed before it completes. Antonym: ''[[#Synchronous call|synchronous call]]''.
+
+==Attribute==
+:The description of a ''[[#Field|field]]'' present in all the ''[[#Instance (of a class)|instances]]'' of a class. Along with the ''[[#Routine|routine]]'', one of the two forms of ''[[#Feature|feature]]''.
+
+==Behavior class==
+:A class, usually ''[[#Deferred class|deferred]]'', describing a set of adaptable behaviors through ''[[#Effective feature|effective routines]]'' relying on some components (usually ''[[#Deferred feature|deferred features]]'') that may be ''[[#Redeclaration|redeclared]]'' to capture specific variants of the general behaviors.
+
+==Class==
+:A partially or totally implemented ''[[#Abstract data type (ADT)|abstract data type]]''. Serves both as a ''[[#Module|module]]'' and as a ''[[#Type|type]]'' (or type pattern if the class is ''[[#Generic class|generic]]''.)
+
+==Class invariant==
+:An ''[[#Assertion|assertion]]'' which must be satisfied on creation of every ''[[#Instance (of a class)|instance]]'' of a class, and preserved by every exported routine of the class, so that it will be satisfied by all instances of the class whenever they are externally observable.
+
+==Client==
+:A class that uses the features of another, its ''[[#Supplier|supplier]]'', on the basis of the supplier's interface specification (''[[#Contract|contract]]'').
+
+==Cluster==
+:A group of related classes or, recursively, of related clusters.
+
+==Component==
+:See ''[[#Reusable software component|reusable software component]]''.
+
+==Concurrent==
+:Able to use two or more ''[[#Processor|processors]]''. Antonym: ''[[#Sequential|sequential]]''.
+
+==Conformance==
+:A relation between types. A type conforms to another if it is derived from it by ''[[#Inheritance|inheritance]]''.
+
+==Constrained genericity==
+:A form of ''[[#Genericity|genericity]]'' where a formal generic parameter represents not an arbitrary type, but one that is required to ''[[#Conformance|conform]]'' to a certain type, known as the constraint. See ''[[#Constrained genericity|constrained genericity]]''.
+
+==Container data structure==
+:An ''[[#Object|object]]'' whose primary use is to provide access to a number of other objects. Examples include lists, queues, stacks, arrays.
+
+==Contract==
+:The set of precise conditions that govern the relations between a ''[[#Supplier|supplier]]'' class and its ''[[#Client|clients]]''. The contract for a class includes individual contracts for the exported routines of the class, represented by ''[[#Precondition|preconditions]]'' and ''[[#Postcondition|postconditions]]'', and the global class properties, represented by the ''[[#Class invariant|class invariant]]''. See also ''[[#Design by Contract|Design by Contract]]''.
+
+==Contravariance==
+:The policy allowing a feature ''[[#Redeclaration|redeclaration]]'' to change the ''[[#Signature (of a feature)|signature]]'' so that a new result type will ''[[#Conformance|conform]]'' to the original but the original argument types conform to the new. See also: ''[[#Covariance|covariance]]'', ''[[#Novariance|novariance]]''.
+
+==Covariance==
+:The policy allowing a feature ''[[#Redeclaration|redeclaration]]'' to change the ''[[#Signature (of a feature)|signature]]'' so that the new types of both arguments and result ''[[#Conformance|conform]]'' to the originals. See also: ''[[#Contravariance|contravariance]]'', ''[[#Novariance|novariance]]''.
+
+==Current object (or: current instance)==
+:During the execution of an ''[[#Object-oriented|object-oriented]]'' software system, the target of the most recently started routine call.
+
+==Defensive programming==
+:A technique of fighting potential errors by making every module check for many possible consistency conditions, even if this causes redundancy of checks performed by ''[[#Client|clients]]'' and ''[[#Supplier|suppliers]]''. Contradicts ''[[#Design by Contract|Design by Contract]]''.
+
+==Deferred class==
+:A class which has at least one ''[[#Deferred feature|deferred feature]]''. Antonym: ''[[#Effective class|effective class]]''.
+
+==Deferred feature==
+:A feature which, in a certain class, has a specification but no implementation. May be declared as deferred in the class itself, or inherited as deferred and not ''[[#Effect|effected]]'' in the class. Antonym: ''[[#Effective feature|effective feature]]''.
+
+==Descendant (of a class)==
+:The class itself, or one of its direct or indirect ''[[#Heir (of a class)|heirs]]''.
+
+==Design by Contract==
+:A method of software construction that designs the components of a ''[[#System|system]]'' so that they will cooperate on the basis of precisely defined ''[[#Contract|contracts]]''. See also: ''[[#Defensive programming|defensive programming]]''.
+
+==Direct instance (of a class)==
+:An ''[[#Object|object]]'' built according to the mold defined by the class.
+
+==Dynamic==
+:Occurring during the execution of a ''[[#System|system]]''. See also ''[[#Run time (noun, two words)|run time]]''. Antonym: ''[[#Static|static]]''.
+
+==Dynamic binding==
+:The guarantee that every execution of an operation will select the correct version of the operation, based on the type of the operation's target.
+
+==Dynamic typing==
+:The policy whereby applicability of operations to their target ''[[#Object|objects]]'' is only checked at run time, prior to executing each operation.
+
+==Effect==
+:A class effects a feature if it inherits it in ''[[#Deferred feature|deferred]]'' form and provides an ''[[#Effecting|effecting]]'' for that feature.
+
+==Effecting==
+:A ''[[#Redeclaration|redeclaration]]'' which provides an implementation (as ''[[#Attribute|attribute]]'' or ''[[#Routine|routine]]'') of a feature inherited in ''[[#Deferred feature|deferred]]'' form.
+
+==Effective class==
+:A class which only has ''[[#Effective feature|effective features]]'' (that is to say, does not introduce any ''[[#Deferred feature|deferred feature]]'', and, if it inherits any deferred feature, ''[[#Effect|effects]]'' it). Antonym: ''[[#Deferred class|deferred class]]''.
+
+==Effective feature==
+:A feature declared with an implementation - either as a routine which is not ''[[#Deferred feature|deferred]]'', or as an ''[[#Attribute|attribute]]''. Antonym: ''[[#Deferred feature|deferred feature]]''.
+
+==Encapsulation==
+:See ''[[#Information hiding|information hiding]]''.
+
+==Entity==
+:A name in the software text that denotes a run-time value (''[[#Object|object]]'' or ''[[#Reference|reference]]'').
+
+==Event-driven computation==
+:A style of software construction where developers define the control structure by listing possible external events and the system's response to each of them, rather than by specifying a pre-ordained sequence of steps.
+
+==Exception==
+:The inability of a routine to achieve its ''[[#Contract|contract]]'' through one of its possible strategies. May result in particular from a ''[[#Failure|failure]]'' of a routine called by the original routine. Will be treated as ''[[#Resumption|resumption]]'', ''[[#Organized panic|organized panic]]'' or ''[[#False alarm|false alarm]]''.
+
+==Exporting a feature==
+:Making the feature available to ''[[#Client|clients]]''. Exports may be selective (to specified classes only) or general.
+
+==Extendibility==
+:The ability of a software system to be changed easily in response to different choices of requirements, architecture, algorithms or data structures.
+
+==Failure==
+:The inability of a routine's execution to fulfill the routine's ''[[#Contract|contract]]''. Must trigger an ''[[#Exception|exception]]''.
+
+==False alarm==
+:Along with ''[[#Resumption|resumption]]'' and ''[[#Organized panic|organized panic]]'', one of the three possible responses to an ''[[#Exception|exception]]''; resumes the execution of the current strategy, possibly after taking some corrective action.
+
+==Feature==
+:The ''[[#Attribute|attributes]]'' and ''[[#Routine|routines]]'' of a class.
+
+==Feature renaming==
+:The attribution, by a class, of a new name to an inherited feature, not changing any other property. See also ''[[#Redeclaration|redeclaration]]''.
+
+==Field==
+:One of the values making up an ''[[#Object|object]]''.
+
+==Function==
+:A ''[[#Routine|routine]]'' which returns a result. (The other form of routine is the ''[[#Procedure|procedure]]''.)
+
+==Garbage collection==
+:A facility provided by the ''[[#Runtime (noun, one word)|runtime]]'' to recycle the memory space used by ''[[#Object|objects]]'' that have become useless. Garbage collection is automatic, that is to say does not require any change to the text of the ''[[#System|systems]]'' whose objects are being recycled.
+
+==Generalization==
+:The process of turning specialized program elements into general-purpose, ''[[#Reusable software component|reusable software components]]''.
+
+==Generating class==
+:Same as ''[[#Generator (of an object)|generator]]''.
+
+==Generator (of an object)==
+:The class of which the ''[[#Object|object]]'' is a ''[[#Direct instance (of a class)|direct instance]]''.
+
+==Generic class==
+:A class having formal parameters representing types. Such a class will yield a type only through ''[[#Generic derivation|generic derivation]]''.
+
+==Generic derivation==
+:The process of providing a type for each formal generic parameter of a ''[[#Generic class|generic class]]'', yielding a type as a result.
+
+==Genericity==
+:The support, by a software notation, for type-parameterized ''[[#Module|modules]]'; specifically, in an O-O notation, for ''[[#Generic class|generic classes]]''. Can be ''[[#Unconstrained genericity|unconstrained]]'' or ''[[#Constrained genericity|constrained]]''.
+
+==Heir (of a class)==
+:A class that inherits from the given class. Antonym: ''[[#Parent (of a class)|parent]]''.
+
+==Identity==
+:See ''[[#Object identity|object identity]]''.
+
+==Information hiding==
+:The ability to prevent certain aspects of a class from being accessible to its ''[[#Client|clients]]'', through an explicit ''[[#Exporting a feature|exporting]]'' policy and through reliance on the ''[[#Short form (of a class)|short form]]'' as the primary vehicle for class documentation.
+
+==Inheritance==
+:A mechanism whereby a class is defined in reference to others, adding all their features to its own.
+
+==Instance (of a class)==
+:An ''[[#Object|object]]'' built according to the mold defined by the class or any one of its proper ''[[#Descendant (of a class)|descendants]]''. See also ''[[#Direct instance (of a class)|direct instance]]'', ''[[#Proper descendant (of a class)|proper descendant]]'', ''[[#Generator (of an object)|generator]]''.
+
+==Instance variable==
+:Smalltalk term for ''[[#Attribute|attribute]]''.
+
+==Interface (of a class)==
+:See ''[[#Contract|contract]]'', ''[[#Abstract data type (ADT)|abstract data type]]''.
+
+==Invariant==
+:See ''[[#Class invariant|class invariant]]'', ''[[#Loop invariant|loop invariant]]''.
+
+==Iterator==
+:A control structure describing preordained sequencing of some actions but not defining the actions themselves. Iterators often apply to data structures, such as an iterator describing the traversal of a list or a tree.
+
+==Loop invariant==
+:An ''[[#Assertion|assertion]]'' which must be satisfied prior to the first execution of a loop, and preserved by every iteration, so that it will hold on loop termination.
+
+==Loop variant==
+:An integer expression which must be non-negative prior to the first execution of a loop, and decreased by every iteration, so that it will garantee loop termination.
+
+==Message==
+:Routine call.
+
+==Metaclass==
+:A class whose instances are classes themselves.
+
+==Method==
+:Smalltalk term for ''[[#Routine|routine]]''.
+
+==Module==
+:A unit of software decomposition. In the ''[[#Object-oriented|object-oriented]]'' approach, classes provide the basic form of module.
+
+==Multiple inheritance==
+:The unrestricted form of ''[[#Inheritance|inheritance]]'', whereby a class may have any number of [[#Parent (of a class)|parents]]. Antonym: ''[[#Single inheritance|single inheritance]]''.
+
+==Non-separate==
+:Antonym of ''[[#Separate|separate]]''.
+
+==Novariance==
+:The policy prohibiting any feature ''[[#Redeclaration|redeclaration]]'' from changing the ''[[#Signature (of a feature)|signature]]''. See also: ''[[#Contravariance|contravariance]]'', ''[[#Covariance|covariance]]''.
+
+==Object==
+:A run-time data structure made of zero or more values, called ''[[#Field|fields]]'', and serving as the computer representation of an ''[[#Abstract object|abstract object]]''. Every object is an ''[[#Instance (of a class)|instance]]'' of some class.
+
+==Object identity==
+:A property that uniquely identifies an ''[[#Object|object]]'' independently of its current contents (''[[#Field|fields]]'').
+
+==Object-oriented==
+:Built from ''[[#Class|classes]]'', ''[[#Assertion|assertions]]'', ''[[#Genericity|genericity]]'', ''[[#Inheritance|inheritance]]'', ''[[#Polymorphism|polymorphism]]'' and ''[[#Dynamic binding|dynamic binding]]''.
+
+==Object-oriented analysis==
+:The application of ''[[#Object-oriented|object-oriented]]'' concepts to the modeling of problems and systems from both software and non-software domains.
+
+==Object-oriented database==
+:A repository of ''[[#Persistent object|persistent objects]]'', permitting their storage and retrieval on the basis of ''[[#Object-oriented|object-oriented]]'' concepts, and supporting database properties such as ''[[#Concurrent|concurrent]]'' access, locking and transactions.
+
+==Object-oriented design==
+:The process of building the architecture of ''[[#System|systems]]'' through ''[[#Object-oriented|object-oriented]]'' concepts.
+
+==Object-oriented implementation==
+:The process of building executable software systems through ''[[#Object-oriented|object-oriented]]'' concepts. Differs from ''[[#Object-oriented design|object-oriented design]]'' primarily by the level of abstraction.
+
+==Organized panic==
+:Along with ''[[#Resumption|resumption]]'' and ''[[#False alarm|false alarm]]'', one of the three possible responses to an ''[[#Exception|exception]]''; abandons the execution of the current strategy, triggering an exception in the caller, after restoring the ''[[#Class invariant|class invariant]]'' for the ''[[#Current object (or: current instance)|current object]]''.
+
+==Overloading==
+:The ability to let a feature name denote two or more operations.
+
+==Package==
+:A ''[[#Module|module]]'' of non-object-oriented languages such as Ada, providing encapsulation of a set of variables and ''[[#Routine|routines]]''.
+
+==Parallel==
+:See ''[[#Concurrent|concurrent]]''.
+
+==Parameterized class==
+:See ''[[#Generic class|generic class]]''.
+
+==Parent (of a class)==
+:A class from which the given class inherits. Antonym: ''[[#Heir (of a class)|heir]]''.
+
+==Persistence==
+:The ability of a software development environment or language to make objects ''[[#Persistent object|persistent]]'' and support the retrieval of ''[[#Persistent object|persistent objects]]'' for use by systems.
+
+==Persistent object==
+:An object that (through storage in a file or database or transmission across a network) survives executions of systems that create or manipulate it. Antonym: ''[[#Transient object|transient object]]''.
+
+==Polymorphic data structure==
+:A ''[[#Container data structure|container data structure]]'' hosting ''[[#Object|objects]]'' of two or more possible types.
+
+==Polymorphism==
+:The ability for an element of the software text to denote, at run time, ''[[#Object|objects]]'' of two or more possible types.
+
+==Postcondition==
+:An ''[[#Assertion|assertion]]'' attached to a ''[[#Routine|routine]]'', which must be guaranteed by the routine's body on return from any call to the routine if the ''[[#Precondition|precondition]]'' was satisfied on entry. Part of the ''[[#Contract|contract]]'' governing the routine.
+
+==Precondition==
+:An ''[[#Assertion|assertion]]'' attached to a ''[[#Routine|routine]]'', which must be guaranteed by every ''[[#Client|client]]'' prior to any call to the routine. Part of the ''[[#Contract|contract]]'' governing the routine.
+
+==Predicate==
+:See ''[[#Assertion|assertion]]''.
+
+==Procedure==
+:A ''[[#Routine|routine]]'' which does not return a result. (The other form of routine is the ''[[#Function|function]]''.)
+
+==Processor==
+:A mechanism providing a single thread of computation. May be a physical device, such as the CPU of a computer, or a software device, such as a task or thread of an operating system.
+
+==Program==
+:See ''[[#System|system]]''.
+
+==Proper ancestor (of a class)==
+:A direct or indirect ''[[#Parent (of a class)|parent]]'' of the class.
+
+==Proper descendant (of a class)==
+:A direct or indirect ''[[#Heir (of a class)|heir]]'' of the class.
+
+==Redeclaration==
+:A feature declaration which, instead of introducing a new feature, adapts some properties (such as the ''[[#Signature (of a feature)|signature]]'', ''[[#Precondition|precondition]]'', ''[[#Postcondition|postcondition]]'', implementation, ''[[#Deferred feature|deferred]]''/''[[#Effective feature|effective]]'' status, but not the name) of a feature inherited from a ''[[#Parent (of a class)|parent]]''. A redeclaration may be a ''[[#Redefinition|redefinition]]'' or an ''[[#Effecting|effecting]]''. See also ''[[#Feature renaming|feature renaming]]''.
+
+==Redefinition==
+:A ''[[#Redeclaration|redeclaration]]'' which is not an ''[[#Effecting|effecting]]'', that is to say, changes some properties of a feature inherited as ''[[#Effective feature|effective]]'', or changes the specification of a feature inherited as ''[[#Deferred feature|deferred]]'' while leaving it deferred.
+
+==Reference==
+:A run-time value that uniquely identifies an ''[[#Object|object]]''.
+
+==Renaming==
+:See ''[[#Feature renaming|feature renaming]]''.
+
+==Representation==
+:The physical layout of data in RAM (or other storage), and the choices of what data is stored and what data is computed at run time, in order to represent the ''[[#Abstract data type (ADT)|abstract data type]]'' in question.
+
+==Representation Independence==
+:The ability of a class to present an unchanging interface to its ''[[#Client|clients]]'', and implement alternate ''[[#Representation|representations]]'' of the underlying object without the clients needing to know or care about it. In the ''[[#Object-oriented|object-oriented]]'' method, ''[[#Dynamic binding|dynamic binding]]'' and ''[[#Polymorphism|polymorphism]]'' are major contributors to making this possible.
+
+==Resumption==
+:See ''[[#Retrying|retrying]]''.
+
+==Retrying==
+:Along with ''[[#Organized panic|organized panic]]'' and ''[[#False alarm|false alarm]]'', one of the three possible responses to an ''[[#Exception|exception]]''; tries a new strategy for achieving the routine's ''[[#Contract|contract]]''.
+
+==Reusability==
+:The ability of a software development method to yield software elements that can be used in many different applications, and to support a software development process relying on pre-existing ''[[#Reusable software component|reusable software components]]''.
+
+==Reusable software component==
+:An element of software that can be used by many different applications.
+
+==Reversible development==
+:A software development process that lets insights gained in later phases affect the results obtained in earlier phases. Normally part of a ''[[#Seamless development|seamless development]]'' process.
+
+==Root class==
+:The ''[[#Generator (of an object)|generator]]'' of a system's ''[[#Root object|root object]]''. Executing the system means creating an ''[[#Instance (of a class)|instance]]'' of the root class (the root object), and calling a creation procedure on that instance.
+
+==Root object==
+:The first ''[[#Object|object]]'' created in the execution of a system.
+
+==Routine==
+:A computation defined in a class, and applicable to the ''[[#Instance (of a class)|instances]]'' of that class. Along with the ''[[#Attribute|attribute]]'', one of the two forms of ''[[#Feature|feature]]''.
+
+==Runtime (noun, one word)==
+:Any set of facilities supporting the execution of systems. See ''[[#Run time (noun, two words)|run time]]''.
+
+==Run time (noun, two words)==
+:The time when a ''[[#System|system]]'' is being executed. Also used as an adjective, with a hyphen, as in "the run-time value of an ''[[#Entity|entity]]''". See also ''[[#Dynamic|dynamic]]'' and ''[[#Runtime (noun, one word)|runtime]]''.
+
+==Schema evolution==
+:Change to one or more classes of which some ''[[#Persistent object|persistent]]'' instances exist.
+
+==Seamless development==
+:A software development process which uses a uniform method and notation throughout all activities, such as problem modeling and analysis, design, implementation and maintenance. See also ''[[#Reversible development|reversible development]]''.
+
+==Selective export==
+:See ''[[#Exporting a feature|exporting a feature]]''.
+
+==Separate==
+:Handled by a different ''[[#Processor|processor]]''. Antonym: non-separate.
+
+==Sequential==
+:Running on only one ''[[#Processor|processor]]''. Antonym: ''[[#Concurrent|concurrent]]''.
+
+==Short form (of a class)==
+:A form of class documentation generated from the class text, showing only interface properties of the class. The short form documents the ''[[#Contract|contract]]'' attached to the class and the underlying ''[[#Abstract data type (ADT)|abstract data type]]''.
+
+==Signature (of a feature)==
+:The type part of the feature's specification. For an ''[[#Attribute|attribute]]'' or a ''[[#Function|function]]'', includes the result type; for a ''[[#Routine|routine]]'', includes the number of arguments and the type of each.
+
+==Single inheritance==
+:A restricted form of ''[[#Inheritance|inheritance]]'' whereby each class may have at most one ''[[#Parent (of a class)|parent]]''. Antonym: ''[[#Multiple inheritance|multiple inheritance]]''.
+
+==Software component==
+:See ''[[#Reusable software component|reusable software component]]''.
+
+==Specification (of a class)==
+:The ''[[#Short form (of a class)|short form]]'' of the class.
+
+==Specification (of a feature)==
+:The properties of a feature that are relevant to a ''[[#Client|client]]''. Includes the name, ''[[#Signature (of a feature)|signature]]'', header comment and ''[[#Contract|contract]]'' of the feature.
+
+==Subcontract==
+:The ability of a class to let some proper ''[[#Descendant (of a class)|descendant]]'' handle some of its feature calls, thanks to ''[[#Redeclaration|redeclaration]]'' and ''[[#Dynamic binding|dynamic binding]]''.
+
+==Supplier==
+:A class that provides another, its ''[[#Client|client]]'', with features to be used through an interface specification (''[[#Contract|contract]]'').
+
+==Static==
+:Applying to the text of a ''[[#System|system]]'', not to a particular execution. Antonym: ''[[#Dynamic|dynamic]]''.
+
+==Static binding==
+:The premature choice of operation variant, resulting in possibly wrong results and (in favorable cases) run-time system crash.
+
+==Static typing==
+:The ability to check, on the basis of the software text alone, that no execution of a system will ever try to apply to an ''[[#Object|object]]'' an operation that is not applicable to that object.
+
+==Synchronous call==
+:A call which forces the caller to wait until it completes. Antonym: ''[[#Asynchronous call|asynchronous call]]''.
+
+==System==
+:A set of classes that can be assembled to produce an executable result.
+
+==Template==
+:C++ term for ''[[#Generic class|generic class]]'' (for ''[[#Unconstrained genericity|unconstrained genericity]]'' only).
+
+==Traitor==
+:A ''[[#Reference|reference]]'' to a ''[[#Separate|separate]]'' ''[[#Object|object]]'', associated in the software text with an ''[[#Entity|entity]]'' that is declared as non-separate.
+
+==Transient object==
+:An ''[[#Object|object]]'' that exists only during the execution of the system that creates it. Antonym: ''[[#Persistent object|persistent object]]''.
+
+==Type==
+:The description of a set of objects equipped with certain operations. In the ''[[#Object-oriented|object-oriented]]'' approach every type is based on a class.
+
+==Type checking, typing==
+:See ''[[#Static typing|static typing]]'', ''[[#Dynamic typing|dynamic typing]]''.
+
+==Unconstrained genericity==
+:A form of ''[[#Genericity|genericity]]'' where a formal generic parameter represents an arbitrary type. See ''[[#Constrained genericity|constrained genericity]]''.
+
+==Variant==
+:See ''[[#Loop variant|loop variant]]''.
+
+
+
diff --git a/documentation/18.11/index.wiki b/documentation/18.11/index.wiki
new file mode 100644
index 00000000..7b2a8def
--- /dev/null
+++ b/documentation/18.11/index.wiki
@@ -0,0 +1,27 @@
+[[Property:modification_date|Mon, 24 Sep 2018 13:20:40 GMT]]
+[[Property:publication_date|Thu, 06 Sep 2018 15:10:13 GMT]]
+[[Property:title|Documentation]]
+[[Property:description|Central repository of information about Eiffel and the products and technologies of Eiffel Software]]
+[[Property:weight|10]]
+[[Property:uuid|E79DA6D4-70AD-4542-8E9B-EEFC813EC748]]
+
+This is the Eiffel documentation site, with a wealth of resources on how to unleash the power of Eiffel. It is organized as a set of '''books''':
+
+* [[Eiffel]]: the language and method. The Eiffel book includes:
+** [[Eiffel Overview|Eiffel overview]]: to get a general idea of Eiffel, or refresh it if you haven't followed recent evolution.
+** [[Eiffel Tutorials|Eiffel tutorials]]: step-by-step presentation of Eiffel concepts and constructs, including:
+** [[Language reference|Language reference]]: Precise construct-by-construct descriptions.
+** [[Technical papers about Eiffel|Eiffel technical papers]]: tutorial presentations of specific Eiffel highlights, such as void safety and SCOOP (the concurrency mechanism).
+* [[EiffelStudio]]: the multi-platform development environment. The EiffelStudio book includes:
+** [[Introducing EiffelStudio]].
+** [[Setup and installation]].
+** [[EiffelStudio tutorials]]
+** [[Technical papers about EiffelStudio|Technical papers]] on specific concepts and tools
+* [[Solutions]]. EiffelStudio comes with numerous libraries, packages, and tools. The Solutions book includes:
+** Libraries: data structures, graphics, networking...
+** Packages
+** Tools
+* [[Glossary]]: clear definitions of the concepts underlying Eiffel: feature, routine, attribute, contract...
+* [[FAQ]]: everything you always wanted to ask about Eiffel.
+
+A number of sites outside of eiffel.org contain useful Eiffel resources. You can find a partial list [/contribute here].
diff --git a/documentation/18.11/solutions/_files/eth-46802-01.pdf b/documentation/18.11/solutions/_files/eth-46802-01.pdf
new file mode 100644
index 00000000..6de5f6d5
Binary files /dev/null and b/documentation/18.11/solutions/_files/eth-46802-01.pdf differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_Choosing_a_size_definition.png b/documentation/18.11/solutions/_images/EiffelRibbon_Choosing_a_size_definition.png
new file mode 100644
index 00000000..5da14ca1
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_Choosing_a_size_definition.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_Choosing_a_size_definition.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_Choosing_a_size_definition.png.data
new file mode 100644
index 00000000..f646fbe9
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_Choosing_a_size_definition.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon Choose Size Definition
+author=halw
+path=content/eiffelribbon-choose-size-definition
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_application_01.png b/documentation/18.11/solutions/_images/EiffelRibbon_application_01.png
new file mode 100644
index 00000000..e508ccfb
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_application_01.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_application_01.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_application_01.png.data
new file mode 100644
index 00000000..145d3688
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_application_01.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon application 01
+author=halw
+path=content/eiffelribbon-application-01
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_01.png b/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_01.png
new file mode 100644
index 00000000..1074ddcd
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_01.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_01.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_01.png.data
new file mode 100644
index 00000000..e1d437cf
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_01.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon design tool 01
+author=halw
+path=content/eiffelribbon-design-tool-01
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_02_0.png b/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_02_0.png
new file mode 100644
index 00000000..a33aab57
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_02_0.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_02_0.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_02_0.png.data
new file mode 100644
index 00000000..8f06e3f9
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_design_tool_02_0.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon design tool 02
+author=halw
+path=content/eiffelribbon-design-tool-02
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01.png b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01.png
new file mode 100644
index 00000000..7ac821d3
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01.png.data
new file mode 100644
index 00000000..ccc3c9ff
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon scaling policy 01
+author=halw
+path=content/eiffelribbon-scaling-policy-01
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01a.png b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01a.png
new file mode 100644
index 00000000..532bb76b
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01a.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01a.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01a.png.data
new file mode 100644
index 00000000..8fc24cd9
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_01a.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon scaling policy 01a
+author=halw
+path=content/eiffelribbon-scaling-policy-01a
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_02.png b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_02.png
new file mode 100644
index 00000000..3571ce41
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_02.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_02.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_02.png.data
new file mode 100644
index 00000000..ca2dcb96
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_02.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon scaling policy 02
+author=halw
+path=content/eiffelribbon-scaling-policy-02
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_03.png b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_03.png
new file mode 100644
index 00000000..895409f2
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_03.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_03.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_03.png.data
new file mode 100644
index 00000000..83b7abc1
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_03.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon scaling policy 03
+author=halw
+path=content/eiffelribbon-scaling-policy-03
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_04.png b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_04.png
new file mode 100644
index 00000000..2a4947db
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_04.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_04.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_04.png.data
new file mode 100644
index 00000000..5c5ca859
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_04.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon scaling policy 04
+author=halw
+path=content/eiffelribbon-scaling-policy-04
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_05.png b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_05.png
new file mode 100644
index 00000000..9e429f57
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_05.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_05.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_05.png.data
new file mode 100644
index 00000000..8f6f6a95
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_scaling_policy_05.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon scaling policy 05
+author=halw
+path=content/eiffelribbon-scaling-policy-05
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_01.png b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_01.png
new file mode 100644
index 00000000..a8bfab7f
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_01.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_01.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_01.png.data
new file mode 100644
index 00000000..c4378498
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_01.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon size definition editor
+author=halw
+path=content/eiffelribbon-size-definition-editor
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_02.png b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_02.png
new file mode 100644
index 00000000..9986104f
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_02.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_02.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_02.png.data
new file mode 100644
index 00000000..283d4d3a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_02.png.data
@@ -0,0 +1,3 @@
+title=Size Definition Editor 02
+author=halw
+path=content/size-definition-editor-02
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_03.png b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_03.png
new file mode 100644
index 00000000..0f5157d9
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_03.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_03.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_03.png.data
new file mode 100644
index 00000000..03327f28
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_size_definition_editor_03.png.data
@@ -0,0 +1,3 @@
+title=Size Definition Editor 03
+author=halw
+path=content/size-definition-editor-03
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_window_01.png b/documentation/18.11/solutions/_images/EiffelRibbon_window_01.png
new file mode 100644
index 00000000..09e4d7ea
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelRibbon_window_01.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelRibbon_window_01.png.data b/documentation/18.11/solutions/_images/EiffelRibbon_window_01.png.data
new file mode 100644
index 00000000..882a3639
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelRibbon_window_01.png.data
@@ -0,0 +1,3 @@
+title=EiffelRibbon window 01
+author=halw
+path=content/eiffelribbon-window-01
diff --git a/documentation/18.11/solutions/_images/EiffelStudio_after_class_pick_and_drop2.png b/documentation/18.11/solutions/_images/EiffelStudio_after_class_pick_and_drop2.png
new file mode 100644
index 00000000..3c7fda81
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelStudio_after_class_pick_and_drop2.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelStudio_after_class_pick_and_drop2.png.data b/documentation/18.11/solutions/_images/EiffelStudio_after_class_pick_and_drop2.png.data
new file mode 100644
index 00000000..ce31560f
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelStudio_after_class_pick_and_drop2.png.data
@@ -0,0 +1,3 @@
+title=EiffelStudio after class pick and drop2
+author=vwheeler
+path=content/eiffelstudio-after-class-pick-and-drop2
diff --git a/documentation/18.11/solutions/_images/EiffelStudio_during_class_pick_and_drop2.png b/documentation/18.11/solutions/_images/EiffelStudio_during_class_pick_and_drop2.png
new file mode 100644
index 00000000..84121c9a
Binary files /dev/null and b/documentation/18.11/solutions/_images/EiffelStudio_during_class_pick_and_drop2.png differ
diff --git a/documentation/18.11/solutions/_images/EiffelStudio_during_class_pick_and_drop2.png.data b/documentation/18.11/solutions/_images/EiffelStudio_during_class_pick_and_drop2.png.data
new file mode 100644
index 00000000..1049a16b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/EiffelStudio_during_class_pick_and_drop2.png.data
@@ -0,0 +1,3 @@
+title=EiffelStudio during class pick and drop2
+author=vwheeler
+path=content/eiffelstudio-during-class-pick-and-drop2
diff --git a/documentation/18.11/solutions/_images/SCOOP_project_setting.png b/documentation/18.11/solutions/_images/SCOOP_project_setting.png
new file mode 100644
index 00000000..ed910508
Binary files /dev/null and b/documentation/18.11/solutions/_images/SCOOP_project_setting.png differ
diff --git a/documentation/18.11/solutions/_images/SCOOP_project_setting.png.data b/documentation/18.11/solutions/_images/SCOOP_project_setting.png.data
new file mode 100644
index 00000000..67134d8c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/SCOOP_project_setting.png.data
@@ -0,0 +1,3 @@
+title=SCOOP project setting
+author=halw
+path=content/scoop-project-setting
diff --git a/documentation/18.11/solutions/_images/WEL_cursors_example_01.png b/documentation/18.11/solutions/_images/WEL_cursors_example_01.png
new file mode 100644
index 00000000..78132a01
Binary files /dev/null and b/documentation/18.11/solutions/_images/WEL_cursors_example_01.png differ
diff --git a/documentation/18.11/solutions/_images/WEL_cursors_example_01.png.data b/documentation/18.11/solutions/_images/WEL_cursors_example_01.png.data
new file mode 100644
index 00000000..6b5d6b8d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/WEL_cursors_example_01.png.data
@@ -0,0 +1,3 @@
+title=cursors
+author=halw
+path=content/cursors
diff --git a/documentation/18.11/solutions/_images/accelerator.png b/documentation/18.11/solutions/_images/accelerator.png
new file mode 100644
index 00000000..357ed96f
Binary files /dev/null and b/documentation/18.11/solutions/_images/accelerator.png differ
diff --git a/documentation/18.11/solutions/_images/accelerator.png.data b/documentation/18.11/solutions/_images/accelerator.png.data
new file mode 100644
index 00000000..a67971d5
--- /dev/null
+++ b/documentation/18.11/solutions/_images/accelerator.png.data
@@ -0,0 +1,3 @@
+title=accelerator
+author=admin
+path=content/accelerator
diff --git a/documentation/18.11/solutions/_images/analyz.png b/documentation/18.11/solutions/_images/analyz.png
new file mode 100644
index 00000000..a995b8b1
Binary files /dev/null and b/documentation/18.11/solutions/_images/analyz.png differ
diff --git a/documentation/18.11/solutions/_images/analyz.png.data b/documentation/18.11/solutions/_images/analyz.png.data
new file mode 100644
index 00000000..d1e8e91e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/analyz.png.data
@@ -0,0 +1,3 @@
+title=analyz
+author=admin
+path=content/analyz
diff --git a/documentation/18.11/solutions/_images/bilinear.png b/documentation/18.11/solutions/_images/bilinear.png
new file mode 100644
index 00000000..10f14708
Binary files /dev/null and b/documentation/18.11/solutions/_images/bilinear.png differ
diff --git a/documentation/18.11/solutions/_images/bilinear.png.data b/documentation/18.11/solutions/_images/bilinear.png.data
new file mode 100644
index 00000000..c50aa0a1
--- /dev/null
+++ b/documentation/18.11/solutions/_images/bilinear.png.data
@@ -0,0 +1,3 @@
+title=bilinear
+author=admin
+path=content/bilinear
diff --git a/documentation/18.11/solutions/_images/binary-tree.png b/documentation/18.11/solutions/_images/binary-tree.png
new file mode 100644
index 00000000..34050b5f
Binary files /dev/null and b/documentation/18.11/solutions/_images/binary-tree.png differ
diff --git a/documentation/18.11/solutions/_images/binary-tree.png.data b/documentation/18.11/solutions/_images/binary-tree.png.data
new file mode 100644
index 00000000..9b27d17e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/binary-tree.png.data
@@ -0,0 +1,3 @@
+title=binary-tree
+author=admin
+path=content/binary-tree
diff --git a/documentation/18.11/solutions/_images/bmpview.png b/documentation/18.11/solutions/_images/bmpview.png
new file mode 100644
index 00000000..04f5d01f
Binary files /dev/null and b/documentation/18.11/solutions/_images/bmpview.png differ
diff --git a/documentation/18.11/solutions/_images/bmpview.png.data b/documentation/18.11/solutions/_images/bmpview.png.data
new file mode 100644
index 00000000..e03e1961
--- /dev/null
+++ b/documentation/18.11/solutions/_images/bmpview.png.data
@@ -0,0 +1,3 @@
+title=bmpview
+author=admin
+path=content/bmpview
diff --git a/documentation/18.11/solutions/_images/browse.png b/documentation/18.11/solutions/_images/browse.png
new file mode 100644
index 00000000..f0405763
Binary files /dev/null and b/documentation/18.11/solutions/_images/browse.png differ
diff --git a/documentation/18.11/solutions/_images/browse.png.data b/documentation/18.11/solutions/_images/browse.png.data
new file mode 100644
index 00000000..add2e3c0
--- /dev/null
+++ b/documentation/18.11/solutions/_images/browse.png.data
@@ -0,0 +1,3 @@
+title=browse
+author=admin
+path=content/browse
diff --git a/documentation/18.11/solutions/_images/brushes.png b/documentation/18.11/solutions/_images/brushes.png
new file mode 100644
index 00000000..1702d7c5
Binary files /dev/null and b/documentation/18.11/solutions/_images/brushes.png differ
diff --git a/documentation/18.11/solutions/_images/brushes.png.data b/documentation/18.11/solutions/_images/brushes.png.data
new file mode 100644
index 00000000..65744589
--- /dev/null
+++ b/documentation/18.11/solutions/_images/brushes.png.data
@@ -0,0 +1,3 @@
+title=brushes
+author=admin
+path=content/brushes
diff --git a/documentation/18.11/solutions/_images/builder-window.png b/documentation/18.11/solutions/_images/builder-window.png
new file mode 100644
index 00000000..d1f53c12
Binary files /dev/null and b/documentation/18.11/solutions/_images/builder-window.png differ
diff --git a/documentation/18.11/solutions/_images/builder-window.png.data b/documentation/18.11/solutions/_images/builder-window.png.data
new file mode 100644
index 00000000..ef6e9f37
--- /dev/null
+++ b/documentation/18.11/solutions/_images/builder-window.png.data
@@ -0,0 +1,3 @@
+title=builder-window
+author=admin
+path=content/builder-window
diff --git a/documentation/18.11/solutions/_images/calculator.png b/documentation/18.11/solutions/_images/calculator.png
new file mode 100644
index 00000000..92d3e4a1
Binary files /dev/null and b/documentation/18.11/solutions/_images/calculator.png differ
diff --git a/documentation/18.11/solutions/_images/calculator.png.data b/documentation/18.11/solutions/_images/calculator.png.data
new file mode 100644
index 00000000..443e5e55
--- /dev/null
+++ b/documentation/18.11/solutions/_images/calculator.png.data
@@ -0,0 +1,3 @@
+title=calculator
+author=admin
+path=content/calculator
diff --git a/documentation/18.11/solutions/_images/change-font-dialog.png b/documentation/18.11/solutions/_images/change-font-dialog.png
new file mode 100644
index 00000000..e7f12c08
Binary files /dev/null and b/documentation/18.11/solutions/_images/change-font-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/change-font-dialog.png.data b/documentation/18.11/solutions/_images/change-font-dialog.png.data
new file mode 100644
index 00000000..6a884848
--- /dev/null
+++ b/documentation/18.11/solutions/_images/change-font-dialog.png.data
@@ -0,0 +1,3 @@
+title=change-font-dialog
+author=admin
+path=content/change-font-dialog
diff --git a/documentation/18.11/solutions/_images/class-project-diagram-client.png b/documentation/18.11/solutions/_images/class-project-diagram-client.png
new file mode 100644
index 00000000..cb9eb398
Binary files /dev/null and b/documentation/18.11/solutions/_images/class-project-diagram-client.png differ
diff --git a/documentation/18.11/solutions/_images/class-project-diagram-client.png.data b/documentation/18.11/solutions/_images/class-project-diagram-client.png.data
new file mode 100644
index 00000000..153e7801
--- /dev/null
+++ b/documentation/18.11/solutions/_images/class-project-diagram-client.png.data
@@ -0,0 +1,3 @@
+title=class-project-diagram-client
+author=admin
+path=content/class-project-diagram-client
diff --git a/documentation/18.11/solutions/_images/class-project-diagram.png b/documentation/18.11/solutions/_images/class-project-diagram.png
new file mode 100644
index 00000000..5a08decc
Binary files /dev/null and b/documentation/18.11/solutions/_images/class-project-diagram.png differ
diff --git a/documentation/18.11/solutions/_images/class-project-diagram.png.data b/documentation/18.11/solutions/_images/class-project-diagram.png.data
new file mode 100644
index 00000000..fb50fa1e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/class-project-diagram.png.data
@@ -0,0 +1,3 @@
+title=class-project-diagram
+author=admin
+path=content/class-project-diagram
diff --git a/documentation/18.11/solutions/_images/client-inheritance.png b/documentation/18.11/solutions/_images/client-inheritance.png
new file mode 100644
index 00000000..2e7c7d47
Binary files /dev/null and b/documentation/18.11/solutions/_images/client-inheritance.png differ
diff --git a/documentation/18.11/solutions/_images/client-inheritance.png.data b/documentation/18.11/solutions/_images/client-inheritance.png.data
new file mode 100644
index 00000000..9c62d107
--- /dev/null
+++ b/documentation/18.11/solutions/_images/client-inheritance.png.data
@@ -0,0 +1,3 @@
+title=client-inheritance
+author=admin
+path=content/client-inheritance
diff --git a/documentation/18.11/solutions/_images/collaps.png b/documentation/18.11/solutions/_images/collaps.png
new file mode 100644
index 00000000..11d6328d
Binary files /dev/null and b/documentation/18.11/solutions/_images/collaps.png differ
diff --git a/documentation/18.11/solutions/_images/collaps.png.data b/documentation/18.11/solutions/_images/collaps.png.data
new file mode 100644
index 00000000..e30d9b5c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/collaps.png.data
@@ -0,0 +1,3 @@
+title=collaps
+author=admin
+path=content/collaps
diff --git a/documentation/18.11/solutions/_images/com-1.gif b/documentation/18.11/solutions/_images/com-1.gif
new file mode 100644
index 00000000..3375032f
Binary files /dev/null and b/documentation/18.11/solutions/_images/com-1.gif differ
diff --git a/documentation/18.11/solutions/_images/com-1.gif.data b/documentation/18.11/solutions/_images/com-1.gif.data
new file mode 100644
index 00000000..c02f4e4c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/com-1.gif.data
@@ -0,0 +1,3 @@
+title=com-1
+author=admin
+path=content/com-1
diff --git a/documentation/18.11/solutions/_images/com-2.gif b/documentation/18.11/solutions/_images/com-2.gif
new file mode 100644
index 00000000..799449c9
Binary files /dev/null and b/documentation/18.11/solutions/_images/com-2.gif differ
diff --git a/documentation/18.11/solutions/_images/com-2.gif.data b/documentation/18.11/solutions/_images/com-2.gif.data
new file mode 100644
index 00000000..88823968
--- /dev/null
+++ b/documentation/18.11/solutions/_images/com-2.gif.data
@@ -0,0 +1,3 @@
+title=com-2
+author=admin
+path=content/com-2
diff --git a/documentation/18.11/solutions/_images/com-3.gif b/documentation/18.11/solutions/_images/com-3.gif
new file mode 100644
index 00000000..51caff35
Binary files /dev/null and b/documentation/18.11/solutions/_images/com-3.gif differ
diff --git a/documentation/18.11/solutions/_images/com-3.gif.data b/documentation/18.11/solutions/_images/com-3.gif.data
new file mode 100644
index 00000000..72dadb05
--- /dev/null
+++ b/documentation/18.11/solutions/_images/com-3.gif.data
@@ -0,0 +1,3 @@
+title=com-3
+author=admin
+path=content/com-3
diff --git a/documentation/18.11/solutions/_images/comctrls.png b/documentation/18.11/solutions/_images/comctrls.png
new file mode 100644
index 00000000..d697d282
Binary files /dev/null and b/documentation/18.11/solutions/_images/comctrls.png differ
diff --git a/documentation/18.11/solutions/_images/comctrls.png.data b/documentation/18.11/solutions/_images/comctrls.png.data
new file mode 100644
index 00000000..d3d63ba3
--- /dev/null
+++ b/documentation/18.11/solutions/_images/comctrls.png.data
@@ -0,0 +1,3 @@
+title=comctrls
+author=admin
+path=content/comctrls
diff --git a/documentation/18.11/solutions/_images/commands.png b/documentation/18.11/solutions/_images/commands.png
new file mode 100644
index 00000000..7beb4495
Binary files /dev/null and b/documentation/18.11/solutions/_images/commands.png differ
diff --git a/documentation/18.11/solutions/_images/commands.png.data b/documentation/18.11/solutions/_images/commands.png.data
new file mode 100644
index 00000000..2a0fb1df
--- /dev/null
+++ b/documentation/18.11/solutions/_images/commands.png.data
@@ -0,0 +1,3 @@
+title=commands
+author=admin
+path=content/commands
diff --git a/documentation/18.11/solutions/_images/complete-project-diagram.png b/documentation/18.11/solutions/_images/complete-project-diagram.png
new file mode 100644
index 00000000..0c5bf092
Binary files /dev/null and b/documentation/18.11/solutions/_images/complete-project-diagram.png differ
diff --git a/documentation/18.11/solutions/_images/complete-project-diagram.png.data b/documentation/18.11/solutions/_images/complete-project-diagram.png.data
new file mode 100644
index 00000000..836016cd
--- /dev/null
+++ b/documentation/18.11/solutions/_images/complete-project-diagram.png.data
@@ -0,0 +1,3 @@
+title=complete-project-diagram
+author=admin
+path=content/complete-project-diagram
diff --git a/documentation/18.11/solutions/_images/component-create-relation.png b/documentation/18.11/solutions/_images/component-create-relation.png
new file mode 100644
index 00000000..5e1a0e0c
Binary files /dev/null and b/documentation/18.11/solutions/_images/component-create-relation.png differ
diff --git a/documentation/18.11/solutions/_images/component-create-relation.png.data b/documentation/18.11/solutions/_images/component-create-relation.png.data
new file mode 100644
index 00000000..9ba7749c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/component-create-relation.png.data
@@ -0,0 +1,3 @@
+title=component-create-relation
+author=admin
+path=content/component-create-relation
diff --git a/documentation/18.11/solutions/_images/component-fields-relation.png b/documentation/18.11/solutions/_images/component-fields-relation.png
new file mode 100644
index 00000000..c7a254ab
Binary files /dev/null and b/documentation/18.11/solutions/_images/component-fields-relation.png differ
diff --git a/documentation/18.11/solutions/_images/component-fields-relation.png.data b/documentation/18.11/solutions/_images/component-fields-relation.png.data
new file mode 100644
index 00000000..f2637321
--- /dev/null
+++ b/documentation/18.11/solutions/_images/component-fields-relation.png.data
@@ -0,0 +1,3 @@
+title=component-fields-relation
+author=admin
+path=content/component-fields-relation
diff --git a/documentation/18.11/solutions/_images/component-namer.png b/documentation/18.11/solutions/_images/component-namer.png
new file mode 100644
index 00000000..8f0730f3
Binary files /dev/null and b/documentation/18.11/solutions/_images/component-namer.png differ
diff --git a/documentation/18.11/solutions/_images/component-namer.png.data b/documentation/18.11/solutions/_images/component-namer.png.data
new file mode 100644
index 00000000..b63ecf01
--- /dev/null
+++ b/documentation/18.11/solutions/_images/component-namer.png.data
@@ -0,0 +1,3 @@
+title=component-namer
+author=admin
+path=content/component-namer
diff --git a/documentation/18.11/solutions/_images/component-navigate-relation.png b/documentation/18.11/solutions/_images/component-navigate-relation.png
new file mode 100644
index 00000000..11f0b9a0
Binary files /dev/null and b/documentation/18.11/solutions/_images/component-navigate-relation.png differ
diff --git a/documentation/18.11/solutions/_images/component-navigate-relation.png.data b/documentation/18.11/solutions/_images/component-navigate-relation.png.data
new file mode 100644
index 00000000..4da05873
--- /dev/null
+++ b/documentation/18.11/solutions/_images/component-navigate-relation.png.data
@@ -0,0 +1,3 @@
+title=component-navigate-relation
+author=admin
+path=content/component-navigate-relation
diff --git a/documentation/18.11/solutions/_images/component-search-relation.png b/documentation/18.11/solutions/_images/component-search-relation.png
new file mode 100644
index 00000000..14eeb1e4
Binary files /dev/null and b/documentation/18.11/solutions/_images/component-search-relation.png differ
diff --git a/documentation/18.11/solutions/_images/component-search-relation.png.data b/documentation/18.11/solutions/_images/component-search-relation.png.data
new file mode 100644
index 00000000..e6587c00
--- /dev/null
+++ b/documentation/18.11/solutions/_images/component-search-relation.png.data
@@ -0,0 +1,3 @@
+title=component-search-relation
+author=admin
+path=content/component-search-relation
diff --git a/documentation/18.11/solutions/_images/component-selector.png b/documentation/18.11/solutions/_images/component-selector.png
new file mode 100644
index 00000000..eceacf87
Binary files /dev/null and b/documentation/18.11/solutions/_images/component-selector.png differ
diff --git a/documentation/18.11/solutions/_images/component-selector.png.data b/documentation/18.11/solutions/_images/component-selector.png.data
new file mode 100644
index 00000000..b8a5de94
--- /dev/null
+++ b/documentation/18.11/solutions/_images/component-selector.png.data
@@ -0,0 +1,3 @@
+title=component-selector
+author=admin
+path=content/component-selector
diff --git a/documentation/18.11/solutions/_images/component-viewer.png b/documentation/18.11/solutions/_images/component-viewer.png
new file mode 100644
index 00000000..999f50d2
Binary files /dev/null and b/documentation/18.11/solutions/_images/component-viewer.png differ
diff --git a/documentation/18.11/solutions/_images/component-viewer.png.data b/documentation/18.11/solutions/_images/component-viewer.png.data
new file mode 100644
index 00000000..039deee8
--- /dev/null
+++ b/documentation/18.11/solutions/_images/component-viewer.png.data
@@ -0,0 +1,3 @@
+title=component-viewer
+author=admin
+path=content/component-viewer
diff --git a/documentation/18.11/solutions/_images/constant-in-use.png b/documentation/18.11/solutions/_images/constant-in-use.png
new file mode 100644
index 00000000..de7e2ee5
Binary files /dev/null and b/documentation/18.11/solutions/_images/constant-in-use.png differ
diff --git a/documentation/18.11/solutions/_images/constant-in-use.png.data b/documentation/18.11/solutions/_images/constant-in-use.png.data
new file mode 100644
index 00000000..2af3147b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/constant-in-use.png.data
@@ -0,0 +1,3 @@
+title=constant-in-use
+author=admin
+path=content/constant-use
diff --git a/documentation/18.11/solutions/_images/constants-dialog.png b/documentation/18.11/solutions/_images/constants-dialog.png
new file mode 100644
index 00000000..dba86c1c
Binary files /dev/null and b/documentation/18.11/solutions/_images/constants-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/constants-dialog.png.data b/documentation/18.11/solutions/_images/constants-dialog.png.data
new file mode 100644
index 00000000..edc8444a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/constants-dialog.png.data
@@ -0,0 +1,3 @@
+title=constants-dialog
+author=admin
+path=content/constants-dialog
diff --git a/documentation/18.11/solutions/_images/controls.png b/documentation/18.11/solutions/_images/controls.png
new file mode 100644
index 00000000..7620f411
Binary files /dev/null and b/documentation/18.11/solutions/_images/controls.png differ
diff --git a/documentation/18.11/solutions/_images/controls.png.data b/documentation/18.11/solutions/_images/controls.png.data
new file mode 100644
index 00000000..beed1437
--- /dev/null
+++ b/documentation/18.11/solutions/_images/controls.png.data
@@ -0,0 +1,3 @@
+title=controls
+author=admin
+path=content/controls
diff --git a/documentation/18.11/solutions/_images/creator-provider-relation.png b/documentation/18.11/solutions/_images/creator-provider-relation.png
new file mode 100644
index 00000000..915e8296
Binary files /dev/null and b/documentation/18.11/solutions/_images/creator-provider-relation.png differ
diff --git a/documentation/18.11/solutions/_images/creator-provider-relation.png.data b/documentation/18.11/solutions/_images/creator-provider-relation.png.data
new file mode 100644
index 00000000..34104a8e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/creator-provider-relation.png.data
@@ -0,0 +1,3 @@
+title=creator-provider-relation
+author=admin
+path=content/creator-provider-relation
diff --git a/documentation/18.11/solutions/_images/ctlcolor.png b/documentation/18.11/solutions/_images/ctlcolor.png
new file mode 100644
index 00000000..cb11de7d
Binary files /dev/null and b/documentation/18.11/solutions/_images/ctlcolor.png differ
diff --git a/documentation/18.11/solutions/_images/ctlcolor.png.data b/documentation/18.11/solutions/_images/ctlcolor.png.data
new file mode 100644
index 00000000..fb2e7e11
--- /dev/null
+++ b/documentation/18.11/solutions/_images/ctlcolor.png.data
@@ -0,0 +1,3 @@
+title=ctlcolor
+author=admin
+path=content/ctlcolor
diff --git a/documentation/18.11/solutions/_images/cursor-test.png b/documentation/18.11/solutions/_images/cursor-test.png
new file mode 100644
index 00000000..5d3732ca
Binary files /dev/null and b/documentation/18.11/solutions/_images/cursor-test.png differ
diff --git a/documentation/18.11/solutions/_images/cursor-test.png.data b/documentation/18.11/solutions/_images/cursor-test.png.data
new file mode 100644
index 00000000..aafaeb60
--- /dev/null
+++ b/documentation/18.11/solutions/_images/cursor-test.png.data
@@ -0,0 +1,3 @@
+title=cursor-test
+author=admin
+path=content/cursor-test
diff --git a/documentation/18.11/solutions/_images/date-time-picker.png b/documentation/18.11/solutions/_images/date-time-picker.png
new file mode 100644
index 00000000..b4457c74
Binary files /dev/null and b/documentation/18.11/solutions/_images/date-time-picker.png differ
diff --git a/documentation/18.11/solutions/_images/date-time-picker.png.data b/documentation/18.11/solutions/_images/date-time-picker.png.data
new file mode 100644
index 00000000..e62036cb
--- /dev/null
+++ b/documentation/18.11/solutions/_images/date-time-picker.png.data
@@ -0,0 +1,3 @@
+title=date-time-picker
+author=admin
+path=content/date-time-picker
diff --git a/documentation/18.11/solutions/_images/db-specific-tables-access-use.png b/documentation/18.11/solutions/_images/db-specific-tables-access-use.png
new file mode 100644
index 00000000..0dc0b789
Binary files /dev/null and b/documentation/18.11/solutions/_images/db-specific-tables-access-use.png differ
diff --git a/documentation/18.11/solutions/_images/db-specific-tables-access-use.png.data b/documentation/18.11/solutions/_images/db-specific-tables-access-use.png.data
new file mode 100644
index 00000000..c56f705a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/db-specific-tables-access-use.png.data
@@ -0,0 +1,3 @@
+title=db-specific-tables-access-use
+author=admin
+path=content/db-specific-tables-access-use
diff --git a/documentation/18.11/solutions/_images/directory-search-small.png b/documentation/18.11/solutions/_images/directory-search-small.png
new file mode 100644
index 00000000..31284d40
Binary files /dev/null and b/documentation/18.11/solutions/_images/directory-search-small.png differ
diff --git a/documentation/18.11/solutions/_images/directory-search-small.png.data b/documentation/18.11/solutions/_images/directory-search-small.png.data
new file mode 100644
index 00000000..898da872
--- /dev/null
+++ b/documentation/18.11/solutions/_images/directory-search-small.png.data
@@ -0,0 +1,3 @@
+title=directory-search-small
+author=admin
+path=content/directory-search-small
diff --git a/documentation/18.11/solutions/_images/diskspace.png b/documentation/18.11/solutions/_images/diskspace.png
new file mode 100644
index 00000000..38cc5b0a
Binary files /dev/null and b/documentation/18.11/solutions/_images/diskspace.png differ
diff --git a/documentation/18.11/solutions/_images/diskspace.png.data b/documentation/18.11/solutions/_images/diskspace.png.data
new file mode 100644
index 00000000..458541b7
--- /dev/null
+++ b/documentation/18.11/solutions/_images/diskspace.png.data
@@ -0,0 +1,3 @@
+title=diskspace
+author=admin
+path=content/diskspace
diff --git a/documentation/18.11/solutions/_images/display-window.png b/documentation/18.11/solutions/_images/display-window.png
new file mode 100644
index 00000000..51c80846
Binary files /dev/null and b/documentation/18.11/solutions/_images/display-window.png differ
diff --git a/documentation/18.11/solutions/_images/display-window.png.data b/documentation/18.11/solutions/_images/display-window.png.data
new file mode 100644
index 00000000..8ff7fa9d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/display-window.png.data
@@ -0,0 +1,3 @@
+title=display-window
+author=admin
+path=content/display-window
diff --git a/documentation/18.11/solutions/_images/docked-external.png b/documentation/18.11/solutions/_images/docked-external.png
new file mode 100644
index 00000000..f1d2633d
Binary files /dev/null and b/documentation/18.11/solutions/_images/docked-external.png differ
diff --git a/documentation/18.11/solutions/_images/docked-external.png.data b/documentation/18.11/solutions/_images/docked-external.png.data
new file mode 100644
index 00000000..2c5167b5
--- /dev/null
+++ b/documentation/18.11/solutions/_images/docked-external.png.data
@@ -0,0 +1,3 @@
+title=docked-external
+author=admin
+path=content/docked-external
diff --git a/documentation/18.11/solutions/_images/docking-insert.png b/documentation/18.11/solutions/_images/docking-insert.png
new file mode 100644
index 00000000..549dbced
Binary files /dev/null and b/documentation/18.11/solutions/_images/docking-insert.png differ
diff --git a/documentation/18.11/solutions/_images/docking-insert.png.data b/documentation/18.11/solutions/_images/docking-insert.png.data
new file mode 100644
index 00000000..f7a7b0ea
--- /dev/null
+++ b/documentation/18.11/solutions/_images/docking-insert.png.data
@@ -0,0 +1,3 @@
+title=docking-insert
+author=admin
+path=content/docking-insert
diff --git a/documentation/18.11/solutions/_images/dotnet-samples--date-time-picker-change-color-dlg.png b/documentation/18.11/solutions/_images/dotnet-samples--date-time-picker-change-color-dlg.png
new file mode 100644
index 00000000..7ddc37e9
Binary files /dev/null and b/documentation/18.11/solutions/_images/dotnet-samples--date-time-picker-change-color-dlg.png differ
diff --git a/documentation/18.11/solutions/_images/dotnet-samples--date-time-picker-change-color-dlg.png.data b/documentation/18.11/solutions/_images/dotnet-samples--date-time-picker-change-color-dlg.png.data
new file mode 100644
index 00000000..fdee864c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/dotnet-samples--date-time-picker-change-color-dlg.png.data
@@ -0,0 +1,3 @@
+title=dotnet-samples--date-time-picker-change-color-dlg
+author=admin
+path=content/dotnet-samples-date-time-picker-change-color-dlg
diff --git a/documentation/18.11/solutions/_images/dv-choice-creator-fkeys-selection.png b/documentation/18.11/solutions/_images/dv-choice-creator-fkeys-selection.png
new file mode 100644
index 00000000..dc67c313
Binary files /dev/null and b/documentation/18.11/solutions/_images/dv-choice-creator-fkeys-selection.png differ
diff --git a/documentation/18.11/solutions/_images/dv-choice-creator-fkeys-selection.png.data b/documentation/18.11/solutions/_images/dv-choice-creator-fkeys-selection.png.data
new file mode 100644
index 00000000..27c899e4
--- /dev/null
+++ b/documentation/18.11/solutions/_images/dv-choice-creator-fkeys-selection.png.data
@@ -0,0 +1,3 @@
+title=dv-choice-creator-fkeys-selection
+author=admin
+path=content/dv-choice-creator-fkeys-selection
diff --git a/documentation/18.11/solutions/_images/dv-table-component-strategy.png b/documentation/18.11/solutions/_images/dv-table-component-strategy.png
new file mode 100644
index 00000000..297796f5
Binary files /dev/null and b/documentation/18.11/solutions/_images/dv-table-component-strategy.png differ
diff --git a/documentation/18.11/solutions/_images/dv-table-component-strategy.png.data b/documentation/18.11/solutions/_images/dv-table-component-strategy.png.data
new file mode 100644
index 00000000..25ab5022
--- /dev/null
+++ b/documentation/18.11/solutions/_images/dv-table-component-strategy.png.data
@@ -0,0 +1,3 @@
+title=dv-table-component-strategy
+author=admin
+path=content/dv-table-component-strategy
diff --git a/documentation/18.11/solutions/_images/dv-tablerow-fields-design.png b/documentation/18.11/solutions/_images/dv-tablerow-fields-design.png
new file mode 100644
index 00000000..7ad801ff
Binary files /dev/null and b/documentation/18.11/solutions/_images/dv-tablerow-fields-design.png differ
diff --git a/documentation/18.11/solutions/_images/dv-tablerow-fields-design.png.data b/documentation/18.11/solutions/_images/dv-tablerow-fields-design.png.data
new file mode 100644
index 00000000..2e03a458
--- /dev/null
+++ b/documentation/18.11/solutions/_images/dv-tablerow-fields-design.png.data
@@ -0,0 +1,3 @@
+title=dv-tablerow-fields-design
+author=admin
+path=content/dv-tablerow-fields-design
diff --git a/documentation/18.11/solutions/_images/dv-tablerows-navigator-clients.png b/documentation/18.11/solutions/_images/dv-tablerows-navigator-clients.png
new file mode 100644
index 00000000..efa0608d
Binary files /dev/null and b/documentation/18.11/solutions/_images/dv-tablerows-navigator-clients.png differ
diff --git a/documentation/18.11/solutions/_images/dv-tablerows-navigator-clients.png.data b/documentation/18.11/solutions/_images/dv-tablerows-navigator-clients.png.data
new file mode 100644
index 00000000..3aaf8ace
--- /dev/null
+++ b/documentation/18.11/solutions/_images/dv-tablerows-navigator-clients.png.data
@@ -0,0 +1,3 @@
+title=dv-tablerows-navigator-clients
+author=admin
+path=content/dv-tablerows-navigator-clients
diff --git a/documentation/18.11/solutions/_images/eb_type_selector.png b/documentation/18.11/solutions/_images/eb_type_selector.png
new file mode 100644
index 00000000..b3d1d51c
Binary files /dev/null and b/documentation/18.11/solutions/_images/eb_type_selector.png differ
diff --git a/documentation/18.11/solutions/_images/eb_type_selector.png.data b/documentation/18.11/solutions/_images/eb_type_selector.png.data
new file mode 100644
index 00000000..617a567c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/eb_type_selector.png.data
@@ -0,0 +1,3 @@
+title=type-selector
+author=halw
+path=content/type-selector
diff --git a/documentation/18.11/solutions/_images/empty-radio-merge.png b/documentation/18.11/solutions/_images/empty-radio-merge.png
new file mode 100644
index 00000000..1b8cabd7
Binary files /dev/null and b/documentation/18.11/solutions/_images/empty-radio-merge.png differ
diff --git a/documentation/18.11/solutions/_images/empty-radio-merge.png.data b/documentation/18.11/solutions/_images/empty-radio-merge.png.data
new file mode 100644
index 00000000..53eba3b7
--- /dev/null
+++ b/documentation/18.11/solutions/_images/empty-radio-merge.png.data
@@ -0,0 +1,3 @@
+title=empty-radio-merge
+author=admin
+path=content/empty-radio-merge
diff --git a/documentation/18.11/solutions/_images/estore-generation.generator.png b/documentation/18.11/solutions/_images/estore-generation.generator.png
new file mode 100644
index 00000000..3b7465b9
Binary files /dev/null and b/documentation/18.11/solutions/_images/estore-generation.generator.png differ
diff --git a/documentation/18.11/solutions/_images/estore-generation.generator.png.data b/documentation/18.11/solutions/_images/estore-generation.generator.png.data
new file mode 100644
index 00000000..c0e87aec
--- /dev/null
+++ b/documentation/18.11/solutions/_images/estore-generation.generator.png.data
@@ -0,0 +1 @@
+title=estore-generation.generator
diff --git a/documentation/18.11/solutions/_images/event-selection-dialog.png b/documentation/18.11/solutions/_images/event-selection-dialog.png
new file mode 100644
index 00000000..bf49c8cb
Binary files /dev/null and b/documentation/18.11/solutions/_images/event-selection-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/event-selection-dialog.png.data b/documentation/18.11/solutions/_images/event-selection-dialog.png.data
new file mode 100644
index 00000000..29ac578f
--- /dev/null
+++ b/documentation/18.11/solutions/_images/event-selection-dialog.png.data
@@ -0,0 +1,3 @@
+title=event-selection-dialog
+author=admin
+path=content/event-selection-dialog
diff --git a/documentation/18.11/solutions/_images/ex_cust_pref_dialog.png b/documentation/18.11/solutions/_images/ex_cust_pref_dialog.png
new file mode 100644
index 00000000..995d229a
Binary files /dev/null and b/documentation/18.11/solutions/_images/ex_cust_pref_dialog.png differ
diff --git a/documentation/18.11/solutions/_images/ex_cust_pref_dialog.png.data b/documentation/18.11/solutions/_images/ex_cust_pref_dialog.png.data
new file mode 100644
index 00000000..05bb716b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/ex_cust_pref_dialog.png.data
@@ -0,0 +1,3 @@
+title=custom
+author=jfiat
+path=content/custom
diff --git a/documentation/18.11/solutions/_images/ex_pref_dialog.png b/documentation/18.11/solutions/_images/ex_pref_dialog.png
new file mode 100644
index 00000000..84bb9eeb
Binary files /dev/null and b/documentation/18.11/solutions/_images/ex_pref_dialog.png differ
diff --git a/documentation/18.11/solutions/_images/ex_pref_dialog.png.data b/documentation/18.11/solutions/_images/ex_pref_dialog.png.data
new file mode 100644
index 00000000..a5135328
--- /dev/null
+++ b/documentation/18.11/solutions/_images/ex_pref_dialog.png.data
@@ -0,0 +1,3 @@
+title=normal
+author=jfiat
+path=content/normal
diff --git a/documentation/18.11/solutions/_images/exception-raising.png b/documentation/18.11/solutions/_images/exception-raising.png
new file mode 100644
index 00000000..937b5f8c
Binary files /dev/null and b/documentation/18.11/solutions/_images/exception-raising.png differ
diff --git a/documentation/18.11/solutions/_images/exception-raising.png.data b/documentation/18.11/solutions/_images/exception-raising.png.data
new file mode 100644
index 00000000..e6b8c1db
--- /dev/null
+++ b/documentation/18.11/solutions/_images/exception-raising.png.data
@@ -0,0 +1,3 @@
+title=exception-raising
+author=admin
+path=content/exception-raising
diff --git a/documentation/18.11/solutions/_images/expand.png b/documentation/18.11/solutions/_images/expand.png
new file mode 100644
index 00000000..169b32bd
Binary files /dev/null and b/documentation/18.11/solutions/_images/expand.png differ
diff --git a/documentation/18.11/solutions/_images/expand.png.data b/documentation/18.11/solutions/_images/expand.png.data
new file mode 100644
index 00000000..fe304446
--- /dev/null
+++ b/documentation/18.11/solutions/_images/expand.png.data
@@ -0,0 +1,3 @@
+title=expand
+author=admin
+path=content/expand
diff --git a/documentation/18.11/solutions/_images/fig-1.gif b/documentation/18.11/solutions/_images/fig-1.gif
new file mode 100644
index 00000000..fee8d2b0
Binary files /dev/null and b/documentation/18.11/solutions/_images/fig-1.gif differ
diff --git a/documentation/18.11/solutions/_images/fig-1.gif.data b/documentation/18.11/solutions/_images/fig-1.gif.data
new file mode 100644
index 00000000..13ddd7ce
--- /dev/null
+++ b/documentation/18.11/solutions/_images/fig-1.gif.data
@@ -0,0 +1,3 @@
+title=fig-1
+author=admin
+path=content/fig-1
diff --git a/documentation/18.11/solutions/_images/fig-2.gif b/documentation/18.11/solutions/_images/fig-2.gif
new file mode 100644
index 00000000..1a415e05
Binary files /dev/null and b/documentation/18.11/solutions/_images/fig-2.gif differ
diff --git a/documentation/18.11/solutions/_images/fig-2.gif.data b/documentation/18.11/solutions/_images/fig-2.gif.data
new file mode 100644
index 00000000..f17fd854
--- /dev/null
+++ b/documentation/18.11/solutions/_images/fig-2.gif.data
@@ -0,0 +1,3 @@
+title=fig-2
+author=admin
+path=content/fig-2
diff --git a/documentation/18.11/solutions/_images/fig-3.gif b/documentation/18.11/solutions/_images/fig-3.gif
new file mode 100644
index 00000000..7129ed5e
Binary files /dev/null and b/documentation/18.11/solutions/_images/fig-3.gif differ
diff --git a/documentation/18.11/solutions/_images/fig-3.gif.data b/documentation/18.11/solutions/_images/fig-3.gif.data
new file mode 100644
index 00000000..6c3ab9df
--- /dev/null
+++ b/documentation/18.11/solutions/_images/fig-3.gif.data
@@ -0,0 +1,3 @@
+title=fig-3
+author=admin
+path=content/fig-3
diff --git a/documentation/18.11/solutions/_images/figure1.png b/documentation/18.11/solutions/_images/figure1.png
new file mode 100644
index 00000000..6bc9af79
Binary files /dev/null and b/documentation/18.11/solutions/_images/figure1.png differ
diff --git a/documentation/18.11/solutions/_images/figure1.png.data b/documentation/18.11/solutions/_images/figure1.png.data
new file mode 100644
index 00000000..b6ad67ec
--- /dev/null
+++ b/documentation/18.11/solutions/_images/figure1.png.data
@@ -0,0 +1,3 @@
+title=figure1
+author=admin
+path=content/figure1
diff --git a/documentation/18.11/solutions/_images/fixed-child-positioner.png b/documentation/18.11/solutions/_images/fixed-child-positioner.png
new file mode 100644
index 00000000..2f26e484
Binary files /dev/null and b/documentation/18.11/solutions/_images/fixed-child-positioner.png differ
diff --git a/documentation/18.11/solutions/_images/fixed-child-positioner.png.data b/documentation/18.11/solutions/_images/fixed-child-positioner.png.data
new file mode 100644
index 00000000..a52f1d55
--- /dev/null
+++ b/documentation/18.11/solutions/_images/fixed-child-positioner.png.data
@@ -0,0 +1,3 @@
+title=fixed-child-positioner
+author=admin
+path=content/fixed-child-positioner
diff --git a/documentation/18.11/solutions/_images/folders.png b/documentation/18.11/solutions/_images/folders.png
new file mode 100644
index 00000000..b8047c56
Binary files /dev/null and b/documentation/18.11/solutions/_images/folders.png differ
diff --git a/documentation/18.11/solutions/_images/folders.png.data b/documentation/18.11/solutions/_images/folders.png.data
new file mode 100644
index 00000000..a39a60e3
--- /dev/null
+++ b/documentation/18.11/solutions/_images/folders.png.data
@@ -0,0 +1,3 @@
+title=folders
+author=admin
+path=content/folders
diff --git a/documentation/18.11/solutions/_images/fontenum.png b/documentation/18.11/solutions/_images/fontenum.png
new file mode 100644
index 00000000..bbe63048
Binary files /dev/null and b/documentation/18.11/solutions/_images/fontenum.png differ
diff --git a/documentation/18.11/solutions/_images/fontenum.png.data b/documentation/18.11/solutions/_images/fontenum.png.data
new file mode 100644
index 00000000..b05531ce
--- /dev/null
+++ b/documentation/18.11/solutions/_images/fontenum.png.data
@@ -0,0 +1,3 @@
+title=fontenum
+author=admin
+path=content/fontenum
diff --git a/documentation/18.11/solutions/_images/fun.png b/documentation/18.11/solutions/_images/fun.png
new file mode 100644
index 00000000..8b73e076
Binary files /dev/null and b/documentation/18.11/solutions/_images/fun.png differ
diff --git a/documentation/18.11/solutions/_images/fun.png.data b/documentation/18.11/solutions/_images/fun.png.data
new file mode 100644
index 00000000..d83a16d4
--- /dev/null
+++ b/documentation/18.11/solutions/_images/fun.png.data
@@ -0,0 +1,3 @@
+title=fun
+author=admin
+path=content/fun
diff --git a/documentation/18.11/solutions/_images/gauges.png b/documentation/18.11/solutions/_images/gauges.png
new file mode 100644
index 00000000..9315931d
Binary files /dev/null and b/documentation/18.11/solutions/_images/gauges.png differ
diff --git a/documentation/18.11/solutions/_images/gauges.png.data b/documentation/18.11/solutions/_images/gauges.png.data
new file mode 100644
index 00000000..90f4ef89
--- /dev/null
+++ b/documentation/18.11/solutions/_images/gauges.png.data
@@ -0,0 +1,3 @@
+title=gauges
+author=admin
+path=content/gauges
diff --git a/documentation/18.11/solutions/_images/header-ctrl.png b/documentation/18.11/solutions/_images/header-ctrl.png
new file mode 100644
index 00000000..a3f9b07c
Binary files /dev/null and b/documentation/18.11/solutions/_images/header-ctrl.png differ
diff --git a/documentation/18.11/solutions/_images/header-ctrl.png.data b/documentation/18.11/solutions/_images/header-ctrl.png.data
new file mode 100644
index 00000000..8f24e3ee
--- /dev/null
+++ b/documentation/18.11/solutions/_images/header-ctrl.png.data
@@ -0,0 +1,3 @@
+title=header-ctrl
+author=admin
+path=content/header-ctrl
diff --git a/documentation/18.11/solutions/_images/hello-world.png b/documentation/18.11/solutions/_images/hello-world.png
new file mode 100644
index 00000000..50074f12
Binary files /dev/null and b/documentation/18.11/solutions/_images/hello-world.png differ
diff --git a/documentation/18.11/solutions/_images/hello-world.png.data b/documentation/18.11/solutions/_images/hello-world.png.data
new file mode 100644
index 00000000..7d916963
--- /dev/null
+++ b/documentation/18.11/solutions/_images/hello-world.png.data
@@ -0,0 +1,3 @@
+title=hello-world
+author=admin
+path=content/hello-world
diff --git a/documentation/18.11/solutions/_images/hello.png b/documentation/18.11/solutions/_images/hello.png
new file mode 100644
index 00000000..e91d76d6
Binary files /dev/null and b/documentation/18.11/solutions/_images/hello.png differ
diff --git a/documentation/18.11/solutions/_images/hello.png.data b/documentation/18.11/solutions/_images/hello.png.data
new file mode 100644
index 00000000..3e08c3e1
--- /dev/null
+++ b/documentation/18.11/solutions/_images/hello.png.data
@@ -0,0 +1,3 @@
+title=hello
+author=admin
+path=content/hello
diff --git a/documentation/18.11/solutions/_images/history-window.png b/documentation/18.11/solutions/_images/history-window.png
new file mode 100644
index 00000000..f1ba2fb1
Binary files /dev/null and b/documentation/18.11/solutions/_images/history-window.png differ
diff --git a/documentation/18.11/solutions/_images/history-window.png.data b/documentation/18.11/solutions/_images/history-window.png.data
new file mode 100644
index 00000000..41e4cc8a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/history-window.png.data
@@ -0,0 +1,3 @@
+title=history-window
+author=admin
+path=content/history-window
diff --git a/documentation/18.11/solutions/_images/icon-builder-window-color.png b/documentation/18.11/solutions/_images/icon-builder-window-color.png
new file mode 100644
index 00000000..3c8a1c93
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-builder-window-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-builder-window-color.png.data b/documentation/18.11/solutions/_images/icon-builder-window-color.png.data
new file mode 100644
index 00000000..d1f73d5d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-builder-window-color.png.data
@@ -0,0 +1,3 @@
+title=icon-builder-window-color
+author=admin
+path=content/icon-builder-window-color
diff --git a/documentation/18.11/solutions/_images/icon-clipboard-color.png b/documentation/18.11/solutions/_images/icon-clipboard-color.png
new file mode 100644
index 00000000..58ec9a1e
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-clipboard-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-clipboard-color.png.data b/documentation/18.11/solutions/_images/icon-clipboard-color.png.data
new file mode 100644
index 00000000..77c83ab2
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-clipboard-color.png.data
@@ -0,0 +1,3 @@
+title=icon-clipboard-color
+author=admin
+path=content/icon-clipboard-color
diff --git a/documentation/18.11/solutions/_images/icon-cmd-history-color.png b/documentation/18.11/solutions/_images/icon-cmd-history-color.png
new file mode 100644
index 00000000..9ea3c510
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-cmd-history-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-cmd-history-color.png.data b/documentation/18.11/solutions/_images/icon-cmd-history-color.png.data
new file mode 100644
index 00000000..486395f3
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-cmd-history-color.png.data
@@ -0,0 +1,3 @@
+title=icon-cmd-history-color
+author=admin
+path=content/icon-cmd-history-color
diff --git a/documentation/18.11/solutions/_images/icon-code-generation-color.png b/documentation/18.11/solutions/_images/icon-code-generation-color.png
new file mode 100644
index 00000000..2d37bbbb
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-code-generation-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-code-generation-color.png.data b/documentation/18.11/solutions/_images/icon-code-generation-color.png.data
new file mode 100644
index 00000000..7bbe5723
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-code-generation-color.png.data
@@ -0,0 +1,3 @@
+title=icon-code-generation-color
+author=admin
+path=content/icon-code-generation-color
diff --git a/documentation/18.11/solutions/_images/icon-component-build-view-color.png b/documentation/18.11/solutions/_images/icon-component-build-view-color.png
new file mode 100644
index 00000000..fd65bb72
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-component-build-view-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-component-build-view-color.png.data b/documentation/18.11/solutions/_images/icon-component-build-view-color.png.data
new file mode 100644
index 00000000..679565a2
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-component-build-view-color.png.data
@@ -0,0 +1,3 @@
+title=icon-component-build-view-color
+author=admin
+path=content/icon-component-build-view-color
diff --git a/documentation/18.11/solutions/_images/icon-component-display-view-color.png b/documentation/18.11/solutions/_images/icon-component-display-view-color.png
new file mode 100644
index 00000000..15f4cd27
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-component-display-view-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-component-display-view-color.png.data b/documentation/18.11/solutions/_images/icon-component-display-view-color.png.data
new file mode 100644
index 00000000..3e3ae150
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-component-display-view-color.png.data
@@ -0,0 +1,3 @@
+title=icon-component-display-view-color
+author=admin
+path=content/icon-component-display-view-color
diff --git a/documentation/18.11/solutions/_images/icon-component-viewer-color.png b/documentation/18.11/solutions/_images/icon-component-viewer-color.png
new file mode 100644
index 00000000..a56e41c4
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-component-viewer-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-component-viewer-color.png.data b/documentation/18.11/solutions/_images/icon-component-viewer-color.png.data
new file mode 100644
index 00000000..cb501ac8
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-component-viewer-color.png.data
@@ -0,0 +1,3 @@
+title=icon-component-viewer-color
+author=admin
+path=content/icon-component-viewer-color
diff --git a/documentation/18.11/solutions/_images/icon-copy-color.png b/documentation/18.11/solutions/_images/icon-copy-color.png
new file mode 100644
index 00000000..c642c71d
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-copy-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-copy-color.png.data b/documentation/18.11/solutions/_images/icon-copy-color.png.data
new file mode 100644
index 00000000..6475245d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-copy-color.png.data
@@ -0,0 +1,3 @@
+title=icon-copy-color
+author=admin
+path=content/icon-copy-color
diff --git a/documentation/18.11/solutions/_images/icon-cut-color.png b/documentation/18.11/solutions/_images/icon-cut-color.png
new file mode 100644
index 00000000..f763a135
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-cut-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-cut-color.png.data b/documentation/18.11/solutions/_images/icon-cut-color.png.data
new file mode 100644
index 00000000..8b358260
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-cut-color.png.data
@@ -0,0 +1,3 @@
+title=icon-cut-color
+author=admin
+path=content/icon-cut-color
diff --git a/documentation/18.11/solutions/_images/icon-delete-small-color.png b/documentation/18.11/solutions/_images/icon-delete-small-color.png
new file mode 100644
index 00000000..af0d82d7
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-delete-small-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-delete-small-color.png.data b/documentation/18.11/solutions/_images/icon-delete-small-color.png.data
new file mode 100644
index 00000000..3ea76549
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-delete-small-color.png.data
@@ -0,0 +1,3 @@
+title=icon-delete-small-color
+author=admin
+path=content/icon-delete-small-color
diff --git a/documentation/18.11/solutions/_images/icon-display-window-color.png b/documentation/18.11/solutions/_images/icon-display-window-color.png
new file mode 100644
index 00000000..d61281f1
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-display-window-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-display-window-color.png.data b/documentation/18.11/solutions/_images/icon-display-window-color.png.data
new file mode 100644
index 00000000..7355ff9b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-display-window-color.png.data
@@ -0,0 +1,3 @@
+title=icon-display-window-color
+author=admin
+path=content/icon-display-window-color
diff --git a/documentation/18.11/solutions/_images/icon-expand-all-small-color.png b/documentation/18.11/solutions/_images/icon-expand-all-small-color.png
new file mode 100644
index 00000000..8570c546
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-expand-all-small-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-expand-all-small-color.png.data b/documentation/18.11/solutions/_images/icon-expand-all-small-color.png.data
new file mode 100644
index 00000000..f7c1184a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-expand-all-small-color.png.data
@@ -0,0 +1,3 @@
+title=icon-expand-all-small-color
+author=admin
+path=content/icon-expand-all-small-color
diff --git a/documentation/18.11/solutions/_images/icon-format-onces-color.png b/documentation/18.11/solutions/_images/icon-format-onces-color.png
new file mode 100644
index 00000000..b35948f3
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-format-onces-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-format-onces-color.png.data b/documentation/18.11/solutions/_images/icon-format-onces-color.png.data
new file mode 100644
index 00000000..f62c2ff1
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-format-onces-color.png.data
@@ -0,0 +1,3 @@
+title=icon-format-onces-color
+author=admin
+path=content/icon-format-onces-color
diff --git a/documentation/18.11/solutions/_images/icon-new-cluster-small-color.png b/documentation/18.11/solutions/_images/icon-new-cluster-small-color.png
new file mode 100644
index 00000000..adc0acf5
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-new-cluster-small-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-new-cluster-small-color.png.data b/documentation/18.11/solutions/_images/icon-new-cluster-small-color.png.data
new file mode 100644
index 00000000..ceecdfb1
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-new-cluster-small-color.png.data
@@ -0,0 +1,3 @@
+title=icon-new-cluster-small-color
+author=admin
+path=content/icon-new-cluster-small-color
diff --git a/documentation/18.11/solutions/_images/icon-object-editor-color.png b/documentation/18.11/solutions/_images/icon-object-editor-color.png
new file mode 100644
index 00000000..9af97b06
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-object-editor-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-object-editor-color.png.data b/documentation/18.11/solutions/_images/icon-object-editor-color.png.data
new file mode 100644
index 00000000..9e3d21e6
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-object-editor-color.png.data
@@ -0,0 +1,3 @@
+title=icon-object-editor-color
+author=admin
+path=content/icon-object-editor-color
diff --git a/documentation/18.11/solutions/_images/icon-past-color.png b/documentation/18.11/solutions/_images/icon-past-color.png
new file mode 100644
index 00000000..7c7213fe
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-past-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-past-color.png.data b/documentation/18.11/solutions/_images/icon-past-color.png.data
new file mode 100644
index 00000000..42ca6db1
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-past-color.png.data
@@ -0,0 +1,3 @@
+title=icon-past-color
+author=admin
+path=content/icon-past-color
diff --git a/documentation/18.11/solutions/_images/icon-redo-color.png b/documentation/18.11/solutions/_images/icon-redo-color.png
new file mode 100644
index 00000000..51771a46
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-redo-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-redo-color.png.data b/documentation/18.11/solutions/_images/icon-redo-color.png.data
new file mode 100644
index 00000000..f17ce25a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-redo-color.png.data
@@ -0,0 +1,3 @@
+title=icon-redo-color
+author=admin
+path=content/icon-redo-color
diff --git a/documentation/18.11/solutions/_images/icon-save-color.png b/documentation/18.11/solutions/_images/icon-save-color.png
new file mode 100644
index 00000000..f6970cfa
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-save-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-save-color.png.data b/documentation/18.11/solutions/_images/icon-save-color.png.data
new file mode 100644
index 00000000..b5155761
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-save-color.png.data
@@ -0,0 +1,3 @@
+title=icon-save-color
+author=admin
+path=content/icon-save-color
diff --git a/documentation/18.11/solutions/_images/icon-show-hide-directory-color.png b/documentation/18.11/solutions/_images/icon-show-hide-directory-color.png
new file mode 100644
index 00000000..7eb22ebc
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-show-hide-directory-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-show-hide-directory-color.png.data b/documentation/18.11/solutions/_images/icon-show-hide-directory-color.png.data
new file mode 100644
index 00000000..fccb5e63
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-show-hide-directory-color.png.data
@@ -0,0 +1,3 @@
+title=icon-show-hide-directory-color
+author=admin
+path=content/icon-show-hide-directory-color
diff --git a/documentation/18.11/solutions/_images/icon-system-color.png b/documentation/18.11/solutions/_images/icon-system-color.png
new file mode 100644
index 00000000..ca029ed4
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-system-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-system-color.png.data b/documentation/18.11/solutions/_images/icon-system-color.png.data
new file mode 100644
index 00000000..1dcb22b6
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-system-color.png.data
@@ -0,0 +1,3 @@
+title=icon-system-color
+author=admin
+path=content/icon-system-color
diff --git a/documentation/18.11/solutions/_images/icon-titled-window-main-small-color.png b/documentation/18.11/solutions/_images/icon-titled-window-main-small-color.png
new file mode 100644
index 00000000..e8fa114f
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-titled-window-main-small-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-titled-window-main-small-color.png.data b/documentation/18.11/solutions/_images/icon-titled-window-main-small-color.png.data
new file mode 100644
index 00000000..7ebf0819
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-titled-window-main-small-color.png.data
@@ -0,0 +1,3 @@
+title=icon-titled-window-main-small-color
+author=admin
+path=content/icon-titled-window-main-small-color
diff --git a/documentation/18.11/solutions/_images/icon-undo-color.png b/documentation/18.11/solutions/_images/icon-undo-color.png
new file mode 100644
index 00000000..2c731285
Binary files /dev/null and b/documentation/18.11/solutions/_images/icon-undo-color.png differ
diff --git a/documentation/18.11/solutions/_images/icon-undo-color.png.data b/documentation/18.11/solutions/_images/icon-undo-color.png.data
new file mode 100644
index 00000000..f23cb87b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/icon-undo-color.png.data
@@ -0,0 +1,3 @@
+title=icon-undo-color
+author=admin
+path=content/icon-undo-color
diff --git a/documentation/18.11/solutions/_images/implemented-interface-server.png b/documentation/18.11/solutions/_images/implemented-interface-server.png
new file mode 100644
index 00000000..64884539
Binary files /dev/null and b/documentation/18.11/solutions/_images/implemented-interface-server.png differ
diff --git a/documentation/18.11/solutions/_images/implemented-interface-server.png.data b/documentation/18.11/solutions/_images/implemented-interface-server.png.data
new file mode 100644
index 00000000..f330453d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/implemented-interface-server.png.data
@@ -0,0 +1,3 @@
+title=implemented-interface-server
+author=admin
+path=content/implemented-interface-server
diff --git a/documentation/18.11/solutions/_images/implemented-interface.png b/documentation/18.11/solutions/_images/implemented-interface.png
new file mode 100644
index 00000000..9b76f0c6
Binary files /dev/null and b/documentation/18.11/solutions/_images/implemented-interface.png differ
diff --git a/documentation/18.11/solutions/_images/implemented-interface.png.data b/documentation/18.11/solutions/_images/implemented-interface.png.data
new file mode 100644
index 00000000..92ad6739
--- /dev/null
+++ b/documentation/18.11/solutions/_images/implemented-interface.png.data
@@ -0,0 +1,3 @@
+title=implemented-interface
+author=admin
+path=content/implemented-interface
diff --git a/documentation/18.11/solutions/_images/import-project-clashes.png b/documentation/18.11/solutions/_images/import-project-clashes.png
new file mode 100644
index 00000000..85af0ce2
Binary files /dev/null and b/documentation/18.11/solutions/_images/import-project-clashes.png differ
diff --git a/documentation/18.11/solutions/_images/import-project-clashes.png.data b/documentation/18.11/solutions/_images/import-project-clashes.png.data
new file mode 100644
index 00000000..353b6d7e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/import-project-clashes.png.data
@@ -0,0 +1,3 @@
+title=import-project-clashes
+author=admin
+path=content/import-project-clashes
diff --git a/documentation/18.11/solutions/_images/import-project.png b/documentation/18.11/solutions/_images/import-project.png
new file mode 100644
index 00000000..da582d7b
Binary files /dev/null and b/documentation/18.11/solutions/_images/import-project.png differ
diff --git a/documentation/18.11/solutions/_images/import-project.png.data b/documentation/18.11/solutions/_images/import-project.png.data
new file mode 100644
index 00000000..27ce59e4
--- /dev/null
+++ b/documentation/18.11/solutions/_images/import-project.png.data
@@ -0,0 +1,3 @@
+title=import-project
+author=admin
+path=content/import-project
diff --git a/documentation/18.11/solutions/_images/interface-inheritance-server.png b/documentation/18.11/solutions/_images/interface-inheritance-server.png
new file mode 100644
index 00000000..5538d0da
Binary files /dev/null and b/documentation/18.11/solutions/_images/interface-inheritance-server.png differ
diff --git a/documentation/18.11/solutions/_images/interface-inheritance-server.png.data b/documentation/18.11/solutions/_images/interface-inheritance-server.png.data
new file mode 100644
index 00000000..e38e78b9
--- /dev/null
+++ b/documentation/18.11/solutions/_images/interface-inheritance-server.png.data
@@ -0,0 +1,3 @@
+title=interface-inheritance-server
+author=admin
+path=content/interface-inheritance-server
diff --git a/documentation/18.11/solutions/_images/interface-inheritance.png b/documentation/18.11/solutions/_images/interface-inheritance.png
new file mode 100644
index 00000000..6694a7b5
Binary files /dev/null and b/documentation/18.11/solutions/_images/interface-inheritance.png differ
diff --git a/documentation/18.11/solutions/_images/interface-inheritance.png.data b/documentation/18.11/solutions/_images/interface-inheritance.png.data
new file mode 100644
index 00000000..54a9f1e7
--- /dev/null
+++ b/documentation/18.11/solutions/_images/interface-inheritance.png.data
@@ -0,0 +1,3 @@
+title=interface-inheritance
+author=admin
+path=content/interface-inheritance
diff --git a/documentation/18.11/solutions/_images/introduction.png b/documentation/18.11/solutions/_images/introduction.png
new file mode 100644
index 00000000..63c75341
Binary files /dev/null and b/documentation/18.11/solutions/_images/introduction.png differ
diff --git a/documentation/18.11/solutions/_images/introduction.png.data b/documentation/18.11/solutions/_images/introduction.png.data
new file mode 100644
index 00000000..8d221f19
--- /dev/null
+++ b/documentation/18.11/solutions/_images/introduction.png.data
@@ -0,0 +1,3 @@
+title=introduction
+author=admin
+path=content/introduction
diff --git a/documentation/18.11/solutions/_images/layout-constructor-locked.png b/documentation/18.11/solutions/_images/layout-constructor-locked.png
new file mode 100644
index 00000000..dafe1fd9
Binary files /dev/null and b/documentation/18.11/solutions/_images/layout-constructor-locked.png differ
diff --git a/documentation/18.11/solutions/_images/layout-constructor-locked.png.data b/documentation/18.11/solutions/_images/layout-constructor-locked.png.data
new file mode 100644
index 00000000..cc9c0342
--- /dev/null
+++ b/documentation/18.11/solutions/_images/layout-constructor-locked.png.data
@@ -0,0 +1,3 @@
+title=layout-constructor-locked
+author=admin
+path=content/layout-constructor-locked
diff --git a/documentation/18.11/solutions/_images/layout-constructor.png b/documentation/18.11/solutions/_images/layout-constructor.png
new file mode 100644
index 00000000..3d059143
Binary files /dev/null and b/documentation/18.11/solutions/_images/layout-constructor.png differ
diff --git a/documentation/18.11/solutions/_images/layout-constructor.png.data b/documentation/18.11/solutions/_images/layout-constructor.png.data
new file mode 100644
index 00000000..20c4c245
--- /dev/null
+++ b/documentation/18.11/solutions/_images/layout-constructor.png.data
@@ -0,0 +1,3 @@
+title=layout-constructor
+author=admin
+path=content/layout-constructor
diff --git a/documentation/18.11/solutions/_images/linear.png b/documentation/18.11/solutions/_images/linear.png
new file mode 100644
index 00000000..686b5a76
Binary files /dev/null and b/documentation/18.11/solutions/_images/linear.png differ
diff --git a/documentation/18.11/solutions/_images/linear.png.data b/documentation/18.11/solutions/_images/linear.png.data
new file mode 100644
index 00000000..65c26c53
--- /dev/null
+++ b/documentation/18.11/solutions/_images/linear.png.data
@@ -0,0 +1,3 @@
+title=linear
+author=admin
+path=content/linear
diff --git a/documentation/18.11/solutions/_images/linked-list.png b/documentation/18.11/solutions/_images/linked-list.png
new file mode 100644
index 00000000..b59efa38
Binary files /dev/null and b/documentation/18.11/solutions/_images/linked-list.png differ
diff --git a/documentation/18.11/solutions/_images/linked-list.png.data b/documentation/18.11/solutions/_images/linked-list.png.data
new file mode 100644
index 00000000..1a34fafd
--- /dev/null
+++ b/documentation/18.11/solutions/_images/linked-list.png.data
@@ -0,0 +1,3 @@
+title=linked-list
+author=admin
+path=content/linked-list
diff --git a/documentation/18.11/solutions/_images/list-view.png b/documentation/18.11/solutions/_images/list-view.png
new file mode 100644
index 00000000..2fb59487
Binary files /dev/null and b/documentation/18.11/solutions/_images/list-view.png differ
diff --git a/documentation/18.11/solutions/_images/list-view.png.data b/documentation/18.11/solutions/_images/list-view.png.data
new file mode 100644
index 00000000..65ab23e2
--- /dev/null
+++ b/documentation/18.11/solutions/_images/list-view.png.data
@@ -0,0 +1,3 @@
+title=list-view
+author=admin
+path=content/list-view
diff --git a/documentation/18.11/solutions/_images/magnify.png b/documentation/18.11/solutions/_images/magnify.png
new file mode 100644
index 00000000..1a3f2e0a
Binary files /dev/null and b/documentation/18.11/solutions/_images/magnify.png differ
diff --git a/documentation/18.11/solutions/_images/magnify.png.data b/documentation/18.11/solutions/_images/magnify.png.data
new file mode 100644
index 00000000..81e2406b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/magnify.png.data
@@ -0,0 +1,3 @@
+title=magnify
+author=admin
+path=content/magnify
diff --git a/documentation/18.11/solutions/_images/main-window-with-docked-tools.png b/documentation/18.11/solutions/_images/main-window-with-docked-tools.png
new file mode 100644
index 00000000..4d5c7abd
Binary files /dev/null and b/documentation/18.11/solutions/_images/main-window-with-docked-tools.png differ
diff --git a/documentation/18.11/solutions/_images/main-window-with-docked-tools.png.data b/documentation/18.11/solutions/_images/main-window-with-docked-tools.png.data
new file mode 100644
index 00000000..d9d01722
--- /dev/null
+++ b/documentation/18.11/solutions/_images/main-window-with-docked-tools.png.data
@@ -0,0 +1,3 @@
+title=main-window-with-docked-tools
+author=admin
+path=content/main-window-docked-tools
diff --git a/documentation/18.11/solutions/_images/main-window.png b/documentation/18.11/solutions/_images/main-window.png
new file mode 100644
index 00000000..40fe5d97
Binary files /dev/null and b/documentation/18.11/solutions/_images/main-window.png differ
diff --git a/documentation/18.11/solutions/_images/main-window.png.data b/documentation/18.11/solutions/_images/main-window.png.data
new file mode 100644
index 00000000..fa8c5401
--- /dev/null
+++ b/documentation/18.11/solutions/_images/main-window.png.data
@@ -0,0 +1,3 @@
+title=main-window
+author=admin
+path=content/main-window
diff --git a/documentation/18.11/solutions/_images/mdi--mdi.png b/documentation/18.11/solutions/_images/mdi--mdi.png
new file mode 100644
index 00000000..72990721
Binary files /dev/null and b/documentation/18.11/solutions/_images/mdi--mdi.png differ
diff --git a/documentation/18.11/solutions/_images/mdi--mdi.png.data b/documentation/18.11/solutions/_images/mdi--mdi.png.data
new file mode 100644
index 00000000..a66ed60c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/mdi--mdi.png.data
@@ -0,0 +1,3 @@
+title=mdi--mdi
+author=admin
+path=content/mdi-mdi
diff --git a/documentation/18.11/solutions/_images/mdi.png b/documentation/18.11/solutions/_images/mdi.png
new file mode 100644
index 00000000..4b57a0b5
Binary files /dev/null and b/documentation/18.11/solutions/_images/mdi.png differ
diff --git a/documentation/18.11/solutions/_images/mdi.png.data b/documentation/18.11/solutions/_images/mdi.png.data
new file mode 100644
index 00000000..96c4efe1
--- /dev/null
+++ b/documentation/18.11/solutions/_images/mdi.png.data
@@ -0,0 +1,3 @@
+title=mdi
+author=admin
+path=content/mdi
diff --git a/documentation/18.11/solutions/_images/menu-contextuel.png b/documentation/18.11/solutions/_images/menu-contextuel.png
new file mode 100644
index 00000000..4211f3b9
Binary files /dev/null and b/documentation/18.11/solutions/_images/menu-contextuel.png differ
diff --git a/documentation/18.11/solutions/_images/menu-contextuel.png.data b/documentation/18.11/solutions/_images/menu-contextuel.png.data
new file mode 100644
index 00000000..183ab65c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/menu-contextuel.png.data
@@ -0,0 +1,3 @@
+title=menu-contextuel
+author=admin
+path=content/menu-contextuel
diff --git a/documentation/18.11/solutions/_images/menu-principal.png b/documentation/18.11/solutions/_images/menu-principal.png
new file mode 100644
index 00000000..c09b209d
Binary files /dev/null and b/documentation/18.11/solutions/_images/menu-principal.png differ
diff --git a/documentation/18.11/solutions/_images/menu-principal.png.data b/documentation/18.11/solutions/_images/menu-principal.png.data
new file mode 100644
index 00000000..3b9cc3cd
--- /dev/null
+++ b/documentation/18.11/solutions/_images/menu-principal.png.data
@@ -0,0 +1,3 @@
+title=menu-principal
+author=admin
+path=content/menu-principal
diff --git a/documentation/18.11/solutions/_images/menus.png b/documentation/18.11/solutions/_images/menus.png
new file mode 100644
index 00000000..c29b88de
Binary files /dev/null and b/documentation/18.11/solutions/_images/menus.png differ
diff --git a/documentation/18.11/solutions/_images/menus.png.data b/documentation/18.11/solutions/_images/menus.png.data
new file mode 100644
index 00000000..a2273820
--- /dev/null
+++ b/documentation/18.11/solutions/_images/menus.png.data
@@ -0,0 +1,3 @@
+title=menus
+author=admin
+path=content/menus
diff --git a/documentation/18.11/solutions/_images/message-box.png b/documentation/18.11/solutions/_images/message-box.png
new file mode 100644
index 00000000..1fe9d13a
Binary files /dev/null and b/documentation/18.11/solutions/_images/message-box.png differ
diff --git a/documentation/18.11/solutions/_images/message-box.png.data b/documentation/18.11/solutions/_images/message-box.png.data
new file mode 100644
index 00000000..fe44507d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/message-box.png.data
@@ -0,0 +1,3 @@
+title=message-box
+author=admin
+path=content/message-box
diff --git a/documentation/18.11/solutions/_images/minimal.png b/documentation/18.11/solutions/_images/minimal.png
new file mode 100644
index 00000000..3957f6a2
Binary files /dev/null and b/documentation/18.11/solutions/_images/minimal.png differ
diff --git a/documentation/18.11/solutions/_images/minimal.png.data b/documentation/18.11/solutions/_images/minimal.png.data
new file mode 100644
index 00000000..39874485
--- /dev/null
+++ b/documentation/18.11/solutions/_images/minimal.png.data
@@ -0,0 +1,3 @@
+title=minimal
+author=admin
+path=content/minimal
diff --git a/documentation/18.11/solutions/_images/model-view-relationship.png b/documentation/18.11/solutions/_images/model-view-relationship.png
new file mode 100644
index 00000000..27eae8cf
Binary files /dev/null and b/documentation/18.11/solutions/_images/model-view-relationship.png differ
diff --git a/documentation/18.11/solutions/_images/model-view-relationship.png.data b/documentation/18.11/solutions/_images/model-view-relationship.png.data
new file mode 100644
index 00000000..84e8b02e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/model-view-relationship.png.data
@@ -0,0 +1,3 @@
+title=model-view-relationship
+author=admin
+path=content/model-view-relationship
diff --git a/documentation/18.11/solutions/_images/new-directory-dialog.png b/documentation/18.11/solutions/_images/new-directory-dialog.png
new file mode 100644
index 00000000..79faf8a5
Binary files /dev/null and b/documentation/18.11/solutions/_images/new-directory-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/new-directory-dialog.png.data b/documentation/18.11/solutions/_images/new-directory-dialog.png.data
new file mode 100644
index 00000000..1c35e7b0
--- /dev/null
+++ b/documentation/18.11/solutions/_images/new-directory-dialog.png.data
@@ -0,0 +1,3 @@
+title=new-directory-dialog
+author=admin
+path=content/new-directory-dialog
diff --git a/documentation/18.11/solutions/_images/new-project.png b/documentation/18.11/solutions/_images/new-project.png
new file mode 100644
index 00000000..ef39da5b
Binary files /dev/null and b/documentation/18.11/solutions/_images/new-project.png differ
diff --git a/documentation/18.11/solutions/_images/new-project.png.data b/documentation/18.11/solutions/_images/new-project.png.data
new file mode 100644
index 00000000..d4b0fcce
--- /dev/null
+++ b/documentation/18.11/solutions/_images/new-project.png.data
@@ -0,0 +1,3 @@
+title=new-project
+author=admin
+path=content/new-project
diff --git a/documentation/18.11/solutions/_images/object-editor.png b/documentation/18.11/solutions/_images/object-editor.png
new file mode 100644
index 00000000..1795dd7a
Binary files /dev/null and b/documentation/18.11/solutions/_images/object-editor.png differ
diff --git a/documentation/18.11/solutions/_images/object-editor.png.data b/documentation/18.11/solutions/_images/object-editor.png.data
new file mode 100644
index 00000000..31f4c07b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/object-editor.png.data
@@ -0,0 +1,3 @@
+title=object-editor
+author=admin
+path=content/object-editor
diff --git a/documentation/18.11/solutions/_images/object_graph.png b/documentation/18.11/solutions/_images/object_graph.png
new file mode 100644
index 00000000..f32608d0
Binary files /dev/null and b/documentation/18.11/solutions/_images/object_graph.png differ
diff --git a/documentation/18.11/solutions/_images/object_graph.png.data b/documentation/18.11/solutions/_images/object_graph.png.data
new file mode 100644
index 00000000..47d96df3
--- /dev/null
+++ b/documentation/18.11/solutions/_images/object_graph.png.data
@@ -0,0 +1,3 @@
+title=Child object graph
+author=Roman
+path=content/child-object-graph
diff --git a/documentation/18.11/solutions/_images/open-project.png b/documentation/18.11/solutions/_images/open-project.png
new file mode 100644
index 00000000..5851e5a6
Binary files /dev/null and b/documentation/18.11/solutions/_images/open-project.png differ
diff --git a/documentation/18.11/solutions/_images/open-project.png.data b/documentation/18.11/solutions/_images/open-project.png.data
new file mode 100644
index 00000000..88beba32
--- /dev/null
+++ b/documentation/18.11/solutions/_images/open-project.png.data
@@ -0,0 +1,3 @@
+title=open-project
+author=admin
+path=content/open-project
diff --git a/documentation/18.11/solutions/_images/overwrite-project.png b/documentation/18.11/solutions/_images/overwrite-project.png
new file mode 100644
index 00000000..f0f27c51
Binary files /dev/null and b/documentation/18.11/solutions/_images/overwrite-project.png differ
diff --git a/documentation/18.11/solutions/_images/overwrite-project.png.data b/documentation/18.11/solutions/_images/overwrite-project.png.data
new file mode 100644
index 00000000..78980593
--- /dev/null
+++ b/documentation/18.11/solutions/_images/overwrite-project.png.data
@@ -0,0 +1,3 @@
+title=overwrite-project
+author=admin
+path=content/overwrite-project
diff --git a/documentation/18.11/solutions/_images/pixmap-selection-dialog.png b/documentation/18.11/solutions/_images/pixmap-selection-dialog.png
new file mode 100644
index 00000000..76cd2b9d
Binary files /dev/null and b/documentation/18.11/solutions/_images/pixmap-selection-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/pixmap-selection-dialog.png.data b/documentation/18.11/solutions/_images/pixmap-selection-dialog.png.data
new file mode 100644
index 00000000..a41d3aae
--- /dev/null
+++ b/documentation/18.11/solutions/_images/pixmap-selection-dialog.png.data
@@ -0,0 +1,3 @@
+title=pixmap-selection-dialog
+author=admin
+path=content/pixmap-selection-dialog
diff --git a/documentation/18.11/solutions/_images/pizza.png b/documentation/18.11/solutions/_images/pizza.png
new file mode 100644
index 00000000..2287892d
Binary files /dev/null and b/documentation/18.11/solutions/_images/pizza.png differ
diff --git a/documentation/18.11/solutions/_images/pizza.png.data b/documentation/18.11/solutions/_images/pizza.png.data
new file mode 100644
index 00000000..d0ef274e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/pizza.png.data
@@ -0,0 +1,3 @@
+title=pizza
+author=admin
+path=content/pizza
diff --git a/documentation/18.11/solutions/_images/pref_dialog.png b/documentation/18.11/solutions/_images/pref_dialog.png
new file mode 100644
index 00000000..9b9c13ce
Binary files /dev/null and b/documentation/18.11/solutions/_images/pref_dialog.png differ
diff --git a/documentation/18.11/solutions/_images/pref_dialog.png.data b/documentation/18.11/solutions/_images/pref_dialog.png.data
new file mode 100644
index 00000000..d109f9ea
--- /dev/null
+++ b/documentation/18.11/solutions/_images/pref_dialog.png.data
@@ -0,0 +1,3 @@
+title=preference-window
+author=admin
+path=content/preference-window
diff --git a/documentation/18.11/solutions/_images/preferences-dialog.png b/documentation/18.11/solutions/_images/preferences-dialog.png
new file mode 100644
index 00000000..d6f0c799
Binary files /dev/null and b/documentation/18.11/solutions/_images/preferences-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/preferences-dialog.png.data b/documentation/18.11/solutions/_images/preferences-dialog.png.data
new file mode 100644
index 00000000..258e4816
--- /dev/null
+++ b/documentation/18.11/solutions/_images/preferences-dialog.png.data
@@ -0,0 +1,3 @@
+title=preferences-dialog
+author=admin
+path=content/preferences-dialog
diff --git a/documentation/18.11/solutions/_images/prepro.png b/documentation/18.11/solutions/_images/prepro.png
new file mode 100644
index 00000000..0eb234c6
Binary files /dev/null and b/documentation/18.11/solutions/_images/prepro.png differ
diff --git a/documentation/18.11/solutions/_images/prepro.png.data b/documentation/18.11/solutions/_images/prepro.png.data
new file mode 100644
index 00000000..affb296a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/prepro.png.data
@@ -0,0 +1,3 @@
+title=prepro
+author=admin
+path=content/prepro
diff --git a/documentation/18.11/solutions/_images/printer.png b/documentation/18.11/solutions/_images/printer.png
new file mode 100644
index 00000000..6eaad697
Binary files /dev/null and b/documentation/18.11/solutions/_images/printer.png differ
diff --git a/documentation/18.11/solutions/_images/printer.png.data b/documentation/18.11/solutions/_images/printer.png.data
new file mode 100644
index 00000000..6d113831
--- /dev/null
+++ b/documentation/18.11/solutions/_images/printer.png.data
@@ -0,0 +1,3 @@
+title=printer
+author=admin
+path=content/printer
diff --git a/documentation/18.11/solutions/_images/progress-bar.png b/documentation/18.11/solutions/_images/progress-bar.png
new file mode 100644
index 00000000..88ed85b6
Binary files /dev/null and b/documentation/18.11/solutions/_images/progress-bar.png differ
diff --git a/documentation/18.11/solutions/_images/progress-bar.png.data b/documentation/18.11/solutions/_images/progress-bar.png.data
new file mode 100644
index 00000000..35621362
--- /dev/null
+++ b/documentation/18.11/solutions/_images/progress-bar.png.data
@@ -0,0 +1,3 @@
+title=progress-bar
+author=admin
+path=content/progress-bar
diff --git a/documentation/18.11/solutions/_images/project-build-class.png b/documentation/18.11/solutions/_images/project-build-class.png
new file mode 100644
index 00000000..10ac688d
Binary files /dev/null and b/documentation/18.11/solutions/_images/project-build-class.png differ
diff --git a/documentation/18.11/solutions/_images/project-build-class.png.data b/documentation/18.11/solutions/_images/project-build-class.png.data
new file mode 100644
index 00000000..d3698981
--- /dev/null
+++ b/documentation/18.11/solutions/_images/project-build-class.png.data
@@ -0,0 +1,3 @@
+title=project-build-class
+author=admin
+path=content/project-build-class
diff --git a/documentation/18.11/solutions/_images/project-build.png b/documentation/18.11/solutions/_images/project-build.png
new file mode 100644
index 00000000..a90a56e3
Binary files /dev/null and b/documentation/18.11/solutions/_images/project-build.png differ
diff --git a/documentation/18.11/solutions/_images/project-build.png.data b/documentation/18.11/solutions/_images/project-build.png.data
new file mode 100644
index 00000000..81c6a35d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/project-build.png.data
@@ -0,0 +1,3 @@
+title=project-build
+author=admin
+path=content/project-build
diff --git a/documentation/18.11/solutions/_images/project-generation.png b/documentation/18.11/solutions/_images/project-generation.png
new file mode 100644
index 00000000..78d5c54a
Binary files /dev/null and b/documentation/18.11/solutions/_images/project-generation.png differ
diff --git a/documentation/18.11/solutions/_images/project-generation.png.data b/documentation/18.11/solutions/_images/project-generation.png.data
new file mode 100644
index 00000000..6568bb65
--- /dev/null
+++ b/documentation/18.11/solutions/_images/project-generation.png.data
@@ -0,0 +1,3 @@
+title=project-generation
+author=admin
+path=content/project-generation
diff --git a/documentation/18.11/solutions/_images/rb.png b/documentation/18.11/solutions/_images/rb.png
new file mode 100644
index 00000000..05ad873a
Binary files /dev/null and b/documentation/18.11/solutions/_images/rb.png differ
diff --git a/documentation/18.11/solutions/_images/rb.png.data b/documentation/18.11/solutions/_images/rb.png.data
new file mode 100644
index 00000000..07532eb8
--- /dev/null
+++ b/documentation/18.11/solutions/_images/rb.png.data
@@ -0,0 +1,3 @@
+title=rb
+author=admin
+path=content/rb
diff --git a/documentation/18.11/solutions/_images/recent-projects.png b/documentation/18.11/solutions/_images/recent-projects.png
new file mode 100644
index 00000000..e942b587
Binary files /dev/null and b/documentation/18.11/solutions/_images/recent-projects.png differ
diff --git a/documentation/18.11/solutions/_images/recent-projects.png.data b/documentation/18.11/solutions/_images/recent-projects.png.data
new file mode 100644
index 00000000..12e30749
--- /dev/null
+++ b/documentation/18.11/solutions/_images/recent-projects.png.data
@@ -0,0 +1,3 @@
+title=recent-projects
+author=admin
+path=content/recent-projects
diff --git a/documentation/18.11/solutions/_images/retriev.png b/documentation/18.11/solutions/_images/retriev.png
new file mode 100644
index 00000000..1713d73d
Binary files /dev/null and b/documentation/18.11/solutions/_images/retriev.png differ
diff --git a/documentation/18.11/solutions/_images/retriev.png.data b/documentation/18.11/solutions/_images/retriev.png.data
new file mode 100644
index 00000000..f9bd82ff
--- /dev/null
+++ b/documentation/18.11/solutions/_images/retriev.png.data
@@ -0,0 +1,3 @@
+title=retriev
+author=admin
+path=content/retriev
diff --git a/documentation/18.11/solutions/_images/richedit.png b/documentation/18.11/solutions/_images/richedit.png
new file mode 100644
index 00000000..bd9ddc59
Binary files /dev/null and b/documentation/18.11/solutions/_images/richedit.png differ
diff --git a/documentation/18.11/solutions/_images/richedit.png.data b/documentation/18.11/solutions/_images/richedit.png.data
new file mode 100644
index 00000000..0d3d1573
--- /dev/null
+++ b/documentation/18.11/solutions/_images/richedit.png.data
@@ -0,0 +1,3 @@
+title=richedit
+author=admin
+path=content/richedit
diff --git a/documentation/18.11/solutions/_images/scoop-regions.png b/documentation/18.11/solutions/_images/scoop-regions.png
new file mode 100644
index 00000000..25d233a0
Binary files /dev/null and b/documentation/18.11/solutions/_images/scoop-regions.png differ
diff --git a/documentation/18.11/solutions/_images/scoop-regions.png.data b/documentation/18.11/solutions/_images/scoop-regions.png.data
new file mode 100644
index 00000000..c4add29f
--- /dev/null
+++ b/documentation/18.11/solutions/_images/scoop-regions.png.data
@@ -0,0 +1,3 @@
+title=SCOOP Regions
+text=The memory of a SCOOP program, splitted into regions.
+path=content/scoop-regions
diff --git a/documentation/18.11/solutions/_images/simple-data-binding.png b/documentation/18.11/solutions/_images/simple-data-binding.png
new file mode 100644
index 00000000..4a789806
Binary files /dev/null and b/documentation/18.11/solutions/_images/simple-data-binding.png differ
diff --git a/documentation/18.11/solutions/_images/simple-data-binding.png.data b/documentation/18.11/solutions/_images/simple-data-binding.png.data
new file mode 100644
index 00000000..89d6b3be
--- /dev/null
+++ b/documentation/18.11/solutions/_images/simple-data-binding.png.data
@@ -0,0 +1,3 @@
+title=simple-data-binding
+author=admin
+path=content/simple-data-binding
diff --git a/documentation/18.11/solutions/_images/simple-hello-world.png b/documentation/18.11/solutions/_images/simple-hello-world.png
new file mode 100644
index 00000000..43a33ecd
Binary files /dev/null and b/documentation/18.11/solutions/_images/simple-hello-world.png differ
diff --git a/documentation/18.11/solutions/_images/simple-hello-world.png.data b/documentation/18.11/solutions/_images/simple-hello-world.png.data
new file mode 100644
index 00000000..54d33a69
--- /dev/null
+++ b/documentation/18.11/solutions/_images/simple-hello-world.png.data
@@ -0,0 +1,3 @@
+title=simple-hello-world
+author=admin
+path=content/simple-hello-world
diff --git a/documentation/18.11/solutions/_images/splitarea.png b/documentation/18.11/solutions/_images/splitarea.png
new file mode 100644
index 00000000..6b35f0c0
Binary files /dev/null and b/documentation/18.11/solutions/_images/splitarea.png differ
diff --git a/documentation/18.11/solutions/_images/splitarea.png.data b/documentation/18.11/solutions/_images/splitarea.png.data
new file mode 100644
index 00000000..b8388fd9
--- /dev/null
+++ b/documentation/18.11/solutions/_images/splitarea.png.data
@@ -0,0 +1,3 @@
+title=splitarea
+author=admin
+path=content/splitarea
diff --git a/documentation/18.11/solutions/_images/standard-dialogs.png b/documentation/18.11/solutions/_images/standard-dialogs.png
new file mode 100644
index 00000000..4fe2a56b
Binary files /dev/null and b/documentation/18.11/solutions/_images/standard-dialogs.png differ
diff --git a/documentation/18.11/solutions/_images/standard-dialogs.png.data b/documentation/18.11/solutions/_images/standard-dialogs.png.data
new file mode 100644
index 00000000..c0acd918
--- /dev/null
+++ b/documentation/18.11/solutions/_images/standard-dialogs.png.data
@@ -0,0 +1,3 @@
+title=standard-dialogs
+author=admin
+path=content/standard-dialogs
diff --git a/documentation/18.11/solutions/_images/stddlgs.png b/documentation/18.11/solutions/_images/stddlgs.png
new file mode 100644
index 00000000..e5e49c23
Binary files /dev/null and b/documentation/18.11/solutions/_images/stddlgs.png differ
diff --git a/documentation/18.11/solutions/_images/stddlgs.png.data b/documentation/18.11/solutions/_images/stddlgs.png.data
new file mode 100644
index 00000000..e7bdfd69
--- /dev/null
+++ b/documentation/18.11/solutions/_images/stddlgs.png.data
@@ -0,0 +1,3 @@
+title=stddlgs
+author=admin
+path=content/stddlgs
diff --git a/documentation/18.11/solutions/_images/step1.png b/documentation/18.11/solutions/_images/step1.png
new file mode 100644
index 00000000..d02b5444
Binary files /dev/null and b/documentation/18.11/solutions/_images/step1.png differ
diff --git a/documentation/18.11/solutions/_images/step1.png.data b/documentation/18.11/solutions/_images/step1.png.data
new file mode 100644
index 00000000..287a258a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/step1.png.data
@@ -0,0 +1,3 @@
+title=step1
+author=admin
+path=content/step1
diff --git a/documentation/18.11/solutions/_images/step2.png b/documentation/18.11/solutions/_images/step2.png
new file mode 100644
index 00000000..932183e9
Binary files /dev/null and b/documentation/18.11/solutions/_images/step2.png differ
diff --git a/documentation/18.11/solutions/_images/step2.png.data b/documentation/18.11/solutions/_images/step2.png.data
new file mode 100644
index 00000000..eca33337
--- /dev/null
+++ b/documentation/18.11/solutions/_images/step2.png.data
@@ -0,0 +1,3 @@
+title=step2
+author=admin
+path=content/step2
diff --git a/documentation/18.11/solutions/_images/step3.png b/documentation/18.11/solutions/_images/step3.png
new file mode 100644
index 00000000..222f0647
Binary files /dev/null and b/documentation/18.11/solutions/_images/step3.png differ
diff --git a/documentation/18.11/solutions/_images/step3.png.data b/documentation/18.11/solutions/_images/step3.png.data
new file mode 100644
index 00000000..b368f56d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/step3.png.data
@@ -0,0 +1,3 @@
+title=step3
+author=admin
+path=content/step3
diff --git a/documentation/18.11/solutions/_images/step4.png b/documentation/18.11/solutions/_images/step4.png
new file mode 100644
index 00000000..f86757cf
Binary files /dev/null and b/documentation/18.11/solutions/_images/step4.png differ
diff --git a/documentation/18.11/solutions/_images/step4.png.data b/documentation/18.11/solutions/_images/step4.png.data
new file mode 100644
index 00000000..3d096e5c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/step4.png.data
@@ -0,0 +1,3 @@
+title=step4
+author=admin
+path=content/step4
diff --git a/documentation/18.11/solutions/_images/step5.png b/documentation/18.11/solutions/_images/step5.png
new file mode 100644
index 00000000..7c88ff1f
Binary files /dev/null and b/documentation/18.11/solutions/_images/step5.png differ
diff --git a/documentation/18.11/solutions/_images/step5.png.data b/documentation/18.11/solutions/_images/step5.png.data
new file mode 100644
index 00000000..00048118
--- /dev/null
+++ b/documentation/18.11/solutions/_images/step5.png.data
@@ -0,0 +1,3 @@
+title=step5
+author=admin
+path=content/step5
diff --git a/documentation/18.11/solutions/_images/step6.png b/documentation/18.11/solutions/_images/step6.png
new file mode 100644
index 00000000..dea8c699
Binary files /dev/null and b/documentation/18.11/solutions/_images/step6.png differ
diff --git a/documentation/18.11/solutions/_images/step6.png.data b/documentation/18.11/solutions/_images/step6.png.data
new file mode 100644
index 00000000..53c08488
--- /dev/null
+++ b/documentation/18.11/solutions/_images/step6.png.data
@@ -0,0 +1,3 @@
+title=step6
+author=admin
+path=content/step6
diff --git a/documentation/18.11/solutions/_images/step7.png b/documentation/18.11/solutions/_images/step7.png
new file mode 100644
index 00000000..bc410f89
Binary files /dev/null and b/documentation/18.11/solutions/_images/step7.png differ
diff --git a/documentation/18.11/solutions/_images/step7.png.data b/documentation/18.11/solutions/_images/step7.png.data
new file mode 100644
index 00000000..ea7eb899
--- /dev/null
+++ b/documentation/18.11/solutions/_images/step7.png.data
@@ -0,0 +1,3 @@
+title=step7
+author=admin
+path=content/step7
diff --git a/documentation/18.11/solutions/_images/step8.png b/documentation/18.11/solutions/_images/step8.png
new file mode 100644
index 00000000..7737a6be
Binary files /dev/null and b/documentation/18.11/solutions/_images/step8.png differ
diff --git a/documentation/18.11/solutions/_images/step8.png.data b/documentation/18.11/solutions/_images/step8.png.data
new file mode 100644
index 00000000..166ef5ed
--- /dev/null
+++ b/documentation/18.11/solutions/_images/step8.png.data
@@ -0,0 +1,3 @@
+title=step8
+author=admin
+path=content/step8
diff --git a/documentation/18.11/solutions/_images/strings.png b/documentation/18.11/solutions/_images/strings.png
new file mode 100644
index 00000000..43a7c3ac
Binary files /dev/null and b/documentation/18.11/solutions/_images/strings.png differ
diff --git a/documentation/18.11/solutions/_images/strings.png.data b/documentation/18.11/solutions/_images/strings.png.data
new file mode 100644
index 00000000..53a7ce2b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/strings.png.data
@@ -0,0 +1,3 @@
+title=strings
+author=admin
+path=content/strings
diff --git a/documentation/18.11/solutions/_images/sub-component-objects.png b/documentation/18.11/solutions/_images/sub-component-objects.png
new file mode 100644
index 00000000..271ee22d
Binary files /dev/null and b/documentation/18.11/solutions/_images/sub-component-objects.png differ
diff --git a/documentation/18.11/solutions/_images/sub-component-objects.png.data b/documentation/18.11/solutions/_images/sub-component-objects.png.data
new file mode 100644
index 00000000..401e4f92
--- /dev/null
+++ b/documentation/18.11/solutions/_images/sub-component-objects.png.data
@@ -0,0 +1,3 @@
+title=sub-component-objects
+author=admin
+path=content/sub-component-objects
diff --git a/documentation/18.11/solutions/_images/table-child-positioner.png b/documentation/18.11/solutions/_images/table-child-positioner.png
new file mode 100644
index 00000000..c5a26ae5
Binary files /dev/null and b/documentation/18.11/solutions/_images/table-child-positioner.png differ
diff --git a/documentation/18.11/solutions/_images/table-child-positioner.png.data b/documentation/18.11/solutions/_images/table-child-positioner.png.data
new file mode 100644
index 00000000..5bf536e6
--- /dev/null
+++ b/documentation/18.11/solutions/_images/table-child-positioner.png.data
@@ -0,0 +1,3 @@
+title=table-child-positioner
+author=admin
+path=content/table-child-positioner
diff --git a/documentation/18.11/solutions/_images/table-descr-access-objects.png b/documentation/18.11/solutions/_images/table-descr-access-objects.png
new file mode 100644
index 00000000..ed4f5778
Binary files /dev/null and b/documentation/18.11/solutions/_images/table-descr-access-objects.png differ
diff --git a/documentation/18.11/solutions/_images/table-descr-access-objects.png.data b/documentation/18.11/solutions/_images/table-descr-access-objects.png.data
new file mode 100644
index 00000000..7d61015b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/table-descr-access-objects.png.data
@@ -0,0 +1,3 @@
+title=table-descr-access-objects
+author=admin
+path=content/table-descr-access-objects
diff --git a/documentation/18.11/solutions/_images/table-descr-objects.png b/documentation/18.11/solutions/_images/table-descr-objects.png
new file mode 100644
index 00000000..5a180331
Binary files /dev/null and b/documentation/18.11/solutions/_images/table-descr-objects.png differ
diff --git a/documentation/18.11/solutions/_images/table-descr-objects.png.data b/documentation/18.11/solutions/_images/table-descr-objects.png.data
new file mode 100644
index 00000000..0c1776dc
--- /dev/null
+++ b/documentation/18.11/solutions/_images/table-descr-objects.png.data
@@ -0,0 +1,3 @@
+title=table-descr-objects
+author=admin
+path=content/table-descr-objects
diff --git a/documentation/18.11/solutions/_images/table-objects-associations.png b/documentation/18.11/solutions/_images/table-objects-associations.png
new file mode 100644
index 00000000..2d658448
Binary files /dev/null and b/documentation/18.11/solutions/_images/table-objects-associations.png differ
diff --git a/documentation/18.11/solutions/_images/table-objects-associations.png.data b/documentation/18.11/solutions/_images/table-objects-associations.png.data
new file mode 100644
index 00000000..9530e765
--- /dev/null
+++ b/documentation/18.11/solutions/_images/table-objects-associations.png.data
@@ -0,0 +1,3 @@
+title=table-objects-associations
+author=admin
+path=content/table-objects-associations
diff --git a/documentation/18.11/solutions/_images/tables-access-inherit.png b/documentation/18.11/solutions/_images/tables-access-inherit.png
new file mode 100644
index 00000000..a8b27008
Binary files /dev/null and b/documentation/18.11/solutions/_images/tables-access-inherit.png differ
diff --git a/documentation/18.11/solutions/_images/tables-access-inherit.png.data b/documentation/18.11/solutions/_images/tables-access-inherit.png.data
new file mode 100644
index 00000000..ccf516f8
--- /dev/null
+++ b/documentation/18.11/solutions/_images/tables-access-inherit.png.data
@@ -0,0 +1,3 @@
+title=tables-access-inherit
+author=admin
+path=content/tables-access-inherit
diff --git a/documentation/18.11/solutions/_images/text.png b/documentation/18.11/solutions/_images/text.png
new file mode 100644
index 00000000..3b25bc18
Binary files /dev/null and b/documentation/18.11/solutions/_images/text.png differ
diff --git a/documentation/18.11/solutions/_images/text.png.data b/documentation/18.11/solutions/_images/text.png.data
new file mode 100644
index 00000000..f1379c1e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/text.png.data
@@ -0,0 +1,3 @@
+title=text
+author=admin
+path=content/text
diff --git a/documentation/18.11/solutions/_images/timer.png b/documentation/18.11/solutions/_images/timer.png
new file mode 100644
index 00000000..1b9562f0
Binary files /dev/null and b/documentation/18.11/solutions/_images/timer.png differ
diff --git a/documentation/18.11/solutions/_images/timer.png.data b/documentation/18.11/solutions/_images/timer.png.data
new file mode 100644
index 00000000..209e04d7
--- /dev/null
+++ b/documentation/18.11/solutions/_images/timer.png.data
@@ -0,0 +1,3 @@
+title=timer
+author=admin
+path=content/timer
diff --git a/documentation/18.11/solutions/_images/toolbar.png b/documentation/18.11/solutions/_images/toolbar.png
new file mode 100644
index 00000000..1244d142
Binary files /dev/null and b/documentation/18.11/solutions/_images/toolbar.png differ
diff --git a/documentation/18.11/solutions/_images/toolbar.png.data b/documentation/18.11/solutions/_images/toolbar.png.data
new file mode 100644
index 00000000..184ecdd5
--- /dev/null
+++ b/documentation/18.11/solutions/_images/toolbar.png.data
@@ -0,0 +1,3 @@
+title=toolbar
+author=admin
+path=content/toolbar
diff --git a/documentation/18.11/solutions/_images/tree-view--tree-view.png b/documentation/18.11/solutions/_images/tree-view--tree-view.png
new file mode 100644
index 00000000..8c26ae48
Binary files /dev/null and b/documentation/18.11/solutions/_images/tree-view--tree-view.png differ
diff --git a/documentation/18.11/solutions/_images/tree-view--tree-view.png.data b/documentation/18.11/solutions/_images/tree-view--tree-view.png.data
new file mode 100644
index 00000000..00a7aeb6
--- /dev/null
+++ b/documentation/18.11/solutions/_images/tree-view--tree-view.png.data
@@ -0,0 +1,3 @@
+title=tree-view--tree-view
+author=admin
+path=content/tree-view-tree-view
diff --git a/documentation/18.11/solutions/_images/tree-view.png b/documentation/18.11/solutions/_images/tree-view.png
new file mode 100644
index 00000000..d0741f6b
Binary files /dev/null and b/documentation/18.11/solutions/_images/tree-view.png differ
diff --git a/documentation/18.11/solutions/_images/tree-view.png.data b/documentation/18.11/solutions/_images/tree-view.png.data
new file mode 100644
index 00000000..2f9b455c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/tree-view.png.data
@@ -0,0 +1,3 @@
+title=tree-view
+author=admin
+path=content/tree-view
diff --git a/documentation/18.11/solutions/_images/tree.png b/documentation/18.11/solutions/_images/tree.png
new file mode 100644
index 00000000..d636454d
Binary files /dev/null and b/documentation/18.11/solutions/_images/tree.png differ
diff --git a/documentation/18.11/solutions/_images/tree.png.data b/documentation/18.11/solutions/_images/tree.png.data
new file mode 100644
index 00000000..11dbe8c1
--- /dev/null
+++ b/documentation/18.11/solutions/_images/tree.png.data
@@ -0,0 +1,3 @@
+title=tree
+author=admin
+path=content/tree
diff --git a/documentation/18.11/solutions/_images/two-way-list.png b/documentation/18.11/solutions/_images/two-way-list.png
new file mode 100644
index 00000000..d230b31f
Binary files /dev/null and b/documentation/18.11/solutions/_images/two-way-list.png differ
diff --git a/documentation/18.11/solutions/_images/two-way-list.png.data b/documentation/18.11/solutions/_images/two-way-list.png.data
new file mode 100644
index 00000000..7e5dc85d
--- /dev/null
+++ b/documentation/18.11/solutions/_images/two-way-list.png.data
@@ -0,0 +1,3 @@
+title=two-way-list
+author=admin
+path=content/two-way-list
diff --git a/documentation/18.11/solutions/_images/unicode.png b/documentation/18.11/solutions/_images/unicode.png
new file mode 100644
index 00000000..0cb201e3
Binary files /dev/null and b/documentation/18.11/solutions/_images/unicode.png differ
diff --git a/documentation/18.11/solutions/_images/unicode.png.data b/documentation/18.11/solutions/_images/unicode.png.data
new file mode 100644
index 00000000..4881462c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/unicode.png.data
@@ -0,0 +1,3 @@
+title=unicode
+author=admin
+path=content/unicode
diff --git a/documentation/18.11/solutions/_images/value-chart.PNG b/documentation/18.11/solutions/_images/value-chart.PNG
new file mode 100644
index 00000000..eb62e5e6
Binary files /dev/null and b/documentation/18.11/solutions/_images/value-chart.PNG differ
diff --git a/documentation/18.11/solutions/_images/value-chart.PNG.data b/documentation/18.11/solutions/_images/value-chart.PNG.data
new file mode 100644
index 00000000..6aff6d9e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/value-chart.PNG.data
@@ -0,0 +1,3 @@
+title=value-chart
+author=admin
+path=content/value-chart
diff --git a/documentation/18.11/solutions/_images/viewport.png b/documentation/18.11/solutions/_images/viewport.png
new file mode 100644
index 00000000..df465eef
Binary files /dev/null and b/documentation/18.11/solutions/_images/viewport.png differ
diff --git a/documentation/18.11/solutions/_images/viewport.png.data b/documentation/18.11/solutions/_images/viewport.png.data
new file mode 100644
index 00000000..a62a92b3
--- /dev/null
+++ b/documentation/18.11/solutions/_images/viewport.png.data
@@ -0,0 +1,3 @@
+title=viewport
+author=admin
+path=content/viewport
diff --git a/documentation/18.11/solutions/_images/vision2--figure1.png b/documentation/18.11/solutions/_images/vision2--figure1.png
new file mode 100644
index 00000000..68e989e4
Binary files /dev/null and b/documentation/18.11/solutions/_images/vision2--figure1.png differ
diff --git a/documentation/18.11/solutions/_images/vision2--figure1.png.data b/documentation/18.11/solutions/_images/vision2--figure1.png.data
new file mode 100644
index 00000000..dd507a95
--- /dev/null
+++ b/documentation/18.11/solutions/_images/vision2--figure1.png.data
@@ -0,0 +1,3 @@
+title=vision2--figure1
+author=admin
+path=content/vision2-figure1
diff --git a/documentation/18.11/solutions/_images/wel-check-box-3-state-checked.png b/documentation/18.11/solutions/_images/wel-check-box-3-state-checked.png
new file mode 100644
index 00000000..0ea35c05
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-check-box-3-state-checked.png differ
diff --git a/documentation/18.11/solutions/_images/wel-check-box-3-state-checked.png.data b/documentation/18.11/solutions/_images/wel-check-box-3-state-checked.png.data
new file mode 100644
index 00000000..d7cae8da
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-check-box-3-state-checked.png.data
@@ -0,0 +1,3 @@
+title=wel-check-box-3-state-checked
+author=admin
+path=content/wel-check-box-3-state-checked
diff --git a/documentation/18.11/solutions/_images/wel-check-box-3-state-indeterminate.png b/documentation/18.11/solutions/_images/wel-check-box-3-state-indeterminate.png
new file mode 100644
index 00000000..ddda7b01
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-check-box-3-state-indeterminate.png differ
diff --git a/documentation/18.11/solutions/_images/wel-check-box-3-state-indeterminate.png.data b/documentation/18.11/solutions/_images/wel-check-box-3-state-indeterminate.png.data
new file mode 100644
index 00000000..c4bb0020
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-check-box-3-state-indeterminate.png.data
@@ -0,0 +1,3 @@
+title=wel-check-box-3-state-indeterminate
+author=admin
+path=content/wel-check-box-3-state-indeterminate
diff --git a/documentation/18.11/solutions/_images/wel-check-box-3-state-unchecked.png b/documentation/18.11/solutions/_images/wel-check-box-3-state-unchecked.png
new file mode 100644
index 00000000..adf9693a
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-check-box-3-state-unchecked.png differ
diff --git a/documentation/18.11/solutions/_images/wel-check-box-3-state-unchecked.png.data b/documentation/18.11/solutions/_images/wel-check-box-3-state-unchecked.png.data
new file mode 100644
index 00000000..e64c2761
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-check-box-3-state-unchecked.png.data
@@ -0,0 +1,3 @@
+title=wel-check-box-3-state-unchecked
+author=admin
+path=content/wel-check-box-3-state-unchecked
diff --git a/documentation/18.11/solutions/_images/wel-check-box-checked.png b/documentation/18.11/solutions/_images/wel-check-box-checked.png
new file mode 100644
index 00000000..6e2302ff
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-check-box-checked.png differ
diff --git a/documentation/18.11/solutions/_images/wel-check-box-checked.png.data b/documentation/18.11/solutions/_images/wel-check-box-checked.png.data
new file mode 100644
index 00000000..d24aa1b8
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-check-box-checked.png.data
@@ -0,0 +1,3 @@
+title=wel-check-box-checked
+author=admin
+path=content/wel-check-box-checked
diff --git a/documentation/18.11/solutions/_images/wel-check-box-unchecked.png b/documentation/18.11/solutions/_images/wel-check-box-unchecked.png
new file mode 100644
index 00000000..27ab1bb5
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-check-box-unchecked.png differ
diff --git a/documentation/18.11/solutions/_images/wel-check-box-unchecked.png.data b/documentation/18.11/solutions/_images/wel-check-box-unchecked.png.data
new file mode 100644
index 00000000..da525b27
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-check-box-unchecked.png.data
@@ -0,0 +1,3 @@
+title=wel-check-box-unchecked
+author=admin
+path=content/wel-check-box-unchecked
diff --git a/documentation/18.11/solutions/_images/wel-choose-color-dialog.png b/documentation/18.11/solutions/_images/wel-choose-color-dialog.png
new file mode 100644
index 00000000..9d76fb7a
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-choose-color-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/wel-choose-color-dialog.png.data b/documentation/18.11/solutions/_images/wel-choose-color-dialog.png.data
new file mode 100644
index 00000000..9a2695f5
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-choose-color-dialog.png.data
@@ -0,0 +1,3 @@
+title=wel-choose-color-dialog
+author=admin
+path=content/wel-choose-color-dialog
diff --git a/documentation/18.11/solutions/_images/wel-choose-folder-dialog.png b/documentation/18.11/solutions/_images/wel-choose-folder-dialog.png
new file mode 100644
index 00000000..27f9f565
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-choose-folder-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/wel-choose-folder-dialog.png.data b/documentation/18.11/solutions/_images/wel-choose-folder-dialog.png.data
new file mode 100644
index 00000000..1dd67d8a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-choose-folder-dialog.png.data
@@ -0,0 +1,3 @@
+title=wel-choose-folder-dialog
+author=admin
+path=content/wel-choose-folder-dialog
diff --git a/documentation/18.11/solutions/_images/wel-choose-font-dialog.png b/documentation/18.11/solutions/_images/wel-choose-font-dialog.png
new file mode 100644
index 00000000..7fa934fe
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-choose-font-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/wel-choose-font-dialog.png.data b/documentation/18.11/solutions/_images/wel-choose-font-dialog.png.data
new file mode 100644
index 00000000..279ae90e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-choose-font-dialog.png.data
@@ -0,0 +1,3 @@
+title=wel-choose-font-dialog
+author=admin
+path=content/wel-choose-font-dialog
diff --git a/documentation/18.11/solutions/_images/wel-group-box.png b/documentation/18.11/solutions/_images/wel-group-box.png
new file mode 100644
index 00000000..94c8addf
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-group-box.png differ
diff --git a/documentation/18.11/solutions/_images/wel-group-box.png.data b/documentation/18.11/solutions/_images/wel-group-box.png.data
new file mode 100644
index 00000000..72ca9ed9
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-group-box.png.data
@@ -0,0 +1,3 @@
+title=wel-group-box
+author=admin
+path=content/wel-group-box
diff --git a/documentation/18.11/solutions/_images/wel-list-view-style-lvs-icon.png b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-icon.png
new file mode 100644
index 00000000..4f2cb782
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-icon.png differ
diff --git a/documentation/18.11/solutions/_images/wel-list-view-style-lvs-icon.png.data b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-icon.png.data
new file mode 100644
index 00000000..c4894dae
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-icon.png.data
@@ -0,0 +1,3 @@
+title=wel-list-view-style-lvs-icon
+author=admin
+path=content/wel-list-view-style-lvs-icon
diff --git a/documentation/18.11/solutions/_images/wel-list-view-style-lvs-list.png b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-list.png
new file mode 100644
index 00000000..ab59354d
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-list.png differ
diff --git a/documentation/18.11/solutions/_images/wel-list-view-style-lvs-list.png.data b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-list.png.data
new file mode 100644
index 00000000..a44b3f72
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-list.png.data
@@ -0,0 +1,3 @@
+title=wel-list-view-style-lvs-list
+author=admin
+path=content/wel-list-view-style-lvs-list
diff --git a/documentation/18.11/solutions/_images/wel-list-view-style-lvs-report.png b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-report.png
new file mode 100644
index 00000000..a5721490
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-report.png differ
diff --git a/documentation/18.11/solutions/_images/wel-list-view-style-lvs-report.png.data b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-report.png.data
new file mode 100644
index 00000000..1702b49b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-report.png.data
@@ -0,0 +1,3 @@
+title=wel-list-view-style-lvs-report
+author=admin
+path=content/wel-list-view-style-lvs-report
diff --git a/documentation/18.11/solutions/_images/wel-list-view-style-lvs-small-icon.png b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-small-icon.png
new file mode 100644
index 00000000..606170bc
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-small-icon.png differ
diff --git a/documentation/18.11/solutions/_images/wel-list-view-style-lvs-small-icon.png.data b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-small-icon.png.data
new file mode 100644
index 00000000..72a085a9
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-list-view-style-lvs-small-icon.png.data
@@ -0,0 +1,3 @@
+title=wel-list-view-style-lvs-small-icon
+author=admin
+path=content/wel-list-view-style-lvs-small-icon
diff --git a/documentation/18.11/solutions/_images/wel-multiple-line-edit.png b/documentation/18.11/solutions/_images/wel-multiple-line-edit.png
new file mode 100644
index 00000000..0bdf7bc1
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-multiple-line-edit.png differ
diff --git a/documentation/18.11/solutions/_images/wel-multiple-line-edit.png.data b/documentation/18.11/solutions/_images/wel-multiple-line-edit.png.data
new file mode 100644
index 00000000..a048bcea
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-multiple-line-edit.png.data
@@ -0,0 +1,3 @@
+title=wel-multiple-line-edit
+author=admin
+path=content/wel-multiple-line-edit
diff --git a/documentation/18.11/solutions/_images/wel-multiple-selection-list-box.png b/documentation/18.11/solutions/_images/wel-multiple-selection-list-box.png
new file mode 100644
index 00000000..daed9014
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-multiple-selection-list-box.png differ
diff --git a/documentation/18.11/solutions/_images/wel-multiple-selection-list-box.png.data b/documentation/18.11/solutions/_images/wel-multiple-selection-list-box.png.data
new file mode 100644
index 00000000..26ab8d28
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-multiple-selection-list-box.png.data
@@ -0,0 +1,3 @@
+title=wel-multiple-selection-list-box
+author=admin
+path=content/wel-multiple-selection-list-box
diff --git a/documentation/18.11/solutions/_images/wel-open-file-dialog.png b/documentation/18.11/solutions/_images/wel-open-file-dialog.png
new file mode 100644
index 00000000..b4600bd0
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-open-file-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/wel-open-file-dialog.png.data b/documentation/18.11/solutions/_images/wel-open-file-dialog.png.data
new file mode 100644
index 00000000..5bcc883a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-open-file-dialog.png.data
@@ -0,0 +1,3 @@
+title=wel-open-file-dialog
+author=admin
+path=content/wel-open-file-dialog
diff --git a/documentation/18.11/solutions/_images/wel-print-dialog.png b/documentation/18.11/solutions/_images/wel-print-dialog.png
new file mode 100644
index 00000000..3ee49956
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-print-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/wel-print-dialog.png.data b/documentation/18.11/solutions/_images/wel-print-dialog.png.data
new file mode 100644
index 00000000..ec9eb492
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-print-dialog.png.data
@@ -0,0 +1,3 @@
+title=wel-print-dialog
+author=admin
+path=content/wel-print-dialog
diff --git a/documentation/18.11/solutions/_images/wel-progress-bar-half.png b/documentation/18.11/solutions/_images/wel-progress-bar-half.png
new file mode 100644
index 00000000..e531de73
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-progress-bar-half.png differ
diff --git a/documentation/18.11/solutions/_images/wel-progress-bar-half.png.data b/documentation/18.11/solutions/_images/wel-progress-bar-half.png.data
new file mode 100644
index 00000000..258dd2a4
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-progress-bar-half.png.data
@@ -0,0 +1,3 @@
+title=wel-progress-bar-half
+author=admin
+path=content/wel-progress-bar-half
diff --git a/documentation/18.11/solutions/_images/wel-push-button.png b/documentation/18.11/solutions/_images/wel-push-button.png
new file mode 100644
index 00000000..81bac431
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-push-button.png differ
diff --git a/documentation/18.11/solutions/_images/wel-push-button.png.data b/documentation/18.11/solutions/_images/wel-push-button.png.data
new file mode 100644
index 00000000..e32a50f9
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-push-button.png.data
@@ -0,0 +1,3 @@
+title=wel-push-button
+author=admin
+path=content/wel-push-button
diff --git a/documentation/18.11/solutions/_images/wel-radio-button-checked.png b/documentation/18.11/solutions/_images/wel-radio-button-checked.png
new file mode 100644
index 00000000..a3f97f4c
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-radio-button-checked.png differ
diff --git a/documentation/18.11/solutions/_images/wel-radio-button-checked.png.data b/documentation/18.11/solutions/_images/wel-radio-button-checked.png.data
new file mode 100644
index 00000000..0329dd89
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-radio-button-checked.png.data
@@ -0,0 +1,3 @@
+title=wel-radio-button-checked
+author=admin
+path=content/wel-radio-button-checked
diff --git a/documentation/18.11/solutions/_images/wel-radio-button-unchecked.png b/documentation/18.11/solutions/_images/wel-radio-button-unchecked.png
new file mode 100644
index 00000000..8abadb5d
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-radio-button-unchecked.png differ
diff --git a/documentation/18.11/solutions/_images/wel-radio-button-unchecked.png.data b/documentation/18.11/solutions/_images/wel-radio-button-unchecked.png.data
new file mode 100644
index 00000000..1d6a2c9b
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-radio-button-unchecked.png.data
@@ -0,0 +1,3 @@
+title=wel-radio-button-unchecked
+author=admin
+path=content/wel-radio-button-unchecked
diff --git a/documentation/18.11/solutions/_images/wel-save-file-dialog.png b/documentation/18.11/solutions/_images/wel-save-file-dialog.png
new file mode 100644
index 00000000..50e421f4
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-save-file-dialog.png differ
diff --git a/documentation/18.11/solutions/_images/wel-save-file-dialog.png.data b/documentation/18.11/solutions/_images/wel-save-file-dialog.png.data
new file mode 100644
index 00000000..d4380aaa
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-save-file-dialog.png.data
@@ -0,0 +1,3 @@
+title=wel-save-file-dialog
+author=admin
+path=content/wel-save-file-dialog
diff --git a/documentation/18.11/solutions/_images/wel-scroll-bar-horizontal.png b/documentation/18.11/solutions/_images/wel-scroll-bar-horizontal.png
new file mode 100644
index 00000000..a1c0f389
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-scroll-bar-horizontal.png differ
diff --git a/documentation/18.11/solutions/_images/wel-scroll-bar-horizontal.png.data b/documentation/18.11/solutions/_images/wel-scroll-bar-horizontal.png.data
new file mode 100644
index 00000000..7606df6e
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-scroll-bar-horizontal.png.data
@@ -0,0 +1,3 @@
+title=wel-scroll-bar-horizontal
+author=admin
+path=content/wel-scroll-bar-horizontal
diff --git a/documentation/18.11/solutions/_images/wel-scroll-bar-vertical.png b/documentation/18.11/solutions/_images/wel-scroll-bar-vertical.png
new file mode 100644
index 00000000..13ab3700
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-scroll-bar-vertical.png differ
diff --git a/documentation/18.11/solutions/_images/wel-scroll-bar-vertical.png.data b/documentation/18.11/solutions/_images/wel-scroll-bar-vertical.png.data
new file mode 100644
index 00000000..d57d0e5f
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-scroll-bar-vertical.png.data
@@ -0,0 +1,3 @@
+title=wel-scroll-bar-vertical
+author=admin
+path=content/wel-scroll-bar-vertical
diff --git a/documentation/18.11/solutions/_images/wel-single-line-edit.png b/documentation/18.11/solutions/_images/wel-single-line-edit.png
new file mode 100644
index 00000000..844f14a2
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-single-line-edit.png differ
diff --git a/documentation/18.11/solutions/_images/wel-single-line-edit.png.data b/documentation/18.11/solutions/_images/wel-single-line-edit.png.data
new file mode 100644
index 00000000..8d3bf85c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-single-line-edit.png.data
@@ -0,0 +1,3 @@
+title=wel-single-line-edit
+author=admin
+path=content/wel-single-line-edit
diff --git a/documentation/18.11/solutions/_images/wel-single-selection-list-box.png b/documentation/18.11/solutions/_images/wel-single-selection-list-box.png
new file mode 100644
index 00000000..c312361e
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-single-selection-list-box.png differ
diff --git a/documentation/18.11/solutions/_images/wel-single-selection-list-box.png.data b/documentation/18.11/solutions/_images/wel-single-selection-list-box.png.data
new file mode 100644
index 00000000..a1d4e297
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-single-selection-list-box.png.data
@@ -0,0 +1,3 @@
+title=wel-single-selection-list-box
+author=admin
+path=content/wel-single-selection-list-box
diff --git a/documentation/18.11/solutions/_images/wel-tooltip.png b/documentation/18.11/solutions/_images/wel-tooltip.png
new file mode 100644
index 00000000..751e3f51
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-tooltip.png differ
diff --git a/documentation/18.11/solutions/_images/wel-tooltip.png.data b/documentation/18.11/solutions/_images/wel-tooltip.png.data
new file mode 100644
index 00000000..2bfe50ec
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-tooltip.png.data
@@ -0,0 +1,3 @@
+title=wel-tooltip
+author=admin
+path=content/wel-tooltip
diff --git a/documentation/18.11/solutions/_images/wel-track-bar-horizontal.png b/documentation/18.11/solutions/_images/wel-track-bar-horizontal.png
new file mode 100644
index 00000000..eec628bc
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-track-bar-horizontal.png differ
diff --git a/documentation/18.11/solutions/_images/wel-track-bar-horizontal.png.data b/documentation/18.11/solutions/_images/wel-track-bar-horizontal.png.data
new file mode 100644
index 00000000..6b909eaa
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-track-bar-horizontal.png.data
@@ -0,0 +1,3 @@
+title=wel-track-bar-horizontal
+author=admin
+path=content/wel-track-bar-horizontal
diff --git a/documentation/18.11/solutions/_images/wel-track-bar-vertical.png b/documentation/18.11/solutions/_images/wel-track-bar-vertical.png
new file mode 100644
index 00000000..77d422b7
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-track-bar-vertical.png differ
diff --git a/documentation/18.11/solutions/_images/wel-track-bar-vertical.png.data b/documentation/18.11/solutions/_images/wel-track-bar-vertical.png.data
new file mode 100644
index 00000000..b08cc0a5
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-track-bar-vertical.png.data
@@ -0,0 +1,3 @@
+title=wel-track-bar-vertical
+author=admin
+path=content/wel-track-bar-vertical
diff --git a/documentation/18.11/solutions/_images/wel-up-down-control.png b/documentation/18.11/solutions/_images/wel-up-down-control.png
new file mode 100644
index 00000000..678758d5
Binary files /dev/null and b/documentation/18.11/solutions/_images/wel-up-down-control.png differ
diff --git a/documentation/18.11/solutions/_images/wel-up-down-control.png.data b/documentation/18.11/solutions/_images/wel-up-down-control.png.data
new file mode 100644
index 00000000..19fd0dc7
--- /dev/null
+++ b/documentation/18.11/solutions/_images/wel-up-down-control.png.data
@@ -0,0 +1,3 @@
+title=wel-up-down-control
+author=admin
+path=content/wel-down-control
diff --git a/documentation/18.11/solutions/_images/widget-selector-clients.PNG b/documentation/18.11/solutions/_images/widget-selector-clients.PNG
new file mode 100644
index 00000000..69975400
Binary files /dev/null and b/documentation/18.11/solutions/_images/widget-selector-clients.PNG differ
diff --git a/documentation/18.11/solutions/_images/widget-selector-clients.PNG.data b/documentation/18.11/solutions/_images/widget-selector-clients.PNG.data
new file mode 100644
index 00000000..98a9001a
--- /dev/null
+++ b/documentation/18.11/solutions/_images/widget-selector-clients.PNG.data
@@ -0,0 +1,3 @@
+title=widget-selector-clients
+author=admin
+path=content/widget-selector-clients
diff --git a/documentation/18.11/solutions/_images/widget_sample.png b/documentation/18.11/solutions/_images/widget_sample.png
new file mode 100644
index 00000000..432dd197
Binary files /dev/null and b/documentation/18.11/solutions/_images/widget_sample.png differ
diff --git a/documentation/18.11/solutions/_images/widget_sample.png.data b/documentation/18.11/solutions/_images/widget_sample.png.data
new file mode 100644
index 00000000..bcf443ff
--- /dev/null
+++ b/documentation/18.11/solutions/_images/widget_sample.png.data
@@ -0,0 +1,3 @@
+title=widgets
+author=admin
+path=content/widgets
diff --git a/documentation/18.11/solutions/_images/window-selector.png b/documentation/18.11/solutions/_images/window-selector.png
new file mode 100644
index 00000000..6d668853
Binary files /dev/null and b/documentation/18.11/solutions/_images/window-selector.png differ
diff --git a/documentation/18.11/solutions/_images/window-selector.png.data b/documentation/18.11/solutions/_images/window-selector.png.data
new file mode 100644
index 00000000..eab88ae6
--- /dev/null
+++ b/documentation/18.11/solutions/_images/window-selector.png.data
@@ -0,0 +1,3 @@
+title=window-selector
+author=admin
+path=content/window-selector
diff --git a/documentation/18.11/solutions/_images/windows.png b/documentation/18.11/solutions/_images/windows.png
new file mode 100644
index 00000000..14dfd7b0
Binary files /dev/null and b/documentation/18.11/solutions/_images/windows.png differ
diff --git a/documentation/18.11/solutions/_images/windows.png.data b/documentation/18.11/solutions/_images/windows.png.data
new file mode 100644
index 00000000..670f905c
--- /dev/null
+++ b/documentation/18.11/solutions/_images/windows.png.data
@@ -0,0 +1,3 @@
+title=windows
+author=admin
+path=content/windows
diff --git a/documentation/18.11/solutions/_images/xcell.png b/documentation/18.11/solutions/_images/xcell.png
new file mode 100644
index 00000000..e8411a21
Binary files /dev/null and b/documentation/18.11/solutions/_images/xcell.png differ
diff --git a/documentation/18.11/solutions/_images/xcell.png.data b/documentation/18.11/solutions/_images/xcell.png.data
new file mode 100644
index 00000000..e94389be
--- /dev/null
+++ b/documentation/18.11/solutions/_images/xcell.png.data
@@ -0,0 +1,3 @@
+title=xcell
+author=admin
+path=content/xcell
diff --git a/documentation/18.11/solutions/_images/xy.png b/documentation/18.11/solutions/_images/xy.png
new file mode 100644
index 00000000..1482ebac
Binary files /dev/null and b/documentation/18.11/solutions/_images/xy.png differ
diff --git a/documentation/18.11/solutions/_images/xy.png.data b/documentation/18.11/solutions/_images/xy.png.data
new file mode 100644
index 00000000..1470abef
--- /dev/null
+++ b/documentation/18.11/solutions/_images/xy.png.data
@@ -0,0 +1,3 @@
+title=xy
+author=admin
+path=content/xy
diff --git a/documentation/18.11/solutions/basic-computing/EiffelProcess-and-EiffelBaseProcess.wiki b/documentation/18.11/solutions/basic-computing/EiffelProcess-and-EiffelBaseProcess.wiki
new file mode 100644
index 00000000..8aebb8c8
--- /dev/null
+++ b/documentation/18.11/solutions/basic-computing/EiffelProcess-and-EiffelBaseProcess.wiki
@@ -0,0 +1,93 @@
+[[Property:uuid|479D1DED-2E7B-4202-BE21-D2A1757398B9]]
+[[Property:weight|0]]
+[[Property:title|Process and BaseProcess]]
+[[Property:link_title|External processes]]
+The Process library provides solution to execute a command, to control its execution, to redirect its outputs and input.
+
+{{Note|Since version 17.01, there is a SCOOP-capable library BaseProcess that does not yet have all functionalities of the Process library.}}
+
+= BaseProcess library =
+{{Warning|This solution supports all kind of concurrency (none, thread, and SCOOP), but does not yet offer all the functionalities of the previous Process library. It is recommended to use BaseProcess, unless you badly need the missing features.}}
+
+== Creation of process handlers ==
+The main interfaces are `BASE_PROCESS_FACTORY` and `BASE_PROCESS`. The factory helps to instantiate a `BASE_PROCESS` object, which is the execution controller. The `BASE_PROCESS` object is used to configure the execution, to launch the execution, and check for the termination. It could also terminate the execution if wanted.
+
+The factory interface provides 2 useful functions creating a `BASE_PROCESS` object:
+* `process_launcher` takes as parameters the file name of the executable, then the arguments as a list of strings, and an optional working directory.
+* `process_launcher_with_command_line` is similar to `process_launcher`, but takes the full command line, instead of executable filename and arguments.
+The advantage of `process_launcher` is that you do not have to care about quoting the argument values.
+
+== Output redirection ==
+On the `BASE_PROCESS` object, it is possible to configure the execution.
+* It is possible to redirect the standard and error output, and also the input, for instance:
+** `redirect_output_to_file` is used to record the execution output in a file
+** `redirect_error_to_same_as_output` is used to redirect the error output with the standard output
+** `redirect_input_to_file` is used to take the input from a file.
+** check other `redirect_*` routines.
+
+== Platform-specific settings ==
+
+{| class="wikitable" style="width: auto; margin: 0px auto;"
+|-
+! style="border-style: solid; text-align: center; font-weight: 500;" ! Feature
+! style="border-style: solid; text-align: center; font-weight: 500;" ! Description
+|-
+| colspan="2" | {{Inline-Info|Only for Unix}}
+|-
+| `is_terminal_control_enabled` || If True, the launched process will have terminal control over standard input, output and error. {{Note|Has effect only when `is_launched_in_new_process_group` is True.}}
+|-
+| colspan="2" | {{Inline-Info|Only for Windows}}
+|-
+| `hidden` || If True, the process will be launched silently (no console window will prompt out).
+|-
+| `separate_console` || If True, the process will be launched with a new console instead of inheriting parent's console.
+|-
+| `detached_console` || If True, the process will be launched without any console.
+|}
+
+== Execution control ==
+{| class="wikitable" style="width: auto; margin: 0px auto;"
+|-
+! style="border-style: solid; text-align: center; font-weight: 500;" ! Feature
+! style="border-style: solid; text-align: center; font-weight: 500;" ! Description
+|-
+| `launch` || Launch the execution.
+|-
+| `terminate` || Terminate launched execution. Check `last_termination_successful` after to see if `terminate` succeeded. {{Note|`terminate` executes asynchronously. After calling `terminate`, call `wait_to_exit` to wait for process to exit.}}
+|-
+| `terminate_tree` || Terminate process tree starting from current launched process. Check `last_termination_successful` after to see if `terminate_tree` succeeded. `terminate_tree` executes asynchronously. After calling `terminate`, call `wait_to_exit` to wait for process to exit. {{Note|On Unix, this feature can terminate whole process tree only when `is_launched_in_new_process_group` is set to True before new process is launched.}}
+|-
+| `wait_for_exit` || Wait until process has exited. {{Note|Child processes of launched process are not guaranteed to have exited after `wait_for_exit` returns.}}
+|-
+| `wait_for_exit_with_timeout (timeout: INTEGER)` || Wait launched process to exit for at most `timeout` milliseconds. Check `has_exited` after to see if launched process has exited. {{Note|Child processes of launched process are not guaranteed to have exited even if `has_exited` is `True` after `wait_for_exit_with_timeout`.}}
+|-
+| `close` || Close handles associated with child process. The process may continue running. If there is any input/output redirection to/from current process, it will be closed.
+|}
+
+== Execution status ==
+{| class="wikitable" style="width: auto; margin: 0px auto;"
+|-
+! style="border-style: solid; text-align: center; font-weight: 500;" ! Feature
+! style="border-style: solid; text-align: center; font-weight: 500;" ! Description
+|-
+| `id` || Identifier of the last launched process.
+|-
+| `exit_code`|| Exit code of child process. It should be called after the process has exited.
+|-
+| `platform` || It is a facility to know which is the current platform.
+|-
+| `launched` || Has the process been launched? Check after a call to `launch`.
+|-
+| `is_running` || Is the process still running (i.e launched and not exited)?
+|-
+| `has_exited` || Has launched process exited and have allocated resources been cleaned up?
+|}
+
+= Process library =
+{{Warning|This solution requires multi-threading. In other concurrency modes (none and SCOOP), your project will compile fine but at the execution, it can not be used since your system is not thread-capable.}}
+
+The Process library is an extension of the BaseProcess library, the main interfaces are
+* `PROCESS_FACTORY` which inherits from `BASE_PROCESS_FACTORY` and creates `PROCESS` objects.
+* `PROCESS` which inherits from `BASE_PROCESS` and add agent based redirection.
+The agent based redirections can be useful to process the execution output as it comes, and also to send data to the input.
+
diff --git a/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-class-reference-0.wiki b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-class-reference-0.wiki
new file mode 100644
index 00000000..9d0c61cb
--- /dev/null
+++ b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-class-reference-0.wiki
@@ -0,0 +1,7 @@
+[[Property:title|EiffelBase Class Reference]]
+[[Property:weight|2]]
+[[Property:uuid|9308c4f5-43a5-c07f-2f66-a4597c4ee4ea]]
+==View the [[ref:libraries/base/reference/index|EiffelBase Class Reference]]==
+
+
+
diff --git a/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-samples/eiffelbase-sample-calculator.wiki b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-samples/eiffelbase-sample-calculator.wiki
new file mode 100644
index 00000000..696ae47f
--- /dev/null
+++ b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-samples/eiffelbase-sample-calculator.wiki
@@ -0,0 +1,103 @@
+[[Property:title|EiffelBase Sample: Calculator]]
+[[Property:weight|0]]
+[[Property:uuid|12c3409d-165b-b1df-e26a-b05d49969661]]
+This sample consists of a command line reverse Polish notation (RPN) calculator.
+
+{{note|A RPN calculator works slightly differently from standard calculators. It consists of a stack of numbers. Operations are applied to the two numbers on top of the stack. The result is then put on top of the stack so that it can be used in the next operation. This sample refers to the top of the stack as ''Accumulator''.This sample consists of a command line reverse Polish notation (RPN) calculator. }}
+
+==Compiling==
+
+To compile the example:
+# Launch EiffelStudio.
+# Click '''Add project'''
+# Browse to ''$ISE_EIFFEL\examples\base\calculator\''
+# Choose ''calculator.ecf''
+# Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+# Click '''Open'''.
+
+==Running==
+
+After you launch the sample, the following text appears in a console:
+
+*********************************
+Calculator in reverse Polish form
+*********************************
+
+Allowable operations are:
+ '/': Divide top two numbers on the stack.
+ '0': Empty the stack.
+ 'a': Enter operand onto stack.
+ '?': Help.
+ '*': Multiply top two numbers on the stack.
+ '+': Add top two numbers on the stack
+ 'q': Quit.
+ '-': Subtract top two numbers on the stack.
+Enter a number, followed by :
+
+
+Enter the first number to be put onto the stack, for example 3.
+
+{{caution|Failing to enter a number at this stage will cause the sample to stop. This sample was designed to showcase the use of EiffelBase data structures and is not protected against unexpected entries. }}
+
+You may then add another number on the stack by entering the character a:
+
+*********************************
+Calculator in reverse Polish form
+*********************************
+Allowable operations are:
+ '/': Divide top two numbers on the stack.
+ '0': Empty the stack.
+ 'a': Enter operand onto stack.
+ '?': Help.
+ '*': Multiply top two numbers on the stack.
+ '+': Add top two numbers on the stack
+ 'q': Quit.
+ '-': Subtract top two numbers on the stack.
+Enter a number, followed by : 3
+
+Accumulator = 3
+
+Next operation? a
+Enter a number, followed by :
+
+
+Enter a second number, for example 2. You can then apply any operation to the two operands such as minus:
+
+...
+Next operation? a
+Enter a number, followed by : 2
+
+Accumulator = 2
+
+Next operation? -
+
+Accumulator = 1
+
+Next operation?
+
+
+You may use the operation 0 to clear the stack at any time. You may use q to quit the program.
+
+{{tip|You can use the command ? to display the list of available operations. }}
+
+==Under the Hood==
+
+This sample shows how to leverage EiffelBase data structures in a simple Eiffel system. The root class CALCULATOR first instantiates all ''state'' objects, each corresponding to one possible operation. The state classes all inherit from STATE. They are:
+* PLUS: Add stack's two top numbers.
+* MINUS: Substract stack's two top numbers.
+* MULTIPLY: Multiply stack's two top numbers.
+* DIVIDE: Divide stack's two top numbers.
+* EMPTY: Empty stack.
+* HELP: Prints available commands.
+* QUESTION: Get number from user.
+* QUIT: Close application.
+Each of these classes implement the feature do_one_state from STATE which performs the operation associated with the state. The initial state is QUESTION which asks for the initial number to put in the ''accumulator''. Following states depend on the user input. is_empty and not after
+
+*
+ not off
+
+*
+ not is_empty
+
+
+[[Image:linear|fig.1: Linear Structure]]
+
+
+There is also a procedure
+ off = is_empty or after
+
+This property, however, would be too constraining. More precisely, it is always true that the right-hand side implies the left-hand-side: if a linear structure is either empty or after, then it is off. But the converse is not true, since certain kinds of linear structure, for example bilinear ones, may be off but neither empty nor after.
+ empty_constraint:is_empty implies off
+
+In [[ref:libraries/base/reference/linear_chart|LINEAR]] , feature
+ after_constraint:after implies off
+
+Finally [[ref:libraries/base/reference/bilinear_chart|BILINEAR]] , an heir of [[ref:libraries/base/reference/linear_chart|LINEAR]] , redefines
+ before or after
+
+and adds the invariant clause
+
+ before_constraint: before implies off
+
+The new implementation of
+ after or before
+
+would not guarantee the invariant clause inherited from [[ref:libraries/base/reference/traversable_chart|TRAVERSABLE]] were it not for another clause introduced in [[ref:libraries/base/reference/bilinear_chart|BILINEAR]] :
+
+ empty_property: is_empty implies (after or before )
+
+which indicates that an empty bilinear structure must always be
+ not_both: not(after and before)
+
+The flat-short form of [[ref:libraries/base/reference/bilinear_chart|BILINEAR]] shows the complete reconstructed invariant:
+
+ not_both: not (after and before)
+ empty_property: is_empty implies (after or before)
+ before_constraint: before implies off
+ after_constraint: after implies off
+ empty_constraint: is_empty implies off
+
+==Iteration patterns==
+
+For a more general form of this scheme, applicable to circular chains as well as other linear structures, replace
+ from
+ lin.start
+ some_optional_initializing_operation (lin)
+ until
+ lin.off
+ loop
+ lin.some_action (lin.item)
+ lin.forth
+ end
+
+The value of lin.off is always true for an empty structure, so in this case the loop will, correctly, execute only its initialization actions if present.
+ after = (index = count + 1)
+ before = (index = 0)
+
+which express elementary definitions for
+ after = (is_empty or (index = count + 1))
+ before = (is_empty or (index = 0))
+
+When a structure is created, some initializations will have to be made; the default initializations will usually lead to a value of 0 rather than 1 for index, although this dissymetry is not apparent in the assertions. Although acceptable, this solution leads to small but unpleasant complications, in particular frequent conditional instructions of the form
+
+ if after and not is_empty then...
+
+The solution finally retained for the Base libraries uses a different technique, which has turned out to be preferable. The idea is to replace the conceptual picture by one in which there are always two fictitious sentinel items. The two sentinel items are only present conceptually. They are of course not taken into account for the computation of
+ 0 <= index
+ index <= count + 1
+ before = (index = 0)
+ after = (index = count + 1)
+ not (after and before)
+
+The last property given indicates that a structure can never be both and s .put ( v ) adds v at the end of a sequence s.
+* s .append ( s1 ) adds to the end of s the items of s1 (another sequence), preserving their s1 order.
+
+Other procedures work on the current position:
+* s.s.replace ( v ) replaces by v the item at current position.
+
+SEQUENCE, however, does not provide a procedure to insert an item at the current position, since not all implementations of sequences support this possibility; you will find it in descendants of [[ref:libraries/base/reference/sequence_chart|SEQUENCE]] seen below. s.prune ( v ) removes the first occurrence of v in s, if any.
+* s.prune_all ( v ) removes all occurrences of v.
+
+These procedures have various abstract preconditions: s .extendible for additions, s .writable for replacements, s .not after
+
+Similarly, the precondition for back is
+not before
+
+For lists, after becomes true when the cursor moves past the last item. For circular chains, however, after and before are never true except for an empty structure; this is expressed by the invariant clauses of class [[ref:libraries/base/reference/circular_chart|CIRCULAR]] :
+not before
+
+For a non-empty circular chain, then, you can circle forever around the items, using forth or back.
+
+==Choosing the first item==
+
+For a list, the first and last items are fixed, and correspond to specific places in the physical representation. forth is
+ -- Move cursor to next item, cyclically.
+ do
+ standard_forth
+ if standard_after then
+ standard_start
+ end
+ if isfirst then
+ exhausted := True
+ end
+ end
+
+==Traversing a list or circular chain==
+
+The properties of from
+ lin.start
+until
+ lin.off
+loop
+ ...
+ lin.forth
+end
+
+would not work if lin is a non-empty circular structure: from
+ lin.start
+
+
+
+
+ some_optional_initializing_operation (lin)
+until
+ lin.exhausted
+loop
+ ...
+ lin.some_action (lin.item)
+ lin.forth
+end
+
+This form is applicable to all linear structures, circular or not, since my_list: LINKED_LIST [SOME_TYPE]
+
+will have as its run-time value (if not void) a reference to such an object, which is really a list header. The actual list content is given by the [[ref:libraries/base/reference/linkable_chart|LINKABLE]] instances, each of which contains a value of type LINKED_LIST [SOME_TYPE] will be associated with cells of type LINKABLE [SOME_TYPE]. ( v : like ), which replaces the contents of the cell by a new value.
+
+Class [[ref:libraries/base/reference/linkable_chart|LINKABLE]] is an effective descendant of [[ref:libraries/base/reference/cell_chart|CELL]] , used for one-way linked structures. It introduces features item: G is
+ -- Current item
+ do
+ Result := active.item
+ end
+
+using the deferred class
+ COMPARABLE_STRUCT [G -> COMPARABLE]
+ inherit
+ BILINEAR
+ feature
+ ...
+
+As indicated by the constrained generic parameter it describes bilinear structures whose items may be compared by a total order relation.
+
+{{caution|The class name COMPARABLE_STRUCT, chosen for brevity's sake, is slightly misleading: it is not the structures that are comparable but their items. }}
+
+COMPARABLE_STRUCT introduces the features deferred class
+ PART_SORTED_LIST [G -> COMPARABLE]...
+
+An implementation based on two-way linked lists is available through the effective heir [[ref:libraries/base/reference/sorted_two_way_list_chart|SORTED_TWO_WAY_LIST]] . customers: LIST [CUSTOMER]
+
+then a class
+ from
+ customers.start
+ until
+ customers.exhausted
+ loop
+ if recent_purchases.has (customers.item) then
+ target_list.put (customers.item)
+ end
+ customers.forth
+ end
+
+Such schemes are quite common. But it is precisely because they occur frequently that it is useful to rely on library classes to handle them. One of the principal tasks of object-oriented software development is to identify recurring patterns and build reusable classes that encapsulate them, so that future developers will be able to rely on ready-made solutions.
+ until_do (action: PROCEDURE [G]; test: FUNCTION [G, BOOLEAN])
+ -- Apply `action' to every item of `target' up to
+ -- but excluding first one satisfying `test'.
+ -- (Apply to full list if no item satisfies `test'.)
+ do
+ start
+ until_continue (action, test)
+ ensure then
+ achieved: not exhausted implies test.item ([target.item])
+ end
+
+ until_continue (action: PROCEDURE [G]; test: FUNCTION [G, BOOLEAN])
+ -- Apply `action' to every item of `target' from current
+ -- position, up to but excluding first one satisfying `test'.
+ require
+ invariant_satisfied: invariant_value
+ do
+ from
+ invariant
+ invariant_value
+ until
+ exhausted or else test.item ([target.item])
+ loop
+ action.call ([item])
+ forth
+ end
+ ensure
+ achieved: exhausted or else test.item ([target.item])
+ invariant_satisfied: invariant_value
+ end
+
+
+The precise form of the procedure in the class relies on a call to another procedure, until_continue, and on inherited assertions. Here the routines are shown as they are found in the current implementation of the class [[ref:libraries/base/reference/linear_iterator_chart|LINEAR_ITERATOR]]. STRINGs.
+
+ test (a_item: STRING): BOOLEAN
+ -- Test to be applied to a_item
+ do
+ Result := a_item.count > 0
+ end
+
+
+This indicates that the value of the boolean function
+class
+ TEXT
+
+inherit
+ LINKED_LIST [PARAGRAPH]
+ ...
+feature
+ ...
+end
+
+In a class
+class
+ TEXT_PROCESSOR
+
+inherit
+ LINEAR_ITERATOR [PARAGRAPH]
+
+feature
+
+ resize_paragraphs (t: TEXT)
+ -- Resize all the paragraphs of t up to but excluding
+ -- the first one that has been modified.
+ do
+ set (t)
+ until_do (agent item_action, agent item_test)
+ end
+
+feature {NONE}
+
+ item_test (p: PARAGRAPH): BOOLEAN
+ -- Has p been modified?
+ do
+ Result := p.modified
+ end
+
+ item_action (p: PARAGRAPH)
+ -- Resize p.
+ do
+ p.resize
+ end
+ ...
+end
+
+Thanks to the iteration mechanism, the procedure t as the iteration target, it uses procedure
+ set (s: like target)
+ -- Make s the new target of iterations.
+ require
+ s /= Void
+ do
+ target := s
+ ensure
+ target = s
+ target /= Void
+ end
+
+Another feature introduced in [[ref:libraries/base/reference/iterator_chart|ITERATOR]] is the query until_do.
+ off: BOOLEAN
+ -- Is position of target off?
+ require
+ traversable_exists: target /= Void
+ do
+ Result := target.off
+ end
+
+and similarly for the others. test if both test and b have the same value (both (action: PROCEDURE [G]; starting , number , step: INTEGER).
+* Since with a linear target the iterator can advance the cursor step by step, the basic iteration operations are complemented by variants which pick up from the position reached by the last call: Feature clause only contains the declarations of two features,
+class TWO_WAY_CHAIN_ITERATOR [G] inherit
+
+ LINEAR_ITERATOR [G]
+ redefine
+ target
+ select
+ start,
+ forth,
+ do_all,
+ until_do,
+ do_until,
+ while_do,
+ do_while,
+ do_if,
+ do_for,
+ search,
+ for_all,
+ there_exists,
+ until_continue,
+ continue_until,
+ while_continue,
+ continue_while,
+ continue_for,
+ continue_search
+ end
+
+ LINEAR_ITERATOR [G]
+ rename
+ start as finish,
+ forth as back,
+ do_all as do_all_back,
+ until_do as until_do_back,
+ do_until as do_until_back,
+ do_while as do_while_back,
+ while_do as while_do_back,
+ do_if as do_if_back,
+ do_for as do_for_back,
+ search as search_back,
+ for_all as for_all_back,
+ there_exists as there_exists_back,
+ until_continue as until_continue_back,
+ continue_until as continue_until_back,
+ while_continue as while_continue_back,
+ continue_while as continue_while_back,
+ continue_for as continue_for_back,
+ continue_search as continue_search_back
+ redefine
+ back, finish, target
+ end
+
+create
+ set
+
+feature -- Access
+
+ target: CHAIN [G]
+
+feature -- Cursor movement
+
+ finish
+ -- Move cursor of `target' to last position.
+ do
+ target.finish
+ end
+
+ back
+ -- Move cursor of `target' backward one position.
+ do
+ target.back
+ end
+
+end
+
+
+This class provides a good example of the economy of expression that the full inheritance mechanism affords through the combination of renaming, redefinition, repeated inheritance rules and selection, without sacrificing clarity and maintainability.
+
+==Tree iteration==
+
+Tree iterations, provided by class [[ref:libraries/base/reference/cursor_tree_iterator_chart|CURSOR_TREE_ITERATOR]] , work on trees of the cursor tree form; only with this form of tree are traversal operations possible. Three forms of iteration are provided: preorder, postorder and breadth-first. They correspond to the three traversal policies described in the discussion of trees. Here too it would seem that a rather lengthy class is needed, but repeated inheritance works wonders. set (t) where t represents the selected target data structure. The type of t must correspond to the iteration class selected as ancestor of
+class
+ DUAL_PROCESSOR
+
+inherit
+ LINEAR_ITERATOR [SOME_TYPE]
+ rename
+ item_action as action1,
+ item_test as test1,
+ do_if as do_if1,
+ redefine
+ action1, test1
+ select
+ action1, test1
+ end
+
+ LINEAR_ITERATOR [SOME_TYPE]
+ rename
+ item_action as action2,
+ item_test as test2,
+ do_if as do_if2,
+ redefine
+ action2, test2
+ end
+
+feature
+
+ action1
+ -- Action for the first scheme
+ do
+ ...
+ end
+
+ test1: BOOLEAN
+ -- Test for the first scheme
+ do
+ ...
+ end
+
+ action2
+ -- Action for the second scheme
+ do
+ ...
+ end
+
+ test2: BOOLEAN
+ -- Test for the second scheme
+ do
+ ...
+ end
+
+ iterate1
+ -- Execute iteration of first kind.
+ do
+ set (...)
+ do_if1
+ end
+
+ iterate2
+ -- Execute iteration of second kind.
+ do
+ set (...)
+ do_if2
+ end
+
+ ...
+end
+
+
+The repeated inheritance machinery takes care of the rest.
+
+==Using explicit iterator objects==
+
+To obtain maximum flexibility, classes that need iteration facilities should be clients rather than descendants of the iteration classes. The resulting scheme is completely dynamic: to perform iterations you use iterator objects as discussed earlier.
+class
+ COMPLEX_FIGURE
+
+inherit
+ FIGURE,
+ LINKED_LIST [FIGURE]
+
+feature
+ ...
+end
+
+
+In the feature clause we want to provide the appropriate effectings for the deferred features of class
+ display
+ -- Recursively display all components of the complex
+ -- figure
+ do
+ from
+ start
+ until
+ exhausted
+ loop
+ item.display
+ forth
+ end
+ end
+
+
+Although acceptable and even elegant, this scheme will cause significant duplication: all the
+class
+ COMPLEX_FIGURE_ITERATOR
+
+inherit
+ LINEAR_ITERATOR
+ redefine
+ target
+ end
+
+create
+ set
+
+feature
+
+ target: COMPLEX_FIGURE
+
+end
+
+
+Then for each operation to be iterated define a small class. For example:
+
+class
+ FIGURE_DISPLAYER
+
+inherit
+ COMPLEX_FIGURE_ITERATOR
+ redefine
+ item_action
+ end
+
+create
+ set
+
+feature
+
+ item_action (f: FIGURE)
+ -- Action to be applied to each figure: display
+ -- it.
+ do
+ f.display
+ end
+end
+
+
+Similarly, you may define
+ display
+ -- Recursively display all components of the complex
+ -- figure
+ local
+ disp: FIGURE_DISPLAYER
+ do
+ create disp.set (Current)
+ disp.do_all
+ end
+
+
+and similarly for all the others. create
+deferred class
+ COMPARABLE_SET [G -> COMPARABLE]
+
+ inherit
+ SUBSET [G]
+ COMPARABLE_STRUCT [G]
+ ...
+
+
+describes sets whose items may be compared by a total order relation. The class has the features [[ref:libraries/base/reference/comparable_set_chart|min]] and [[ref:libraries/base/reference/comparable_set_chart|max]] .
+ a.put (x, i)
+ x := a.item (i)
+ x := a @ i
+
+The first causes the value of a at index
+ h.put (x, k)
+ x := h.item (k)
+
+where
+class HASH_TABLE [G, H -> HASHABLE] ...
+
+G represents the type of the objects to be stored in the hash table, H the type of their keys.
+ create my_table.make (n)
+
+The value of create my_tree.make (root_value)
+
+This will attach my_tree to a new one-node tree, with root_value at the root node. Here my_tree must be declared of type [[ref:libraries/base/reference/two_way_tree_chart|TWO_WAY_TREE]] [MY_TYPE] for some type MY_TYPE, and root_value must be of type MY_TYPE. create my_tree.make (max_estimated_children, root_value)
+
+The integer argument max_estimated_children only serves for the initial allocation; the array will be resized if the number of children grows beyond the initial size. As with the previous kinds of tree, the newly created node initially has no children.
+
+===Fixed trees===
+
+[[ref:libraries/base/reference/two_way_tree_chart|TWO_WAY_TREE]] is useful for fully dynamic trees, in which a node may get new children at any time. For some applications, the number of children of a tree, although still arbitrary, is set for each node when the node is created, and will not change after that. Of course, some children may be absent; the corresponding entries will be void references. Class [[ref:libraries/base/reference/fixed_tree_chart|FIXED_TREE]] provides the basic mechanism; as you may have guessed, the implementation associates with each node an array of its children, arrays usually being the right structure when a collection of objects is known not to change size after creation. To create a fixed tree, use
+create my_tree.make (how_many_children, root_value)
+
+The root will have the associated value root value and will have how_many_ children children, all initially void. Unlike the argument max_estimated_children for the creation procedure of [[ref:libraries/base/reference/arrayed_tree_chart|ARRAYED_TREE]] , the value of how_many_children is the final arity of the newly created node; since it set separately for each node on creation, the various nodes of a tree can have different arities, as illustrated on the above figure.
+
+===Properties of recursive trees===
+
+Whether fixed or dynamic, recursive trees fully enjoy their dual origin. This means in particular that each node is viewed as a list of its children, and can apply to this list the features inherited from [[ref:libraries/base/reference/list_chart|LIST]] , appropriately renamed; for example: i -th child of the active node. If i is equal to 0 the cursor ends up before; if i is equal to the arity of the current parent plus 1, the cursor ends up [[ref:libraries/base/reference/cursor_tree_chart|after]] . Calling [[ref:libraries/base/reference/cursor_tree_chart|down (i)]] when the cursor is on a leaf node results in setting [[ref:libraries/base/reference/cursor_tree_chart|below]] and [[ref:libraries/base/reference/cursor_tree_chart|before]] to true if i is equal to 0, or [[ref:libraries/base/reference/cursor_tree_chart|below]] and [[ref:libraries/base/reference/cursor_tree_chart|after]] to true if is equal to arity+1.
+* [[ref:libraries/base/reference/cursor_tree_chart|forth]] and [[ref:libraries/base/reference/cursor_tree_chart|back]] move the cursor forward and backward between siblings and can cause the cursor to end up [[ref:libraries/base/reference/cursor_tree_chart|after]] or [[ref:libraries/base/reference/cursor_tree_chart|before]] .
+* [[ref:libraries/base/reference/cursor_tree_chart|up]] moves the cursor up one level. The call may be made even when the cursor is [[ref:libraries/base/reference/cursor_tree_chart|after]] or [[ref:libraries/base/reference/cursor_tree_chart|before]] . If the cursor is on the root of the tree or below in an empty tree, the cursor ends up [[ref:libraries/base/reference/cursor_tree_chart|above]] .
+
+You can move the cursor in any one direction ( [[ref:libraries/base/reference/cursor_tree_chart|up]] , [[ref:libraries/base/reference/cursor_tree_chart|down]] , [[ref:libraries/base/reference/cursor_tree_chart|forth]] , [[ref:libraries/base/reference/cursor_tree_chart|back]] ), repeatedly, until it is [[ref:libraries/base/reference/cursor_tree_chart|off]] ( [[ref:libraries/base/reference/cursor_tree_chart|above]] , [[ref:libraries/base/reference/cursor_tree_chart|below,]] [[ref:libraries/base/reference/cursor_tree_chart|after]] , [[ref:libraries/base/reference/cursor_tree_chart|before]] respectively), but once it is [[ref:libraries/base/reference/cursor_tree_chart|off]] , further movement in the same direction is prohibited. For example the precondition of [[ref:libraries/base/reference/cursor_tree_chart|put_left]] requires [[ref:libraries/base/reference/cursor_tree_chart|before]] to be false, and the precondition of [[ref:libraries/base/reference/cursor_tree_chart|put_right]] requires [[ref:libraries/base/reference/cursor_tree_chart|after]] to be false. (some_signal), where some_signal is an integer code, will determine whether some_signal is supported on the platform.
+
+A class whose routines need to perform specific processing depending on the nature of signals received should inherit from [[ref:libraries/base/reference/unix_signals_chart|UNIX_SIGNALS]] , or a similar class for another platform.
+
+Because signal codes are platform-dependent, the features of [[ref:libraries/base/reference/unix_signals_chart|UNIX_SIGNALS]] are implemented as once functions - computed on the first call - rather than constants, although this makes no difference to clients.
+
+==Memory management==
+
+Class [[ref:libraries/base/reference/memory_chart|MEMORY]] , like [[ref:libraries/base/reference/exceptions_chart|EXCEPTIONS]] , is meant to be used as an ancestor by classes that need its facilities. It offers a number of features for controlling memory management and fine-tuning the garbage collection mechanism, a key component of the Eiffel Software environment.
+
+One of the most useful features in this class is your_system arg1 arg2 arg3
+
+although one may conceive of other ways of entering the command arguments, such as tabular or graphical form-filling. In any case, the software must be able to access the values passed as command arguments.
+
+A language mechanism is available for that purpose: the Root Class rule indicates that the creation procedure of the root class may have a single argument (in the Eiffel sense of argument to a routine) of type ARRAY [STRING]. The corresponding array of strings will be initialized at the beginning of the system's execution with the values entered as arguments to that execution of the command.
+
+Although this facility suffices in many cases, it is not always convenient if you suddenly need to access the command arguments in a class that is far away from the root. An alternative mechanism, class ARGUMENTS, is available. Once again, this is a class from which you should inherit if you need its facilities. It has just two exported features:
+* (i), a string, is the i-th command argument. Here i must be between 0 and i = 0 the result is the name of the command itself.
diff --git a/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/Files--input--output.wiki b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/Files--input--output.wiki
new file mode 100644
index 00000000..dedad538
--- /dev/null
+++ b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/Files--input--output.wiki
@@ -0,0 +1,35 @@
+[[Property:uuid|37099E33-657D-44CF-923C-1F10BE09AAFB]]
+[[Property:weight|2]]
+[[Property:title|Files, input, output]]
+A few classes of the Kernel Library support file manipulation, input and output: [[ref:libraries/base/reference/std_files_chart|STD_FILES]] , FILE, [[ref:libraries/base/reference/directory_chart|DIRECTORY]] and [[ref:libraries/base/reference/unix_file_info_chart|UNIX_FILE_INFO]] . For simple applications it suffices to use [[ref:libraries/base/reference/std_files_chart|STD_FILES]] , but to understand the concepts better it is preferable to look first at the other two.
+
+==General files==
+
+FILE describes the notion of sequential file viewed as a data structure which fits in the general taxonomy of EiffelBase.
+
+The class declaration defines files as unbounded sequences of characters. This means that you will find in FILE all the operations on sequential data structures that you have come to know and love by reading this documentation - at least, all that apply. Just as stacks and linked lists, files have io.put_string ("My message")
+
+[[ref:libraries/base/reference/std_files_chart|STD_FILES]] defines three default files through features
+ infix "+" (other: REAL): REAL
+
+
+but there is actually no problem here. A language convention applicable to all arithmetic expressions, the Balancing rule, states that in any such expression all operands are considered to be converted to the heaviest type, where [[ref:libraries/base/reference/real_64_chart|DOUBLE]] is heavier than [[ref:libraries/base/reference/real_32_chart|REAL]] and [[ref:libraries/base/reference/real_32_chart|REAL]] is heavier than [[ref:libraries/base/reference/integer_32_chart|INTEGER]] . So mixed-type arithmetic, consistent with common practice, is possible and indeed frequent.
+
+==Arrays==
+
+To create and manipulate one-dimensional arrays, use class [[ref:libraries/base/reference/array_chart|ARRAY]] of the Kernel Library. Arrays are not primitive language elements; instead, they are handled through class [[ref:libraries/base/reference/array_chart|ARRAY]] . This class is 'normal' in the sense that it may be used just as any other class by client and descendant classes. It is also somewhat special, however, in that the Eiffel compiler knows about it and uses this knowledge to generate efficient code for array operations.
+
+To create an instance of [[ref:libraries/base/reference/array_chart|ARRAY]] , use the creation instruction
+
+ create my_array.make (1, u)
+
+
+where the arguments indicate the lower and upper bounds. These bounds will then be accessible as my_array .lower and my_array .my_array .
+ x := my_array.item (i)
+ my_array.put (new_value, i)
+
+
+Function item has a bracket alias, so that you may also write the first assignment above more concisely as
+
+ x := my_array [i]
+
+
+Features iin the above calls) to be within the bounds of the array. This means that you can detect bounds violations (which correspond to bugs in the client software) by using a version of class [[ref:libraries/base/reference/array_chart|ARRAY]] compiled with precondition checking on. The bounds of an array may be changed dynamically through procedure
+ my_array: ARRAY [SOME_TYPE]
+ direct_access: SPECIAL [SOME_TYPE]
+
+
+you may use
+ direct_access:= my_array.area
+ -- The critical loop:
+ from
+ some_initialization
+ index := some_initial_index
+ until
+ index = some_final_index
+ loop
+ ...
+ x := direct_access.item (index)
+ ...
+ direct_access.put (some_value, index)
+ ...
+ end
+
+
+This replaces an original loop where the operations were on my_array. Feature my_array .my_array is 1 or another small integer, use 0 as lower bound instead when creating my_array, but only use the positions starting at 'lb'. You will waste a few memory positions (0 to lb-1), but will not have to change anything in your algorithm and will avoid costly subtractions.
+
+It is important to note that this optimization, if at all necessary, should at most affect a few loops in a large system. You should always begin by writing your software using the normal [[ref:libraries/base/reference/array_chart|ARRAY]] facilities; then once you have the certainty that the software is correct, if you detect that a large array computation is hampering the efficiency of the system, you may apply the above technique to get the fastest performance out of that computation. The change to the software will be minimal - a few lines - and will be easy to undo if necessary.
+
+==Tuples==
+
+A new Kernel Library class is introduced: [[ref:libraries/base/reference/tuple_chart|TUPLE]] .
+
+Alone among all classes, class TUPLE has a variable number of generic parameters. TUPLE, TUPLE [X], TUPLE [X, Y], TUPLE [X, Y, Z] and so on are all valid types, assuming valid types X, Y, Z and so on.
+
+Conformance rules:
+[CONF1]
+ For n >= 0
+ TUPLE [U1, U2, ..., Un, Un+1] conforms to
+ TUPLE [U1, U2, ..., Un]
+
+(and hence to TUPLE [T1, T2, ..., Tn] if each of the Ui conforms to each of the Ti for 1 <= i <= n.)
+
+In particular all tuple types conform to [[ref:libraries/base/reference/tuple_chart|TUPLE]] , with no parameter.
+[CONF2]
+ For n >= 0 If *every* one of the types T1, T2, ..., Tn conforms
+ to a type T, then TUPLE [T1, T2, ..., Tn] conforms
+ to ARRAY [T]
+
+
+{{Definition|Tuple Type|A "tuple type" is any type based on class [[ref:libraries/base/reference/tuple_chart|TUPLE]] , i.e. any type of the form TUPLE [T1, T2, ..., Tn] for any n (including 0, for which there is no generic parameter). }}
+
+
+{{note|CONF1 should be understood in terms of the underlying mathematical model. TUPLE [T1, T2, ..., Tn] is the set TUPLE n of all partial functions f from N+ (the set of non-negative integers) to T1 U T2 U ... Tn, such that:n is indeed a subset of TUPLE n+1, and in particular TUPLE 0, the empty set, is a subset of TUPLE n for any n.)
+
+Semantics: an instance of TUPLE [T1, T2, ..., Tn] is a tuple whose first element is an instance of T1, the second element being an instance of T2 etc. (The precise definition is the mathematical one given in note 1.) Note that there can be more than n elements to the tuple: for example a tuple with first element 5 and second element "FOO" is an instance of all of the following tuple types: TUPLE; TUPLE [INTEGER]; TUPLE [INTEGER, STRING].
+
+It may seem restrictive at first to permit only one class, [[ref:libraries/base/reference/tuple_chart|TUPLE]] , to have an arbitrary number of actual generic parameters. Why not have a general mechanism for declaring any class C so that all of C [X], C [X, Y] etc. are valid? But in fact this is not really a restriction. To obtain this effect without any complicated language convention, just declare C as
+C [G -> TUPLE] and then use the generic derivations
+C [TUPLE [X]]
+C [TUPLE [X, Y]]
+
+and so on. This also makes it possible to have the effect of some fixed parameters and some variable ones, as in C [G, H, I -> TUPLE] so we have all the necessary flexibility.)
+
+==Tuple expressions==
+
+Let e1, e2, ..., en be expressions of respective types T1, T2, ..., Tn. Then the expression [e1, e2, ..., en] denotes an instance of TUPLE [T1, T2, ..., Tn], whose first element is e1, the second element being e2, etc.
+
+Tuple expressions can be nested: whereas [1, 2, 3] is a tuple with three elements (representing an instance of TUPLE [INTEGER, INTEGER, INTEGER]), [1, [2, 3]] is a tuple with two elements, the second one itself a tuple; the overall expression represents an instance of TUPLE [INTEGER, TUPLE [INTEGER, INTEGER]].
+
+As a special case of tuple expression syntax, the delimiters [ and ] are replaced by parentheses for the tuple representing the actual argument list of a routine call (see section 4).
+
+==Tuple features==
+
+The exact specification of class [[ref:libraries/base/reference/tuple_chart|TUPLE]] will be described in an addition to ELKS. The principal features are:
+* [[ref:libraries/base/reference/tuple_chart|count]] (number of significant elements)
+* [[ref:libraries/base/reference/tuple_chart|item]] (i), with the obvious precondition: the i-th element, of type [[ref:libraries/base/reference/any_chart|ANY]] (since the value of i is not known at compile time); also first, second, third, fourth and fifth, of the appropriate types.
+* [[ref:libraries/base/reference/tuple_chart|put]] (x, i), with the obvious precondition: replace i-th element with x. If argument x is not of the appropriate type T i there is no effect.
+* [[ref:libraries/base/reference/tuple_chart|is_equal]] : redefined to consider only the first n elements, where n is the smaller length.
+
+Other features under consideration include:
+* stripped (i): a tuple of type TUPLE [T1, T2, Ti-1, Ti+1, ..., Tn], derived from the current one by removing the i-th component, again with the obvious precondition.
+* wedged (x, i): a tuple with one more element, inserted at position i.
+* '''infix''' "+": tuple concatenation
+* '''infix''' "++": element concatenation; t ++ x is the same thing as t.wedged (x, t.count + 1).
+
+==What have we gained?==
+
+First we have solved the only case in the Eiffel programming language in which an expression has no precisely defined type: polymorphic manifest arrays. We don't have manifest arrays any more, but manifest tuples, with a precisely defined type. No incompatibility is introduced thanks to rule CONF2. The original syntax for manifest arrays, Result := <> , will continue to be supported.
+Second, we can define functions that return multiple results. This is a quite significant increase in expressive power. No common language has that. (You have to go to Lisp and functional languages.) Just define TUPLE [...] as the result type; in the function, you will write things like
+
+Result := [e1, e2, ..., en]
+
+Also, from a theoretical viewpoint, feature calls are simpler and more homogeneous: every feature takes exactly one tuple as argument and returns exactly one tuple as a result. (Either of these tuples may be empty: the first for a feature with no argument, the second for a procedure.) The syntax for a call becomes
+Feature Arguments
+
+with Arguments defined as
+Tuple_expression
+
+where the Tuple_expression uses the form given in section 2 but with the outermost [ and ] delimiters replaced by parentheses to conform to usual practice. So the call
+f (a, b, c)
+
+which we continue to think of as having three arguments a, b and c, formally has only one tuple argument [a, b, c]. This is of course not to be confused with a call of the form
+g ([a, b, c])
+
+which has one argument (a tuple with three elements) in both the ordinary and the formal sense.
+
+==Active, iterators, numerical applications, introspection==
+
+For a set of important applications of tuples see the book chapter on [[EiffelBase, Iteration|agents and iterators]] which also covers aspects of numerical software and related topics following from the tuple mechanism.
+
+==Temporary limitations==
+
+The implementation of tuples has the following limitations:
+* Conformance of [[ref:libraries/base/reference/array_chart|ARRAY]] types to [[ref:libraries/base/reference/tuple_chart|TUPLE]] types is not yet fully supported.
+* Class [[ref:libraries/base/reference/tuple_chart|TUPLE]] does not have features such as first and second. You must use item and, in most cases, an object test.
+
+==Strings==
+
+Strings are handled by class [[ref:libraries/base/reference/string_8_chart|STRING]] , similar in many respects to [[ref:libraries/base/reference/array_chart|ARRAY]] . Strings are of arbitrary size. The make creation procedure takes an integer argument, as in:
+
+ s, s1, s2, s3: STRING
+ ...
+ create s.make (30)
+
+The argument indicates the number of characters for the initial allocation. This is not an absolute limit: the string will automatically grow or shrink as a result of future operations. You may always request a resizing explicitly by calling procedure resize.
+
+==String descriptor==
+
+The object attached at run-time to an entity such declared of type [[ref:libraries/base/reference/string_8_chart|STRING]] is not the actual sequence of characters but a string descriptor, which contains a reference to the actual string contents.
+
+As a result, four assignment or assignment-like operations are possible:
+* '''A1''' s1 := s
+* '''A2''' s2.share (s)
+* '''A3''' s3 := s.twin
+* '''A4''' s4.copy (s)
+
+As illustrated below, ''' A1''' is a reference assignment: s1 will be attached to the same descriptor as s. ''' A2''' keeps the descriptors distinct, but make them refer to the same sequence of characters. In ''' A3''', s3 will be attached to a new string, completely distinct from the string attached to s1 although made of identical characters. ''' A4''' has almost the same effect as '''A3''', but is only applicable if s4 was not void, and will override the existing descriptor rather than creating a new one.
+ [[Image:strings]]
+fig. 1: Effect of string assignment and copy operations
+
+[[ref:libraries/base/reference/basic_routines_chart|BASIC_ROUTINES]] provides a number of conversion functions, such as charconv.
diff --git a/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/Persistence--storage--and-retrieval.wiki b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/Persistence--storage--and-retrieval.wiki
new file mode 100644
index 00000000..2d00826b
--- /dev/null
+++ b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/Persistence--storage--and-retrieval.wiki
@@ -0,0 +1,173 @@
+[[Property:uuid|EA781CE6-3452-4EEF-BF05-47D94FC88A3D]]
+[[Property:weight|3]]
+[[Property:title|Persistence, storage, and retrieval]]
+Most object-oriented applications need the ability to store object structures on persistent storage for later retrieval, and to transfer such object structures to other applications. Eiffel offers a full persistence mechanisms serving these needs.
+
+=Persistence completeness=
+
+A fundamental requirement on object persistence mechanisms is the ''Persistence Completeness'' rule, stated as follows in ''[[Eiffel: The Language]]'':
+
+Whenever an object is stored into an external file, the stored content contains all the dependents of that object. Conversely, retrieving a previously stored object also retrieves all its dependents. ++
+Storing an object just by itself would usually result in wrong semantics: most objects contain references to other objects, which must also be stored and retrieved with it. The persistence completeness rule ensures that this is always the case. It also means, of course, that features used for storing and retrieving objects must do much more than simple input and output; they must perform complete traversals of object structures. ++ +The Eiffel persistence mechanism applies Persistence Completeness. + +=Varieties of store operations= + +Different variants of the store operation are available: '''session''', '''basic''' and '''independent''' store + +* '''Session''' store produces the most compact structure in the resulting files; but the resulting structure is dependent on the current execution of the system which executes the store operation (''System'' is taken here, as elsewhere in this documentation, in its Eiffel sense of an executable assembly of classes, compiled together with the help of a configuration file.) + +* '''Basic''' store is like session store with the difference that the resulting structure is dependent on the system which executes the store operation (i.e. only the system creating the persistent version can retrieve it.) + +* On the other hand, '''independent''' store allows a system running on a computer with a certain architecture to retrieve, without any explicit conversion operation, object structures stored by a system running on a machine of a completely different architecture. In addition, independent store lets you retrieve an old version of the object that was saved (see more details in the recoverable section below.) + +=Using the storage and retrieval facilities= + +Historically, the persistence mechanism was offered via the helper class [[ref:libraries/base/reference/storable_chart|STORABLE]] which you could use as an ancestor whenever you wanted to store and retrieve objects. Via this class you would have access to
+store_object (o: ANY; p: PATH)
+ -- Store object `o` into file located in `p`.
+ local
+ f: RAW_FILE
+ do
+ create f.make_with_path (p)
+ f.open_write
+ f.independent_store (o)
+ f.close
+ end
+
+
+Then to retrieve the object you would write the following:
+
+
+retrieve (p: PATH)
+ -- Retrieve object stored in file located in `p`.
+ local
+ f: RAW_FILE
+ do
+ create f.make_with_path (p)
+ f.open_read
+ if attached {MY_TYPE} io_medium.retrieved as data then
+ -- Retrieved result is of expected type.
+ -- Proceed with processing of result,
+ -- typically with calls of the form `data.some_feature'.
+ else
+ -- Result was not of expected type MY_TYPE.
+ end
+ f.close
+ end
+
+
+If the structure in the file has been corrupted and
+store_object (o: ANY; p: PATH)
+ -- Store object `o` into file located in `p`.
+ local
+ f: RAW_FILE
+ writer: SED_MEDIUM_READER_WRITER
+ do
+ create f.make_with_path (p)
+ f.open_write
+ create writer.make_for_writing (l_file)
+ store (o, writer)
+ f.close
+ end
+
+
+Then to retrieve the object you would write the following:
+
+
+retrieve (p: PATH)
+ -- Retrieve object stored in file located in `p`.
+ local
+ f: RAW_FILE
+ reader: SED_MEDIUM_READER_WRITER
+ do
+ create f.make_with_path (p)
+ f.open_read
+ create reader.make_for_reading (f)
+ if attached {MY_TYPE} retrieved (reader, False) as data then
+ -- Retrieved result is of expected type.
+ -- Proceed with processing of result,
+ -- typically with calls of the form `data.some_feature'.
+ else
+ -- Result was not of expected type MY_TYPE.
+ end
+ f.close
+ end
+
+
+In case of an error during retrieval, no objects will be returned and instead the query
+correct_mismatch
+ -- Attempt to correct object mismatch during retrieve using `mismatch_information'.
+ do
+ -- In version 5.1 and earlier, `content', `keys' and `deleted_marks'
+ -- were of base class ARRAY. In 5.2 we changed it to be a SPECIAL for
+ -- efficiency reasons. In order to retrieve an old HASH_TABLE we
+ -- need to convert those ARRAY instances into SPECIAL instances.
+
+ -- Convert `content' from ARRAY to SPECIAL.
+ if attached {ARRAY [G]} mismatch_information.item ("content") as l_temp then
+ content := l_temp.area
+ end
+
+ -- Convert `keys' from ARRAY to SPECIAL.
+ if attached {ARRAY [H]} mismatch_information.item ("keys") as l_temp then
+ keys := l_temp.area
+ end
+
+ -- Convert `deleted_marks' from ARRAY to SPECIAL.
+ if attached {ARRAY [BOOLEAN]} mismatch_information.item ("deleted_marks") as l_temp then
+ deleted_marks := l_temp.area
+ end
+
+ if content = Void or keys = Void or deleted_marks = Void then
+ -- Could not retrieve old version of HASH_TABLE. We throw an exception.
+ Precursor {TABLE}
+ end
+ end
+
+
+Note the use of
+inherit
+ ANY
+
+
+As a result, every developer-defined class is a descendant of [[ref:libraries/base/reference/any_chart|ANY]] . You may introduce your own project specific features in [[ref:libraries/base/reference/any_chart|ANY]] so that all the classes of your system will be able to use these features.
+
+=Using the universal classes=
+
+If you need to rename or redefine a feature inherited from one of the universal classes, you should include an explicit inheritance clause, as in
+
+class
+ C
+inherit
+ ANY
+ rename
+ out as basic_out
+ redefine
+ print
+ end
+ ...
+feature
+ ...
+end
+
+
+
+
+
+The features of [[ref:libraries/base/reference/any_chart|ANY]] are usable in both qualified and unqualified form. For example, the argumentless function out, which produces a printable representation of any object, may be called under either of the forms
+
+ x := out
+ x := a.out
+
+
+The first call yields a printable representation of the current object; the second, which assumes that a is not void, yields a printable representation of the object attached to a.
+
+=Input and output features=
+
+Some of the features of [[ref:libraries/base/reference/any_chart|ANY]] cover common input and output needs.
+
+Feature x of any type, the string x.out is a printable representation of x. This works for x of all types, reference or expanded. For example, if x is an integer expression, x.out is its string representation, such as -897; if n is a non-void reference, x.out is (recursively) the concatenation of the result of applying out to the successive fields of the attached object, each labeled by the name of the corresponding attribute. You may redefine out in any class to specify any suitable format for displaying instances of the class. To obtain the default representation regardless of any redefinition of out, use tagged_out, declared as a frozen synonym of the original out.
+
+The call print (x) will output the value of x.out on the default output if x is not void, and do nothing otherwise.
+
+=Copy and comparison routines=
+
+Procedure copy copies the fields of an object onto those of another. It is used under the form
+
+ target.copy (source)
+
+
+Here both target and source must be non-void; this means that twin. For non-void source, the assignment
+
+ target := source.twin
+
+starts by creating a new object, then populates its fields to be identical to source.
+
+The boolean function = and /= which, in the case of reference types, compare references, not objects.
+
+The function equal follows, since equal (a, b) is defined as a.is_equal (b) for non-void a). You will find such redefinitions in a number of classes of the Base libraries. For example an instance of [[ref:libraries/base/reference/string_8_chart|STRING]] is a string descriptor containing a reference to the actual character sequence, not that sequence itself, so that what the default equal compares and the default copy copies is the descriptor, not the string. Class [[ref:libraries/base/reference/string_8_chart|STRING]] redefines these routines to yield the semantics normally expected by string clients; the frozen variants clone which is used to do the job of twin, but has a form like copy, as in target.clone (source). clone is an obsolete function. Use twin instead.
+}}
+
+=Type information=
+
+The string-valued query like Current, so what it returns is the default value of the current type. This is mostly interesting for expanded types, since for reference types the default value is simply a void reference.
diff --git a/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/index.wiki b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/index.wiki
new file mode 100644
index 00000000..835403e0
--- /dev/null
+++ b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-kernel/index.wiki
@@ -0,0 +1,20 @@
+[[Property:title|EiffelBase, The Kernel]]
+[[Property:weight|0]]
+[[Property:uuid|A26C5BCA-20A5-4EE6-9710-F4E8B72DBA10]]
+In addition to basic concepts close to the language level, the Kernel covers such common needs as '''input''' and '''output''', '''storage''' and '''retrieval''' of objects on persistent storage, fine control over '''exception handling''' and '''memory management''', and access to '''operating system facilities'''. The kernel can be divided into 5 logical clusters of classes:
+# [[Universal class and its features|The first cluster]] contains the universal class defining facilities accessible to all other classes: [[ref:libraries/base/reference/any_chart|ANY]] . Every developer-defined class is a descendant of this class.
+# [[Language-related facilities|The second cluster]] includes classes whose facilities are directly related to language concepts:
+** Classes describing the basic types: [[ref:libraries/base/reference/boolean_chart|BOOLEAN]] , [[ref:libraries/base/reference/character_8_chart|CHARACTER]] , [[ref:libraries/base/reference/integer_32_chart|INTEGER]] , [[ref:libraries/base/reference/real_32_chart|REAL]] and [[ref:libraries/base/reference/real_64_chart|DOUBLE]]
+** Arrays: class [[ref:libraries/base/reference/array_chart|ARRAY]]
+** Tuples: class [[ref:libraries/base/reference/tuple_chart|TUPLE]]
+** Strings: class [[ref:libraries/base/reference/string_8_chart|STRING]]
+** Basic facilities: class [[ref:libraries/base/reference/basic_routines_chart|BASIC_ROUTINES]]
+# [[Files, input, output|The third cluster]] provides input and output facilities:
+** [[ref:libraries/base/reference/std_files_chart|STD_FILES]] offers basic mechanisms, sufficient for simple input and output.
+** [[ref:libraries/base/reference/file_chart|FILE]] describes the notion of sequential file, viewed as a sequence of characters and fully integrated in the data structure library.
+** [[ref:libraries/base/reference/directory_chart|DIRECTORY]] gives properties of directories (files serving as collections of other files).
+# [[Persistence, storage, and retrieval|The fourth cluster]] makes it possible to store object structures on persistent storage and retrieve them later. This facility can also be used to transmit object structures through pipes or over a network.
+# [[Access to internal properties|The last cluster]] provides access to internal properties of the compiler and environment, useful for applications that need some fine-tuning of the basic mechanisms:
+** Class [[ref:libraries/base/reference/exceptions_chart|EXCEPTIONS]] (complemented by [[ref:libraries/base/reference/unix_signals_chart|UNIX_SIGNALS]] for Unix-type platforms) provides control over the exception handling mechanism, in particular for applications that need to handle different types of exception in different ways.
+** Similarly, classes [[ref:libraries/base/reference/memory_chart|MEMORY]] and [[ref:libraries/base/reference/gc_info_chart|GC_INFO]] provide ways to control the garbage collector and tailor it to specific needs.
+** Class ARGUMENTS gives access to the command-line arguments.
diff --git a/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-support-cluster.wiki b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-support-cluster.wiki
new file mode 100644
index 00000000..ce401540
--- /dev/null
+++ b/documentation/18.11/solutions/basic-computing/eiffelbase/eiffelbase-tutorial/eiffelbase-support-cluster.wiki
@@ -0,0 +1,31 @@
+[[Property:title|EiffelBase Support Cluster]]
+[[Property:weight|2]]
+[[Property:uuid|f9c2a003-9836-6688-db1f-5aa31313b317]]
+The support cluster offers some commonly needed functionality that do not belong to the kernel.
+
+==Conversions, mathematical properties and ASCII characters==
+
+A few utility classes complement the [[EiffelBase, The Kernel|kernel]] facilities. [[ref:libraries/base/reference/primes_chart|PRIMES]] , [[ref:libraries/base/reference/random_chart|RANDOM]] and [[ref:libraries/base/reference/fibonacci_chart|FIBONACCI]] are part of the data structure taxonomy; the others are meant to be used as ancestors by classes needing their features.
+
+Two classes provide basic mathematical functions such as logarithms and trigonometric functions: [[ref:libraries/base/reference/single_math_chart|SINGLE_MATH]] for single precision and [[ref:libraries/base/reference/double_math_chart|DOUBLE_MATH]] for the double-precision variants. [[ref:libraries/base/reference/math_const_chart|MATH_CONST]] contains mathematical constants: p , the square root of two, Euler's constant e .
+
+[[ref:libraries/base/reference/primes_chart|PRIMES]] , [[ref:libraries/base/reference/random_chart|RANDOM]] and [[ref:libraries/base/reference/fibonacci_chart|FIBONACCI]] are data structure classes - heirs of [[ref:libraries/base/reference/countable_sequence_chart|COUNTABLE_SEQUENCE]] . In all of these classes function i_th takes an integer argument i and will return the i-th element of the sequence under consideration - prime numbers, pseudo-random numbers or Fibonacci numbers. These sequences are active structures, on which forth will advance the current position and item will return the value at the current position. A few other features are specific to each case: for example [[ref:libraries/base/reference/random_flatshort|higher_prime]] will yield the smallest prime greater than or equal to a certain value, and [[ref:libraries/base/reference/random_flatshort|set_seed]] will define the seed to be used for starting the pseudo-random sequence.
+
+==Internal object structures==
+
+Class [[ref:libraries/base/reference/internal_chart|INTERNAL]] provides low-level access to internal object structures. It, too, is meant to be used as ancestor by classes needing its features. separate added to the Eiffel programming language. As you will see, the semantics of preconditions differ with concurrent execution versus sequential. Also, there are other underlying concepts and rules that need to be understood, but the point is that concurrent Eiffel using SCOOP will look a lot like sequential Eiffel.
+
+Third, SCOOP uses the common act of argument passing to identify the necessity for guaranteeing exclusive access.
+
+We will examine the details of how all this fits together and what it means to you as you begin to build concurrent software in Eiffel using SCOOP.
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-asynchronous-calls.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-asynchronous-calls.wiki
new file mode 100644
index 00000000..fd3bc333
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-asynchronous-calls.wiki
@@ -0,0 +1,136 @@
+[[Property:title|Asynchronous Calls]]
+[[Property:weight|6]]
+[[Property:uuid|d3d3873c-5c84-7566-547e-1ede38544081]]
+==Overview==
+
+As we've seen in [[Separate Calls]], feature calls to a non-separate target are always synchronous.
+Furthermore, queries are always synchronous as well, because the caller has to wait for the result.
+
+{| border="1"
+|-
+! Target
+! Query
+! Command
+|-
+| non-separate
+| synchronous
+| synchronous
+|-
+| separate
+| synchronous
+| potentially asynchronous
+|}
+
+Asynchronous calls can therefore only happen on commands with a separate target.
+Indeed, such calls are by default executed asynchronously, but there are some important exceptions to this rule.
+A command to a separate target is executed synchronously if any of the following applies:
+* The client (caller) and supplier (target) region are the same.
+* The target region is passive.
+* The callee needs a lock currently held by the caller (lock passing).
+* The caller holds the locks of the callee (separate callbacks).
+
+== Triggers for Synchronization ==
+
+=== Same Regions ===
+
+The first case happens when a reference is declared separate, but happens to be non-separate. This case follows directly from the type system: A non-separate type A always conforms to its variation separate A. At run-time such cases can be detected with an object test:
+
+
+sep_object: separate A
+--...
+if attached {A} sep_object as non_sep_object then
+ -- ...
+end
+
+
+=== Passive Regions ===
+
+In the SCOOP model, a passive region does not have a processor attached to it.
+This means that clients of the passive region need to apply features logged against a passive region themselves.
+The logical consequence of this is that all call to a passive region, including commands, are executed synchronously.
+
+=== Lock Passing ===
+
+Lock passing is another source of synchronization. It is one of the trickiest issues to detect, and to fully understand it we must first introduce a few more definitions.
+
+In [[Exclusive Access]] we have learned that an object is ''controlled'' if it appears as a formal argument of the enclosing routine. SCOOP however always grants exclusive access over a whole region. We therefore introduce the new term ''Lock'':
+
+{{definition|Lock|Exclusive access to a SCOOP region and all objects therein.}}
+
+Note the difference between ''controlled'' and ''locked'':
+* ''Controlled'' applies to a single object, whereas ''locked'' applies to a region.
+* The ''controlled'' property can be determined statically at compile-time, whereas ''locked'' is determined at runtime.
+* The set of ''controlled'' objects of a processor is always a subset of the set of objects in ''locked'' regions.
+
+{{note|In terms of implementation, a ''lock'' corresponds to an open call queue to a region.}}
+
+Now consider a small classes HASH_STORAGE and EXAMPLE:
+
+class HASH_STORAGE feature
+
+ hash_code: INTEGER
+
+ set_hash_code (a_string: separate STRING)
+ do
+ hash_code := a_string.hash_code
+ end
+end
+
+class EXAMPLE feature
+
+ run (a_hash_storage: separate HASH_STORAGE; a_string: separate STRING)
+ do
+ a_hash_storage.set_hash_code (a_string)
+ io.put_integer (a_hash_storage.hash_code)
+ end
+end
+
+
+You might notice a problem here:
+In the feature {EXAMPLE}.run, exclusive access to 'a_hash_storage' and 'a_string' is guaranteed by the SCOOP semantics.
+Or in other words, the corresponding regions are ''locked''. The feature {HASH_STORAGE}.set_hash_code however needs access to ''a_string'' as well.
+In the SCOOP model, as seen so far, this would result in a deadlock. The handler of the HASH_STORAGE object waits for exclusive access on the string object, and the EXAMPLE object waits for the query {HASH_STORAGE}.hash_code to return.
+
+To resolve this problem, SCOOP implements a technique called ''Lock Passing''.
+Locks on regions can be passed to the handler of the target of a separate call.
+Lock passing happens whenever the client processor (the handler of the EXAMPLE object) has locked a region that holds an object which is passed as an actual argument to a separate call. Note that this also includes non-separate reference objects, because a processor always holds a lock over its own region.
+
+When a client has passed its locks to the supplier processor, it cannot continue execution until the called feature has been applied by the supplier processor, and the supplier processor has given back the locks to the client. Therefore, this type of call must be synchronous.
+
+{{note|During lock passing, a processor gives away all the locks that it currently holds, including the lock on itself.}}
+
+{{note| Lock passing happens for every synchronous call, in particular also for queries and passive processors.}}
+
+The advantage of lock passing is that it enables some very common programming patterns without triggering a deadlock. The disadvantage, however, is that it's hard to tell '''when''' it happens. However, there are a few cases when lock passing is guaranteed to happen, namely when the actual argument passed to a separate call is
+* a formal argument of the enclosing routine,
+* of a non-separate reference type or
+* Current.
+
+There are, however, some cases where it's not immediately obvious that lock passing happens.
+For example, a region might be locked because of a controlled argument somewhere further up in the call stack (i.e. not the enclosing routine, but the caller of that routine), or because an object is passed as an argument which happens to be on the same region as one of the controlled objects.
+
+There is a workaround to disable lock passing for a specific call:
+
+async_call (a_procedure: separate PROCEDURE [TUPLE])
+ do
+ a_procedure.call (Void)
+ end
+
+example (a_object: separate ANY)
+ do
+ async_call (agent a_object.some_feature (Current))
+ end
+
+
+The feature async_call can be defined somewhere in the project and can be reused. The downside is that an agent needs to be created, but there's no lock passing happening, because all arguments to the agent are closed and only Void is passed to the separate call which cannot trigger lock passing.
+However, this mechanism should be used with some care, because it's easy to run into one of the above mentioned deadlocks.
+
+=== Separate Callbacks ===
+
+The last occurrence of synchronous calls is closely related to lock passing. If a processor '''A''' has passed a non-separate reference argument to another processor '''B''', and thus has passed its locks away, it cannot proceed its execution. Sometimes however processor '''B''' has to log some calls back to '''A''', which is called a ''separate callback''.
+
+{{definition|Separate Callback | A separate call where the caller holds the locks of the callee. }}
+
+During a separate callback processor '''B''' has to give back the locks it has previously received from '''A'''.
+This in turn means '''B''' has to wait until '''A''' has finished its execution of the separate callback and returned the locks, which effectively makes the call synchronous.
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-design-by-contract.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-design-by-contract.wiki
new file mode 100644
index 00000000..62b16d6f
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-design-by-contract.wiki
@@ -0,0 +1,57 @@
+[[Property:title|Design by Contract in SCOOP]]
+[[Property:link_title|Design by Contract]]
+[[Property:weight|5]]
+[[Property:uuid|f8df5904-d1ee-31d7-f618-fb8bf1ddc876]]
+
+The backbone of the Eiffel Method is design by contract. Preconditions, postconditions, and class invariants are used in Eiffel for extending software interfaces into software specification. This is essentially the same in concurrent Eiffel with SCOOP as it is in traditional, sequential Eiffel. However, because of the concurrent nature of processing under SCOOP, the runtime semantics of the elements of Design by Contract are different for concurrent systems.
+
+
+==Preconditions==
+
+The role of the precondition is somewhat different in SCOOP than in sequential Eiffel. In non-concurrent Eiffel we view the precondition of a routine as defining a set of obligations on potential callers of the routine. That is, the set of conditions that must be true before correct execution of the routine can be expected. So, we could look at the precondition clauses in sequential Eiffel as '''correctness conditions'''. A typical example might be a square root routine that returns the square root of a passed argument value. A precondition clause, i. e., a correctness condition, for this routine will be that the argument must be non-negative. It is the responsibility of the caller to ensure that this property of the argument holds at the time of the feature call.
+
+In concurrent Eiffel, the same correctness conditions are still valid, but there are cases in which we must view the clients role here a little differently.
+In the case of a precondition clause that depends on a separate object, even if the client tests the condition ahead of the call, there is no assurance that action by some other concurrent processor may have invalidated the precondition clause between the time that the check was made and the time that the feature application takes place.
+
+In SCOOP preconditions can therefore additionally take the role of a '''wait condition'''.
+Wait conditions are useful for cases where the caller can't guarantee that a property on an object is true at the time of the call, but it knows that it will eventually become true.
+If a wait condition fails, the current processor will stall its execution, release the locks on its arguments, and wait until the precondition is fulfilled.
+
+A typical example is a CONSUMER object trying to dequeue an item from a shared BUFFER.
+In the following example, the precondition in {CONSUMER}.consume is treated as a wait condition:
+
+class CONSUMER feature
+ consume (a_buffer: separate BUFFER): INTEGER
+ require
+ not_empty: not a_buffer.is_empty
+ do
+ Result := a_buffer.item
+ a_buffer.remove
+ end
+end
+
+
+A precondition clause is only treated as a wait condition when there's a separate call.
+However, the opposite is not true - not all precondition clauses with a separate call are treated as wait conditions.
+The rule is a bit tricky to understand, but as a general rule of thumb, a precondition violation is raised when the SCOOP runtime detects that there's no possibility that a precondition clause may become true in the future if the routine releases its exclusive access.
+
+{{Info| Alright, here are the exact rules: The decision depends on the context of the '''caller''' of the routine.
+If one of the separate objects used as a target in a precondition clause is ''locked'' (see definition in [[Asynchronous Calls]]) in the context of the caller, the precondition is treated as a correctness condition. Otherwise, it is a wait condition.}}
+
+{{SeeAlso|The {PRODUCER}.store feature in the [[Producer-consumer|producer-consumer]] example. When called by {PRODUCER}.produce it becomes a '''wait condition'''.}}
+
+==Postconditions==
+
+As with preconditions the effect of concurrent execution can make a difference in how postconditions are viewed.
+
+If a routine has executed correctly, then the postcondition of the routine will hold at the time that it terminates. This is true whether or not concurrency is involved. However, when a postcondition involves separate calls, clients must be cautious about how they depend upon the state guaranteed by postconditions.
+
+
+==Class invariants==
+
+The '''separate argument''' rule in [[Separate Calls]] tells us that a separate call is valid only on a target which is a formal arguments of the enclosing routine. Because class invariants are not routines and therefore have no arguments, separate calls are not allowed in class invariants.
+
+{{Info|Technically, it should be possible in a class invariant to code an inline agent that gets passed arguments of separate types, then execute separate calls within the inline agent. But generally, it can be assumed that class invariants contain no separate calls. }}
+
+The semantics of class invariants will be the same as in sequential Eiffel, precisely because invariants must include only non-spearate calls. To put it the terms of SCOOP, the class invariant ensuring the validity of any particular object will be evaluated entirely by the processor handling that object.
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/baboon-crossing.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/baboon-crossing.wiki
new file mode 100644
index 00000000..b3e0e0ba
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/baboon-crossing.wiki
@@ -0,0 +1,46 @@
+[[Property:title|Baboon crossing]]
+[[Property:weight|-10]]
+[[Property:uuid|8b48b7bb-baa8-41a2-2d93-1d9667b05323]]
+
+
+=Description=
+
+In the baboon crossing problem, a number of baboons are located on the edges of a deep canyon. There are baboons on both sides and, as you have probably guessed, some of the baboons on the left side want to get to the right side, and vice versa. Fortunately, a large rope has been stretched across the abyss allowing baboons to cross by brachiation: hanging from the rope and swinging hand-over-hand to the other side.
+
+The baboon crossing policy must be compatible with the constraints of the situation:
+
+# If two baboons meet in the middle of the rope, then all activity stops, and no other baboons can cross (deadlock). So, at any given time, all the baboons on the rope must be going the same direction.
+# The rope can hold only a certain number of baboons at a time. A baboon cannot be allowed on the rope if the rope is already at full capacity.
+# A continuous stream of baboons from one direction could prevent baboons wanting to go the opposite direction from ever being able to cross (unfairness, starvation).
+
+
+=Highlights=
+
+The rope is modeled in this example by class ROPE, and is the primary shared resource. The fact that, at any given moment, the rope is considered unavailable to baboons wanting to cross the canyon in the direction opposite the current flow of baboons adds an interesting twist ... as does the maximum limit of baboon flesh that the rope can support. The ROPE class has features to manage its state:
+
+: capacity is an integer representing the maximum number of baboons that can be supported at one time.
+: baboons is an integer which is the number of baboons currently traversing the rope.
+: direction is the current direction of baboon flow, represented as a boolean.
+: changing is an indicator of whether the direction of the rope is currently in the process of changing.
+: is_secure is a boolean indicating whether the rope is in such a state that a baboon may be allowed to mount the rope.
+
+ROPE also includes procedures mount and dismount which a baboon uses to get on and off the rope.
+
+There are two more interesting features of ROPE, directions and announce which will be discussed below.
+
+The baboons (modeled by class BABOON), as they are created, are determined at random to want to go either left or right. As each baboon is created by the root class of the example, it is launched into life. For the purposes of this example, the baboon life is short and consists of four steps:
+
+: 1) Announcing one's desired direction to the rope. Doing this involves the feature {ROPE}.announce that was mentioned above. The rope keeps a queue of these desired directions as announced by the baboons in its directions feature. It is by keeping this queue that the rope can make its decisions to change the direction of the flow of baboons.
+
+: 2) Mounting the rope. The baboon calls its own mount feature (which in turn calls {ROPE}.mount. The baboon's mount procedure includes two wait conditions. One makes sure the rope is safe ({ROPE}.is_secure), and the second make sure that the direction of the baboons is the same as that of the baboon wanting to mount. Whenever these conditions are met, the baboon is able to grab a spot on the rope and start to cross the canyon.
+
+: 3) Traversing the canyon. Once on the rope, the baboon takes a short time to make it to the other side.
+
+: 4) Dismounting the rope. After crossing the canyon, the baboon gets off the rope ... and dies immediately after attaining what was apparently its only goal in life.
+
+Although it was mentioned above, it bears repeating that the rope is not just a shared resource, but an active and important player in this example. Indeed, it is the rope that controls the direction of the flow of baboons across the canyon, and ensures fairness.
+
+When a baboon announces himself as a candidate for crossing the canyon in a particular direction, the rope queues this information. When the rope allows a baboon to mount and cross, the desired direction of the next baboon in the directions queue is queried. If the next baboon wants to go in a different direction, then the state of the rope is set to "changing", and no more baboons are allowed on the rope until the current stream finishes crossing. When the last baboon if that stream dismounts the rope, the direction of flow is changed and the "changing" state is repealed, allowing baboons wanting to cross in the opposite direction to have a go.
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/barbershop.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/barbershop.wiki
new file mode 100644
index 00000000..b6dc28c1
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/barbershop.wiki
@@ -0,0 +1,27 @@
+[[Property:title|Barbershop]]
+[[Property:weight|-11]]
+[[Property:uuid|3a6f929f-17a2-c9d8-1b88-0aad83db4160]]
+
+=Description=
+
+The [http://en.wikipedia.org/wiki/Sleeping_barber_problem barbershop], sometimes called ''the sleeping barber'', models a barbershop with one barber, one barber's chair, and a waiting room with several chairs. The alternative name of the problem comes from the fact that if there is no one waiting for a haircut, the barber flops in his chair and falls asleep.
+
+Also involved are a number of shaggy-haired customers. A customer entering the barbershop looks around and assesses the situation. If all the waiting room chairs are occupied, the customer leaves the shop to return again at a time when hopefully the queue will be shorter. If there is an open chair the customer sits down and waits for the barber.
+
+Once the barber has finished cutting a customer's hair, the customer leaves the shop which allows another customer to enter the shop (if all the chairs had been occupied) and the the next customer (if there is one) in the queue to get a haircut.
+
+In this example, even after getting their hair cut, the customers come back to the shop until they have had their hair cut some prescribed number of times.
+
+
+=Highlights=
+
+The example contains classes that model the barber (BARBER), the customers (CUSTOMER), and the shop with its waiting area (SHOP). The root class creates as separate objects the barber, the shop, and the set of customers. As each customer is created, it is launched on its lifecycle of getting haircut after haircut until haircuts are no longer needed.
+
+The SHOP includes features enter and leave. Customers call the enter feature to find out if there is a chair available in the shop. Customers call leave, after their hair has been cut. Both of these calls are "wrapped" as separate calls in the class CUSTOMER.
+
+A typical customer lives in this way: As long as he still needs haircuts, he repeatedly does the following steps: He tries to enter the shop. If he's unsuccessful because all the chairs are occupied, he goes off for a while (in the implementation, his processor sleeps and then comes to the end of this step). If he is able to enter the shop, then he puts himself in the queue for a haircut. Once his haircut is complete, he reduces his number of haircuts needed by one, and leaves the shop.
+
+
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/counter.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/counter.wiki
new file mode 100644
index 00000000..bb732888
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/counter.wiki
@@ -0,0 +1,36 @@
+[[Property:title|Counter]]
+[[Property:weight|-14]]
+[[Property:uuid|ef5e7a86-3c2d-6a55-07b5-395f30bf8f96]]
+
+=Description=
+
+Unlike many of the other examples, this one is not really a problem to be solved. Rather, the Counter example uses multiple instances of the simple class COUNTER to explore various concurrent scenarios. Each instance of COUNTER has a unique identifier, a current value, and a speed. A counter's speed is that time that it takes to perform a single increment. You will see that some of the tests start multiple counters at different speeds. Class COUNTER has a procedure run which takes an integer as an argument, and increments the counter that many times. The example's root class contains the code to create counter instances and run the various tests.
+
+=Highlights=
+
+There are six tests that can be called from the root procedure:
+
+
+ make
+ -- Test counters.
+ do
+ print ("Counter application%N")
+ -- Leave one of the following lines uncommented to perform testing.
+
+ test_1 -- start just one counter
+-- test_2 -- start two counters
+-- test_3 -- start many counters
+-- test_4 -- start counter_1 twice
+-- test_5 -- start counter_1 with precondition
+-- test_6 -- start counter_1 separately and counter_2 non-separately
+ end
+
+
+You can uncomment the test that you want to run and leave the rest commented. When you run the test, you can see you can watch the output in the console window as the test progresses.
+
+Have a look at the source code for each test before you run it, so that you can reconcile the output you see with your expectation of the execution.
+
+
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/dining-philosophers.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/dining-philosophers.wiki
new file mode 100644
index 00000000..caca96b4
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/dining-philosophers.wiki
@@ -0,0 +1,53 @@
+[[Property:title|Dining philosophers]]
+[[Property:weight|-12]]
+[[Property:uuid|569f012e-7913-fbdf-7ad7-cd17d82e64aa]]
+
+=Description=
+
+In the [http://en.wikipedia.org/wiki/Dining_philosophers_problem dining philosophers] a number of philosophers (five, in our example) are seated at a round table. On the table are five plates of food, one in front of each philosopher, and five forks, one between each adjacent pair of plates. So each philosopher has a plate in front of him and a fork to his left and a fork to his right.
+
+The philosophers spend all their time in either of only two states: they are thinking or they are eating. The philosophers may be mental giants, but apparently manual dexterity is not their strong suit. This is evidenced by the fact that in order to eat, any philosopher must be able to pick up both of the forks positioned next to his plate (which he can do, so long as neither of the philosophers next to him is currently eating). So, while eating he must have possession of both forks, and while thinking, he has put down any forks that he had previously used. Therefore, any particular philosopher has the opportunity to eat only when the two philosophers on either side of him are thinking and have made their forks available.
+
+Apart from any negative consequences from the questionable sanitary practices described above, the dining philosophers can, in improperly designed solutions, encounter problems related to concurrency. For example, if all philosophers were to pick up the fork to their right and then wait for the fork to their left to become available (or vice versa), the philosophers would be caught in a [http://en.wikipedia.org/wiki/Deadlock deadlock]. If, because of a lack of fairness in the solution, some of the philosophers get stuck in thinking mode because they can never secure the two forks necessary to eat, then those philosophers so affected would suffer a condition known as [http://en.wikipedia.org/wiki/Resource_starvation resource starvation].
+
+
+=Highlights=
+
+This example includes three classes relevant to the problem: DINING_PHILOSOPHERS, PHILOSOPHER, and FORK. Class DINING_PHILOSOPHERS sets the problem in motion by creating the forks and philosophers all typed as separate, and then applying the feature live to each philosopher after creation.
+
+Class PHILOSOPHER models the philosophers. The totality of a philosopher's exciting activities is modeled by the feature step:
+
+
+ step
+ -- Perform tasks.
+ do
+ think
+ eat (left_fork, right_fork)
+ end
+
+
+This feature is called by {PHILOSOPHER}.live repeatedly until the philosopher has eaten a prescribed number of times.
+
+The feature think requires no access to shared objects, but the feature eat depends upon the philosopher's ability to secure access to both of the forks adjacent to his plate. Because all forks are separate objects, each call to eat waits until the processors for both the left and right forks are available (in accordance with the [[Concurrent programming with SCOOP#Access to shared resources|Wait rule]]).
+
+Another interesting feature of this example is the feature {PHILOSOPHER}.eat. If you look at the text of this feature
+
+
+ eat (l, r: separate FORK)
+ -- Eat, having grabbed l and r.
+ do
+ io.put_string ("Philosopher " + id.out + ": taking forks%N")
+ times_eaten := times_eaten + 1
+ io.put_string ("Philosopher " + id.out + ": eating%N")
+ io.put_string ("Philosopher " + id.out + ": putting forks back%N")
+ end
+
+
+and you're not wearing your SCOOP glasses, this could look a little odd to you. Here is a routine that takes two arguments l and r representing the left and right forks. But then, l and r are never used in body of the routine!
+
+However, with SCOOP in mind, we realize that the fork objects are shared resources to which exclusive access must be secured before a philosopher can eat. In this example, the fork object themselves don't really do anything except serve that purpose. (Take a look at the FORK class, and you'll see that it has no features.)
+
+In real world concurrency problems, it is likely that shared resources would play a more active role than the forks of the dining philosophers, but here it's just not necessary.
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/dining-savages.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/dining-savages.wiki
new file mode 100644
index 00000000..611e9d56
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/dining-savages.wiki
@@ -0,0 +1,24 @@
+[[Property:title|Dining savages]]
+[[Property:weight|-6]]
+[[Property:uuid|ecd618f3-14f4-1a06-7f9c-be57623a9889]]
+
+=Description=
+
+The problem of the dining savages (an allusion to the classic dining philosophers) is based on the arguably tasteless analogy of a number of members of a primitive culture, hereinafter called the "savages", sharing a meal from a single pot. The primary abstractions are the savages themselves, a cook, and the pot. The pot contains a certain number of servings of savage sustenance (the nature of which will be left to your imagination). Each of the savages can freely remove a serving from the pot so long as the pot is not empty. So before taking a serving, a savage must check to make sure the pot is not empty. In the case in which the pot is empty, the savage must wake up the cook to refill the pot, after which the feast continue. The savages, then, can eat only when the pot is not empty, and the cook can fill the pot only when the pot is empty.
+
+
+=Highlights=
+
+The primary shared resource here is the pot, represented by class POT, which is accessed for different purposes by both the savages and by the cook. POT has queries is_empty and is_full that can be used by savages (modeled by class SAVAGE) and the cook (class COOK). POT also has a feature to allow refilling of the pot. This feature is exported only to COOK. Another feature, this one exported only to SAVAGE allows the removal of a serving from the pot.
+
+The cook can also be viewed as a resource shared among all the savages. Whenever a savage executes the feature that checks the pot, he must have exclusive access to both the pot and the cook. If the pot is empty then the savage uses his access to the cook to request a refill. If the pot is not empty, then the savage exits the routine, and goes on to execute the routine that removes a serving from the pot.
+
+In the root class, you can adjust the number of savages, the size (in servings) of the pot, and how hungry the savages are. The hunger index indicates how many times a savage will take a serving from the pot and eat it before becoming sated. So if the pot holds 20 servings and there are 5 savages with hunger index of 4, then the pot will become empty just as the last savage takes his last serving, meaning that the pot will not require refilling. In the same scenario, if the hunger index were 10, then 50 servings total would be required, resulting in the need for the cook to be notified to refill the pot 2 times ... and 10 servings leftover ... presumably for tomorrow's breakfast.
+
+The root class creates the pot, then the cook, then some number of savages. As the savages are created, their lives are launched. To occupy themselves, they repeatedly check the pot, take a serving, and eat. They give this all up once they have eaten the number of servings prescribed by their hunger index. During the check of the pot, if the pot is empty, a separate call is made to the cook requesting that the pot be refilled, and the savage goes on about the business of removing a serving from the pot. It is possible that when the savage then tries to get a serving from the pot, the pot will still be empty. In this case the precondition on get_serving_from_pot will cause the savage to wait until such time as the pot is no longer empty.
+
+Whenever the cook is requested to refill the pot, the {COOK}.cook procedure is called. The procedure takes as an argument the pot which is declared of course as separate. So access to the pot must be guaranteed before cook can execute. The cook procedure has a precondition that causes it to wait if the pot is not currently empty.
+
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/faneuil-hall.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/faneuil-hall.wiki
new file mode 100644
index 00000000..abf27f97
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/faneuil-hall.wiki
@@ -0,0 +1,43 @@
+[[Property:title|Faneuil Hall]]
+[[Property:weight|-5]]
+[[Property:uuid|93132084-5eb9-c7d9-d58c-7b5c3f7508f8]]
+=Description=
+
+The Faneuil Hall example is one of several examples that comes to us from Allen Downey's book ''[http://greenteapress.com/semaphores/ The Little Book of Semaphores]''. Downey credits Grant Hutchins as the originator of the example. [http://en.wikipedia.org/wiki/Faneuil_Hall Faneuil Hall] itself is an historic building in Boston which dates from 1742 an has served as a public meeting and market place.
+
+The scenario in the Faneuil Hall example involves a number of immigrants waiting to have their naturalizations confirmed by a judge and receive their certificates of citizenship. Immigrants entering the Hall wait in line to check in, then they wait to take their oaths and receive their certificates of citizenship. Meanwhile, a number of spectators can also enter the building. Once the judge enters the Hall, no one else may enter the hall. Spectators may leave, but immigrants may not. Once the immigrants in the Hall have checked in, their naturalization can be confirmed by the judge. Once confirmed, the immigrants can pick up their certificates. At some point after the confirmation, the judge leaves the Hall. At that point, spectators can enter again, and immigrants can leave as soon as they have picked up their certificates. The judge will make successive trips into the hall until all the immigrants expect during the day have been confirmed.
+
+
+=Highlights=
+
+The primary actors here are the immigrants, the judge, and the spectators, model by classes IMMIGRANT, JUDGE, and SPECTATOR, respectively. In addition to the actor classes, there is a class HALL that represents Faneuil Hall itself, and a root class that sets everything up and starts the processing. There is only one judge. But there can be many immigrants and spectators. Their numbers are limited to certain maximums specified by constants in the root class. The specific number of immigrants and spectators varies at random from one execution to the next. You can experiment with larger or smaller maximum numbers for immigrants and spectators by changing the values for the constants {FANEUIL_HALL}.Max_immigrants and {FANEUIL_HALL}.Max_spectators.
+
+Although not really considered an actor here, the class HALL plays a critical role in synchronizing the concurrent actions of the immigrants, spectators, and the judge. HALL includes many status queries which, when used in preconditions in features of the other actors, constitute [[Concurrent programming with SCOOP#Preconditions|uncontrolled precondition clauses]] which when false will cause the calling processor to wait until the condition becomes true. For example, consider the following status query from class HALL:
+
+
+ immigrants_ready: BOOLEAN
+ -- Are immigrants ready?
+ do
+ Result := present_immigrant_count = ready_immigrant_count
+ end
+
+
+This query is used by the JUDGE when preparing to sit and administer oaths to the immigrants:
+
+
+ take_place (a_hall: separate HALL)
+ -- Prepare to confirm.
+ require
+ immigrants_ready: a_hall.immigrants_ready
+ do
+ print (out + " taking place%N")
+ a_hall.sit_judge
+ end
+
+
+The judge will take his place only when all the immigrants present have checked in and are ready to take the oath.
+
+Another thing to note about this example is that immigrants and spectators obey slightly different rules when coming and going in the hall. Neither immigrants nor spectators may enter the hall if the judge is in the hall. Immigrants may not leave until the judge has left, but spectators may leave at anytime. So when you compare the leave features of the two classes you'll see a precondition that serves as a wait condition on {IMMIGRANT}.leave that is not present on {SPECTATOR}.leave.
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/index.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/index.wiki
new file mode 100644
index 00000000..4337e405
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|SCOOP examples]]
+[[Property:weight|8]]
+[[Property:uuid|75ddd9e0-3baf-655a-748f-ea8765a1d06d]]
+The examples for SCOOP that are distributed with EiffelStudio are solutions to classic and not-so-classic concurrency problems.
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/observer-pattern.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/observer-pattern.wiki
new file mode 100644
index 00000000..44994774
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/observer-pattern.wiki
@@ -0,0 +1,31 @@
+[[Property:title|Observer pattern]]
+[[Property:weight|-4]]
+[[Property:uuid|72c53c25-6fa5-6787-0762-cfa3d1c814c5]]
+
+=Description=
+
+The Observer pattern example should be considered a work in progress. During the development of SCOOP for EiffelStudio, Eiffel Software engineers began to think in terms of the impact that SCOOP might have on our own software. One area that emerged was the parsing of Eiffel software text during compilation. You know that Eiffel systems are composed of modules called classes. In a non-concurrent compilation process, the classes are parsed one after another. However, there is no reason why parsing could not take place on multiple, concurrently executing SCOOP processors.
+
+You may remember seeing as you compile an Eiffel system, the different degrees of compilation counting down. Degree 5 is a phase of compilation that deals with parsing classes and creating an abstract syntax tree. The Observer pattern example tries to imagine concurrent Degree 5 parsing in the presence of SCOOP.
+
+
+{{note|You should understand that the example doesn't really parse any Eiffel code or, for that matter, involve any real code files. Rather, it just tries to show what the structure of such a concurrent parser might look like, and the parsing step just involves a short wait to simulate the time that parsing would take.}}
+
+
+=Highlights=
+
+The name of this example is Observer pattern, but it's not a classic example of the [http://en.wikipedia.org/wiki/Observer_pattern Observer design pattern] as commonly known. But it does have elements of the observer pattern, as you will see below.
+
+The important classes here are DEGREE_5, EIFFEL_PARSER_POOL, and EIFFEL_PARSER. DEGREE_5 represents Eiffel compilation degree five, parsing of classes. In the example, DEGREE_5 uses an instance of EIFFEL_PARSER_POOL to manage a pool of instances of EIFFEL_PARSER which actually do the (simulated) parsing. The EIFFEL_PARSERs are declared separate so that they can work concurrently, parsing different files.
+
+When DEGREE_5 creates the EIFFEL_PARSER_POOL, it provides a maximum number of parsers to be held in the pool and a function agent which the pool can use to create a new parser instance. Then when DEGREE_5 asks the pool to parse a file, it provides references to the file itself and two procedure agents: one for pre-parse processing and one for post-parse processing.
+
+The pre-parse processing agent is associated with a routine that is used to set up a parser before asking it to parse a file.
+
+When an EIFFEL_PARSER finishes with a file, it calls the agent for post-parse processing. In this way, it notifies the instance of DEGREE_5 that it is done with that file.
+
+So, it is here that elements of the observer pattern become evident, just in a slightly non-typical way. In more typical observer pattern examples, there is one observed object and a set of one or more observers. But here, there is one observer, the instance of DEGREE_5, and many observable objects, the parsers. When parsers complete their work, they notify their observer (the DEGREE_5), that they are done by executing the routine associated with the post-parse agent. So there's another difference, too. Instead of making calls directly to the observer, the observed objects apply the agents that have been provided by the observer.
+
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/producer-consumer.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/producer-consumer.wiki
new file mode 100644
index 00000000..b47f803b
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/producer-consumer.wiki
@@ -0,0 +1,69 @@
+[[Property:title|Producer-consumer]]
+[[Property:weight|-13]]
+[[Property:uuid|03739be2-e0d5-f5f0-b405-0bb75c8fee0f]]
+
+=Description=
+
+The [http://en.wikipedia.org/wiki/Producer-consumer_problem producer-consumer] problem is a classic software concurrency problem. The problem features one or more "producers" and one or more "consumers". All producers and consumers must share access to a "buffer" into which producers insert the products they produce, and from which consumers take the products they consume. The shared buffer is "bounded", that is, it has a maximum capacity.
+
+So at any time, the buffer could be empty, precluding any consumer from withdrawing a product. Or the buffer could be full, which would mean that no producer could produce a new product until a consumer had first consumed a product, making space in the buffer. To avoid concurrency related problems, producers and consumers can access the buffer only at times when no other producer or consumer is accessing it, and only when it is in the proper state for the particular type requesting access (i. e., not empty for consumers and not full for producers).
+
+=Highlights=
+
+The root class of the example creates the bounded product buffer and a number of producers and consumers, all given separate types. It requests the producers to create a number of products, and the consumers, in the aggregate, to consume that same number of products.
+
+==Separate argument rule==
+
+Notice that the root class uses a feature launch_producer (and a corresponding feature launch_consumer) for instructing the producers and consumers on how many products to handle. launch_producer looks like this:
+
+
+ launch_producer (a_producer: separate PRODUCER)
+ -- Launch `a_producer'.
+ do
+ a_producer.produce (900)
+ end
+
+
+It might occur to you that it would be easier, simpler, and clearer just to include this feature's single procedural line:
+
+
+ a_producer.produce (900)
+
+
+in place of the call to launch_producer, and dispense with the launch_producer feature entirely. But that is not possible in this case.
+
+The reason is that a_producer.produce (900) is a [[Concurrent programming with SCOOP#Separate types and separate calls|separate call]] (i. e., the object attached to a_producer is declared of a separate type), and according to the [[Concurrent programming with SCOOP#Access to shared resources|separate argument rule]], calls on a separate object are valid only when applied to an argument of the enclosing routine.
+
+==Wait condition==
+
+This example also shows an [[Concurrent programming with SCOOP#Preconditions|uncontrolled precondition]] serving as a "wait condition". In the class PRODUCER we see the buffer declared as a class attribute with a separate type:
+
+
+ buffer: separate BOUNDED_BUFFER [INTEGER]
+ -- Shared product buffer.
+
+
+The feature store contains a precondition which ensures that the shared buffer is not full when store gets applied:
+
+
+ store (a_buffer: separate BOUNDED_BUFFER [INTEGER]; an_element: INTEGER)
+ -- Store `an_element' into `a_buffer'.
+ require
+ not a_buffer.is_full
+ do
+ a_buffer.put (an_element)
+ ensure
+ not a_buffer.is_empty
+ a_buffer.count = old a_buffer.count + 1
+ end
+
+
+The store routine is called by the routine produce, passing a reference to the separate attribute buffer like this:
+
+
+ store (buffer, l_element)
+
+
+Because buffer is considered uncontrolled in the context of produce, then the precondition for store becomes a wait condition, rather than a correctness condition. This means that if the buffer is full, then the application of the feature store will wait until some consumer removes an product from the buffer. The removal of a product makes the precondition hold again, and the application of store can proceed.
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/quicksort.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/quicksort.wiki
new file mode 100644
index 00000000..e64b4837
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/quicksort.wiki
@@ -0,0 +1,22 @@
+[[Property:title|Quicksort]]
+[[Property:weight|-7]]
+[[Property:uuid|61632685-20ad-293b-44b6-907b15d0447a]]
+
+=Description=
+
+The quicksort example is a concurrent implementation of the well-known [http://en.wikipedia.org/wiki/Quicksort quicksort] sorting algorithm developed by computer scientist [http://en.wikipedia.org/wiki/C._A._R._Hoare C. A. R. Hoare]. Quicksort uses a "divide and conquer" strategy to sort a structure. It applies a basic algorithm to the structure which leads to a division of the elements into to two substructures. Then it applies the same algorithm to each of the substructures, and so on, until the whole structure is sorted. Because of the repetitive application of the same algorithm to evolving parts of the structure, the quicksort is often used in computer science classes to provide students with experience in [http://en.wikipedia.org/wiki/Recursion_(computer_science) recursive] computation.
+
+In the SCOOP example, instead of recursive calls, substructures are handled (within limits) by separate [[Concurrent programming with SCOOP|SCOOP processors]] running concurrently.
+
+
+=Highlights=
+
+The quicksort example sorts a randomly generated container of integers. The set-up for this example is done in the root class. It is interactive in the sense that when you run the example, you get to to choose how many elements will be sorted (within certain limits) and you get to provide a seed for the random number generator which will be used to produce the unsorted structure.
+
+The quicksort algorithm is embodied in the class QUICKSORTER, primarily in its routine sort. Instances of QUICKSORTER declared as separate are spawned to sort substructures as the algorithm progresses.
+
+The structures acted upon by QUICKSORTER are managed in instances of class DATA. DATA is a class designed specifically to support the quicksort example.
+
+When the example runs, separate QUICKSORTER processes are used for the recursive sorts up until a certain depth of recursion is reached. The limit is defined by the NATURAL constant {QUICKSORTER}.max_recursion_depth.
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/search-insert-delete.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/search-insert-delete.wiki
new file mode 100644
index 00000000..f81dc6ba
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/search-insert-delete.wiki
@@ -0,0 +1,44 @@
+[[Property:title|Search-insert-delete]]
+[[Property:weight|-9]]
+[[Property:uuid|2c09ce66-f3be-1e31-eac8-f06ad3d6fc3a]]
+
+=Description=
+
+The Search-insert-delete example involves a shared data structure that is being accessed concurrently by three types of independent actors. ''Searchers'' access the list without changing it. So, any number of concurrent searchers can be accessing the structure safely. ''Inserters'' have the ability to add new elements to the end of the structure. Only one inserter can access the structure at any given time, but can work concurrently with any number of searchers. Lastly, ''Deleters'' can remove items from any position in the structure. As such, any deleter demands exclusive access to the structure. So, while a deleter has access to the structure neither any other deleter, any inserter, nor any searcher is allowed access.
+
+
+=Highlights=
+
+The primary actors are modeled by classes SEARCHER, INSERTER, and DELETER. Additionally, some common features are abstracted into a class ACTOR from which the effective actor classes inherit. Each actor lives only to access the data structure one time. The access looks similar in the different actor classes, and consists of executing a procedure to start the action, then waiting a random time interval, then executing a procedure to end the action.
+
+The shared data structure is modeled by the class SHARED_LIST. Because the point of this example is to demonstrate the different allowable types of concurrent access by the different types of actors, it should be said that features that support that goal are all that you will find in this class. In other words, SHARED_LIST doesn't really maintain a data structure, it only provides the features necessary to coordinate safe concurrent access by searchers, inserters, and deleters.
+
+SHARED_LIST provides features in three feature clauses, each explicitly exported one of the types of accessors. For example, the feature clause exported to clients of type SEARCHER includes the query can_search and the procedures start_search and end_search. The features available to inserters and deleters are nearly identical. Because of the different concurrency requirements of each type of actor though, the implementation for can_search and can_delete are different. Also different are the implementations for starting and ending actions for the various actor types.
+
+SHARED_LIST keeps certain state attributes:
+
+
+ searchers: INTEGER_32
+ -- How many searchers are there?
+
+ inserting: BOOLEAN
+ -- Is someone inserting?
+
+ deleting: BOOLEAN
+ -- Is someone deleting?
+
+
+These are used in the can_search, can_insert, and can_delete queries, which are in turn used in the preconditions for the corresponding start_xxxx features. For example, start_delete is constrained by a precondition can_delete, which is implemented like this:
+
+
+ can_delete: BOOLEAN
+ -- Can delete?
+ do
+ Result := not deleting and not inserting and searchers = 0
+ end
+
+
+For the deleter calling {SHARED_LIST}.start_delete, the precondition clause can_delete is an [[Concurrent programming with SCOOP#Preconditions|uncontrolled precondition]]. This means that the deleter will wait until the can_delete becomes true before feature application of start_delete occurs.
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/senate-bus.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/senate-bus.wiki
new file mode 100644
index 00000000..cd3604e2
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/senate-bus.wiki
@@ -0,0 +1,25 @@
+[[Property:title|Senate bus]]
+[[Property:weight|-8]]
+[[Property:uuid|cfce3b31-bb8d-8259-a02b-73fd1495fce9]]
+
+=Description=
+
+According to Allen Downey in his text ''[http://greenteapress.com/semaphores/ The Little Book of Semaphores],'' the Senate bus example was inspired by the [http://www.wellesley.edu/Transportation/senate.html Senate Bus at Wellesley College]. Passengers come to a bus stop to catch the Senate bus. The bus can hold 50 passengers. When the bus stops at the bus stop, the waiting passengers board. If the bus fills up, then any passengers who cannot board, must wait until the bus shows up again. Likewise, any passenger who arrives at the stop during the time the bus is boarding also must wait until the next cycle.
+
+
+=Highlights=
+
+The root class for this example creates the bus stop, the bus, and the passengers all typed as separate.
+
+The bus stop, modeled by class STATION has features that can be used by the bus and by passengers. Access to these
+features is restricted to the appropriate client classes through the clients part of the feature clause. Clients of type PASSENGER can access {STATION}.pass_enter. A client of type BUS can access {STATION}.bus_enter, {STATION}.pick_up, and {STATION}.leave, as well as a status feature {STATION}.bus_is_waiting and two passenger queues {STATION}.waiting_list and {STATION}.checked_in_list.
+
+The lifecycle of a passenger is simple: enter the bus stop. This is accomplished by making a [[Concurrent programming with SCOOP#Separate types and separate calls|separate call]] to {STATION}.enter and passing Current (the passenger object itself) as an argument.
+
+The lifecycle of the bus is slightly more complex: enter the bus stop, pick up passengers, leave the bus stop, wait for a short time. The bus repeats this sequence forever. The routines in class BUS for entering the bus stop, picking up passengers, and leaving the bus stop all accept as an argument the separate bus stop object (a_station: separate STATION) and make a [[Concurrent programming with SCOOP#Separate types and separate calls|separate call]] to the corresponding routine in STATION.
+
+Features of the bus stop (class STATION) manage the queues for waiting and checked-in passengers and whether a bus is at the bus stop. Passengers are added to the waiting queue when they arrive at the station. When the bus leaves the station, any waiting passengers are transferred to the checked-in queue. When the bus arrives at the station, the passengers on the checked-in queue are allowed to board the bus (up to the first 50 passengers, that is), and the boarding passengers are then removed from the checked-in queue.
+
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/single-element-producer-consumer.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/single-element-producer-consumer.wiki
new file mode 100644
index 00000000..81d1e6a0
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-examples/single-element-producer-consumer.wiki
@@ -0,0 +1,21 @@
+[[Property:title|Single-element producer-consumer]]
+[[Property:weight|-15]]
+[[Property:uuid|25d3e585-0eb6-efa8-ada9-8ee596df5ada]]
+=Description=
+
+The single-element producer-consumer is a simpler variant of the classic [http://en.wikipedia.org/wiki/Producer-consumer_problem producer-consumer] problem. A producer produces products, in this case integers, into a single-element inventory. The products are then consumed from inventory by a consumer. The producer, consumer, and inventory are managed by separate [[Concurrent programming with SCOOP#Processors|processors]], so any access they have to one another must be synchronized through scoop mechanisms.
+
+=Highlights=
+
+In the single-element producer-consumer only a single producer and single consumer are created, and there is only storage allowing for a single instance of the product. So, effectively in this example, the bounded buffer of the classic producer-consumer problem has a size of one.
+
+The classes modeling the different actors have obvious names: PRODUCER, CONSUMER, and INVENTORY. The root class of the example creates one separate instance of each of these, and then brings the producer and consumer to life.
+
+The PRODUCER class supports a procedure produce in which a product is produced and stored in the single-element INVENTORY. The producer can only produce an element if the inventory is currently empty. Class INVENTORY exports a boolean query has_item which is the indicator of whether a product has been produced and is available for consumption. So {PRODUCER}.produce has a precondition that depends upon {INVENTORY}.has_item being false. Because the inventory is handled by a separate processor, this precondition is [[Concurrent programming with SCOOP#Preconditions|uncontrolled]] and will cause the producer to wait until the condition is true to proceed.
+
+The CONSUMER class works in a way that is largely the symmetrical opposite of PRODUCER. The consumer tries to consume the item from the INVENTORY. But this only possible if an item has been produced and is available. So {CONSUMER}.consume has a "wait" precondition based on the query {INVENTORY}.has_item.
+
+So the heart of the problem is the synchronization between producer and consumer sharing a single inventory. If there's already a product in inventory, the producer cannot produce more and must wait. Only when the consumer consumes the current product can the producer produce again. For the consumer's part, if there's a product currently in inventory, then the consumer can consume that product. Otherwise, the consumer must wait until the producer produces a new product. The synchronization is handled by the SCOOP mechanism of uncontrolled (wait) preconditions on the inventory.
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-exceptions.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-exceptions.wiki
new file mode 100644
index 00000000..a5b75c37
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-exceptions.wiki
@@ -0,0 +1,107 @@
+[[Property:title|Exceptions in SCOOP]]
+[[Property:link_title|Exceptions]]
+[[Property:weight|7]]
+[[Property:uuid|4f760d0c-ff3b-5f8a-7d43-9be855cef17a]]
+== Introduction ==
+
+Exceptions are a rather nasty issue in concurrency.
+In a shared memory system, an exception can leave a system in an inconsistent state, for example because they jump over an unlock operation.
+In message passing systems on the other hand they can introduce unnecessary synchronization just to make sure that no exception happened, or they can create havoc because the recipient of an exception message is no longer in a state where it can handle it.
+
+For SCOOP, the exception mechanism was carefully designed with the following goals in mind:
+* Comprehensibility: It should be easy to understand
+* Compatibility with exceptions in sequential programs
+* Consistency: An exception should not leave objects in a tainted state.
+* Asynchrony: Exceptions should not restrict the level of concurrency.
+
+== Exception Propagation ==
+
+Within a single processor, exceptions propagate just like in a sequential program.
+When a routine encounters an exception, the rescue clause is entered, and if no retry statement is present, the exception is propagated to the caller.
+This ensures backwards compatibility with sequential programs, because when there's only the root processor, the semantics are exactly the same.
+Furthermore, this mechanism has proven itself useful for restoring invariants after an exception in order to bring objects to a consistent state.
+
+The interesting case is when an exception propagates between regions, which happens during a separate call.
+In that case there are two possibilities:
+* The call is synchronous: The exception is propagated to the client region.
+* The call is asynchronous: The exception is not propagated, because the client is busy executing something else. Instead, the supplier region is marked as ''dirty''.
+
+This decision was mostly made to ensure comprehensibility.
+Propagating an exception to the client in an asynchonous call would be really hard to handle.
+The client would have to be ready to handle an exception at any point in time, and there would have been a need for an additional language mechanism to protect critical sections.
+Because of these reasons SCOOP restricts exception propagation to synchronous calls only.
+
+== Dirty Regions ==
+
+A region marked as dirty has suffered an exception in an asynchronous call, which could not be propagated to its client.
+The dirty mark has a big impact for future separate calls.
+
+{{rule|name=Semantics of Dirty Regions|text=
+put_character (c: CHARACTER; a_file: separate MY_FILE)
+ local
+ l_sync: POINTER
+ do
+ a_file.open
+ a_file.put_character (c)
+ a_file.close
+ -- This ensures that exceptions are propagated:
+ l_sync := a_file.default_pointer
+ end
+
+
+Another possibility is to store the failure in the separate object:
+
+
+class MY_FILE feature
+
+ is_tainted: BOOLEAN
+
+ open
+ do
+ -- Open a file.
+ rescue
+ is_tainted := True
+ end
+
+ -- other features
+end
+
+class CLIENT feature
+
+ put_character (c: CHARACTER; a_file: separate MY_FILE)
+ do
+ if a_file.is_tainted then
+ -- Handle exception in `a_file'.
+ end
+ a_file.open
+ a_file.put_character (c)
+ a_file.close
+ end
+end
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-exclusive-access.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-exclusive-access.wiki
new file mode 100644
index 00000000..b7c29ec0
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-exclusive-access.wiki
@@ -0,0 +1,145 @@
+[[Property:title|Exclusive Access]]
+[[Property:weight|4]]
+[[Property:uuid|7f5adf71-7169-c54e-9bed-079c84aee8d3]]
+
+The topic of exclusive access was already briefly touched in [[Separate Calls]].
+In this chapter, we'll have a deeper look at the exclusive access guarantees given in SCOOP, and what it means in practice.
+
+== Reasoning Guarantees ==
+
+In the SCOOP model, there are two very important guarantees - ''Order Preservation'' and ''Exclusive Access''.
+
+{{definition|Order Preservation | The guarantee that, between any two regions, the order of separate feature calls logged by one region is the same as the order of feature applications by the other region.}}
+{{definition|Exclusive Access (to a region) | The guarantee that no intervening features logged by other processors are executed.}}
+
+The first guarantee is always valid.
+A SCOOP processor is never allowed to reorder two feature calls when both have been logged by the same region.
+However, the order preservation guarantee only holds between two processors - it is not valid in a global context.
+For example, when a region A first logs a command to C, and then another region B logs a command to C, you generally don't know which feature will be applied first.
+And also the other way around: You have no guarantee on the order of feature application when A logs both an (asynchronous) separate call to B and C.
+
+Exclusive access on the other hand is only valid in certain contexts.
+When an object is ''controlled'', SCOOP guarantees exclusive access to the region that contains the object.
+We'll define the term ''controlled'' a bit later, but you've already seen an example in [[Separate Calls]]:
+A separate object which is passed as an argument.
+
+These two basic guarantees in the SCOOP model are important to reach one of the main goals:
+The ability to reason about a program should be preserved in a concurrent program.
+SCOOP guarantees that a ''controlled'' object behaves just like in a sequential program,
+meaning that Pre- and Postconditions will remain valid in between feature calls because no other processor can interfere.
+
+== Inline Separate ==
+
+Passing a separate object as an argument is not the only way to gain exclusive access in SCOOP.
+While in theory the mechanism would be sufficient, experience has shown that it's often bulky and not very elegant to write a new routine whenever one wants to call a feature on a separate target.
+
+Therefore SCOOP introduces the ''Inline Separate'' block to make things a bit easier.
+
+person: separate PERSON
+
+show_separate_block
+ do
+ separate person as l_person do
+ print (l_person.age)
+ end
+ end
+
+
+The separate block evaluates the expression on the left hand side of the as keyword, assigns it to the new read-only local variable l_person on the right hand side,
+and does whatever is necessary to provide ''exclusive access'' to the region that handles l_person.
+
+You can think of the inline separate block as syntactic sugar that creates a new wrapper routine (although inline separate still lets you access local variables of the enclosing routine):
+
+person: separate PERSON
+
+show_separate_block
+ do
+ anonymous_wrapper (person)
+ end
+
+anonymous_wrapper (l_person: separate PERSON)
+ do
+ print (l_person.age)
+ end
+
+
+== Controlled Objects ==
+
+The Eiffel compiler introduces the concept of a ''controlled'' object to support the exclusive access guarantee.
+
+{{definition|Controlled/uncontrolled object|An object is '''controlled''' if it is attached to a reference that has one of the following properties:Current, and the meaning is that the current processor has ''Exclusive Access'' to the region that holds the object. In particular, this means that no other processor can access or modify a controlled object.
+
+In chapter [[Separate Calls]] we've already mentioned that SCOOP places a restriction on separate calls.
+A separate call is allowed if the target appears as a formal argument of the enclosing routine.
+While this rule is correct, it does not cover all of the cases.
+With the above definition however, we can both simplify and extend the previous ''Separate Argument'' rule:
+
+{{rule|name=Controlled Target|text=A separate call is valid if its target is controlled.}}
+
+The compiler checks this property at compile-time and throws an error if a separate call happens on an uncontrolled target.
+
+{{note| Query results with a non-separate return type are placed on the same processor as the target. This means that, if a processor controls the target, it is also safe to use these query results. The compiler tries to exploit this fact a little by treating such query results as controlled as well within a single expression. This allows to have multi-dot calls on separate target, such as sep_person.spouse.name.out.
+balance_with_arguments (incr: separate INCREMENTER; decr: separate DECREMENTER): INTEGER
+ do
+ Result := incr.value + decr.value
+ end
+
+balance_with_inline_separate: INTEGER
+ do
+ separate incrementer as incr, decrementer as decr do
+ Result := incr.value + decr.value
+ end
+ end
+
+incrementer: separate INCREMENTER
+decrementer: separate DECREMENTER
+
+
+Exclusive access to the arguments is granted '''atomically''' in this case.
+This ensures that no deadlock can occur when two regions want to gain access to the same regions, provided that they both use the "multiple-arguments-mechanism" of SCOOP and don't lock regions one after the other by hand.
+
+{{SeeAlso|The dining philosopher example makes use of this fact. The feature {PHILOSOPHER}.eat has two separate arguments, which are guaranteed to be locked in one atomic step by the SCOOP runtime. If this were not the case, a deadlock may occur.}}
+
+== Waiting for regions ==
+
+You may wonder how the exclusive access guarantee is implemented in SCOOP.
+A simple solution would be to have a lock for every region, and to gain exclusive access, one has to acquire the lock.
+Before the 15.01 release, this was indeed how it was implemented.
+However, the implementation proved to be flawed because it caused a lot of synchronization and waiting.
+
+In EiffelStudio 15.01 this has changed.
+When a processor needs exclusive access to another one, it opens a new ''queue'' to log calls.
+There can be multiple open queues to a processor, but the processor will always work on only one queue.
+
+This has an important effect in practice: '''Gaining exclusive access to a region is always non-blocking.'''
+Note that this is also true for exclusive access to multiple regions.
+Previously it may have been necessary to wait for another processor to relinquish the lock, but now a processor can just proceed with logging calls, which will eventually be executed by the supplier processor.
+
+You may start to wonder now where waiting happens, as it isn't possible to both have a guarantee for exclusive access and fully non-blocking behaviour.
+Well, it happens during synchronous calls.
+When a client gains exclusive access and starts logging calls, the supplier may not care about it yet because it is busy with something else.
+However, as soon as a synchronous call is logged, the client needs to wait for the result.
+During that time, the supplier will finish its other tasks and eventually start to execute the calls logged by the suspended client, at which point it will wake up again.
+
+{{note|Due to this, the only way to experience a deadlock in SCOOP is when a processor is stuck in a separate query.}}
+
+To summarize:
+* Gaining exclusive access, also to multiple regions, is always non-blocking.
+* An asynchronous call is also non-blocking.
+* Only a call to a query may be blocking, and thus a place where a processor can be stuck (e.g. in case of deadlock or starvation).
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-getting-started.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-getting-started.wiki
new file mode 100644
index 00000000..3c79e814
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-getting-started.wiki
@@ -0,0 +1,74 @@
+[[Property:title|Getting Started with SCOOP]]
+[[Property:link_title|Getting Started]]
+[[Property:weight|-1]]
+[[Property:uuid|87f78898-2bbb-b134-0128-e55401a61a05]]
+=Introduction=
+
+SCOOP adds only a single keyword to the Eiffel programming language: separate. In any case in which SCOOP is not enabled, the separate keyword is ignored, and the SCOOP-specific validity rules are not applied.
+
+In order to enable SCOOP processing in your project, you use the project settings. There are two mandatory settings. One of them is the option ''Concurrency'', and the value you need is ''SCOOP'', as shown in the section of the Project Settings dialog below.
+
+[[Image:SCOOP project setting]]
+
+The second setting is the precompiled library. This should either be '''base-scoop-safe''', or nothing at all. A precompiled library which is not built with SCOOP support will not work.
+
+{{caution | When you use a precompiled library, the ''Concurrency'' setting for that library trumps whatever ''Concurrency'' value you have set for the project. So, if you use the "base-safe.ecf" precompiled library, your project will not be SCOOP-enabled regardless of the setting of ''Concurrency'' in the Target. Likewise, using the "base-scoop-safe.ecf" precompiled library always produces a SCOOP-enabled project, even if the Target ''Concurrency'' setting is ''None''.}}
+
+
+=Creating a new SCOOP project=
+
+== Step 1: Create a new project ==
+
+Create a new project with the EiffelStudio new project wizard by selecting ''Basic application'' from the choices under ''Create project'' when EiffelStudio opens.
+The created project will not have SCOOP enabled however (this is true in all EiffelStudio releases so far, but may change in the future).
+Do not compile the newly created project or precompile a library if asked - it will just be a waste of time.
+
+== Step 2: Convert the project ==
+
+To enable SCOOP, you'll have to do some work on the project settings. Follow the steps in the next section.
+
+= Convert an existing project to SCOOP =
+
+== Step 1: Adjust Concurrency setting ==
+
+Open the project settings dialogue (Project -> Project settings...).
+Select your favorite target (usually there's only one) and extend the section ''Advanced''.
+
+In there you'll find the setting ''Concurrency'', which should have a value ''None'' for sequential projects. Change it to ''SCOOP''.
+
+In addition to the ''Concurrency'' project setting, it is recommended that for new projects you use [[Creating a new void-safe project#Project settings for void-safe projects|the settings that guarantee void-safety]].
+
+== Step 2: Remove the precompiled library ==
+
+Expand the node ''Groups'' in the project settings on the left.
+If your project uses a precompiled library, you should be able to see and expand the node ''Precompile'' as well.
+Right click on the item (usually something like "base-safe_precompile") in the category ''Precompile'', then select ''Remove''.
+
+== Step 3: (Optional) Add precompiled base-scoop-safe to the project ==
+
+Select the node ''Groups'' on the left, and then press Ctrl + P on the keyboard (or select ''Add Precompile'' from the toolbox).
+Note that this only works when there's no existing precompiled library and when the node ''Groups'' is highlighted.
+
+In the dialog that opens, select "precomp_base-scoop-safe", then close the dialog by clicking ''OK''.
+
+== Step 4: Clean compile ==
+
+Changing the ''Concurrency'' setting and precompiled libraries each would cause you to have to do a [[Clean compile|clean compile]] of your system in order to become effective. To do so, close EiffelStudio and reopen it.
+In the dialog that appears, select the previously modified project and then select the ''Compile'' action and add a tick to ''Clean''.
+At this point, your project should be void-safe and SCOOP enabled.
+
+== Step 5: Double-check ==
+
+Before doing anything after the clean compile, check the warnings section. If EiffelStudio is complaining that some settings could not be applied, something might be wrong with the precompiled library.
+
+To make sure that SCOOP is really enabled, you can insert the following code snippet somewhere in your code:
+
+check_scoop (a_string: separate STRING)
+ local
+ str: STRING
+ do
+ str := a_string
+ end
+
+This should trigger a compiler error. If it doesn't, then SCOOP is not correctly set up in your project.
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-implementation.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-implementation.wiki
new file mode 100644
index 00000000..7b2cd4a6
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-implementation.wiki
@@ -0,0 +1,109 @@
+[[Property:title|SCOOP implementation]]
+[[Property:weight|9]]
+[[Property:uuid|eeb07907-e036-f3d6-5297-a7c44cfd1900]]
+
+
+The implementation of SCOOP is the result of many years of design and refinement of the model. This page describes specific properties of its current state, in particular ways in which it differs from some of the earlier publications about the model.
+
+
+=Known limitations=
+
+
+==Supported concurrency mechanisms==
+
+At the core of the SCOOP model lies the notion of [[Concurrent programming with SCOOP#Processors|processor]]: a mechanism that can execute instructions sequentially. As a general model covering many forms of concurrency, SCOOP allows many possible implementations of this concept. In the EiffelStudio implementation, processors are implemented as threads of the operating system.
+
+
+==Maximum number of SCOOP processors==
+
+The maximum number of SCOOP processors per system is currently 1024.
+
+
+
+==Agents targeted to objects of separate types==
+
+Agents targeted on separate objects are currently not supported.
+
+
+=Workarounds=
+
+The first implementation of SCOOP, some things that we do commonly in sequential Eiffel become less fluid in the presence of SCOOP. Although not strictly limitations in the implementation of SCOOP principles, in order to make SCOOP programming easier, these are areas that should be improved in future releases. In the meantime, there are workarounds for some of these situations.
+
+
+==Printing a separate STRING ==
+
+Suppose you have declared a class attribute of type separate STRING:
+
+
+ my_separate_string: separate STRING = "Hello Eiffel World!"
+
+
+and you want to output that string using io.put_string. The solution you might use from sequential Eiffel would be:
+
+
+ io.put_string (my_separate_string)
+
+
+But the statement above results in a compile error because the argument type (separate STRING) is not compatible with the type (STRING) that put_string is expecting.
+
+In order to make printing of the content of separate instances of STRING, a creation procedure, make_from_separate, is available in the string classes which allows initialization of a non-separate instance of STRING from a separate STRING.
+
+So, to print my_separate_string, you could create a non-separate instance of STRING, then print the non-separate instance, as shown below.
+
+
+ local
+ l_temp: STRING
+ ...
+ create l_temp.make_from_separate (my_separate_string)
+ io.put_string (l_temp)
+
+
+Or use a creation expression and avoid declaring the local variable:
+
+
+ io.put_string (create {STRING}.make_from_separate (my_separate_string))
+
+
+== Calling a separate agent ==
+
+Calling a separate agent is a bit tricky, especially if it's a PROCEDURE which should be executed asynchronously.
+If the agent does not take any arguments, you must pass Void, otherwise the compiler will generate an empty TUPLE which
+is on the same processor as the caller and thus triggers lock passing (see [[Asynchronous Calls]]):
+
+
+do_call (proc: separate PROCEDURE [TUPLE])
+ do
+ proc.call (Void)
+ end
+
+
+If the agent does take arguments, things get a bit more tricky. If the call must be asynchronous, you have to do a workaround with the feature {ROUTINE}.empty_operands like this:
+
+
+do_call (a_procedure: separate PROCEDURE [TUPLE[separate STRING]]; a_string: separate STRING)
+ local
+ l_tuple: separate TUPLE [separate STRING]
+ do
+ l_tuple := a_procedure.empty_operands
+ set_tuple_string (l_tuple, a_string)
+ a_procedure.call (l_tuple)
+ end
+
+set_tuple_string (a_tuple: separate TUPLE [str: separate STRING]; a_string: separate STRING)
+ do
+ a_tuple.str := a_string
+ end
+
+
+
+=Implementation dependent behavior=
+
+
+==The Wait Rule==
+
+{{note | This only applies to EiffelStudio releases prior to 15.01}}
+
+The [[Concurrent programming with SCOOP#Access to shared resources|Wait Rule]] says: ''A routine call with separate arguments will execute when all corresponding processors are available and hold them exclusively for the duration of the routine.''
+
+In the EiffelStudio implementation prior to 15.01, a routine will not necessarily wait for all processors associated with its separate arguments to be available before it ''begins'' execution. The waiting on processors occurs in a "lazy" manner. Execution will only wait on the availability of one of the processors when it actually needs to use the argument associated with that processor. This means that if there are several instructions ahead of the first instruction that references a separate argument, then those several instructions will be executed immediately. Only at the point at which the separate argument's processor is needed will the routine pause and wait for the availability of the processor.
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-regions-processors.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-regions-processors.wiki
new file mode 100644
index 00000000..a2240ecb
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-regions-processors.wiki
@@ -0,0 +1,115 @@
+[[Property:title|Regions and Processors]]
+[[Property:weight|2]]
+[[Property:uuid|974a41dd-0e36-4d75-edd1-ead6ea4b372d]]
+== Regions ==
+
+One of the key ideas in SCOOP is to prohibit simultaneous access to shared memory.
+In order to reach this goal, the SCOOP model partitions the heap memory into ''regions''.
+
+{{definition|Region|A set of objects in the heap. The set of all regions in a program is a partition of the heap.}}
+
+Every object in an Eiffel program belongs to exactly one ''region''.
+A ''region'' is by itself sequential, meaning that there can only be one routine executed in one object.
+There can be multiple regions in a SCOOP program however.
+
+[[Image:SCOOP regions]]
+
+{{info|SCOOP is classified as a message passing concurrency model, because there is no shared memory.}}
+{{note|A sequential program is a special case for a SCOOP program that has only one region.}}
+
+A direct access from one region into another is not allowed.
+If one wishes to perform a command or a query in an object of a different region, a message has to be sent.
+You'll see how this can be done in chapter [[Separate Calls]].
+
+The simple trick of splitting the heap into several regions, where each region by itself is sequential,
+prevents one of the trickiest problems in concurrency: Data Races.
+In SCOOP you are guaranteed that a data race, meaning a read and write access to the same memory with nondeterministic ordering, can never happen.
+
+== Processors ==
+
+In the SCOOP model, a ''processor'' is used as the engine for execution.
+
+{{definition|Processor| An autonomous thread of control capable of sequential execution of instructions.}}
+
+A ''processor'' is always attached to exactly one region, and is responsible to perform operations on all its objects.
+The term ''handler of an object'' is used to denote the processor attached to the region on which the object is placed.
+
+As already mentioned earlier, a ''processor'' cannot access or perform operations on an object in a different ''region''
+and has to send a message to the other handler instead.
+
+{{info|''Processor'' is an abstract notion and does not mean the physical silicon chip which is present in every computer.
+In SCOOP we think of it as a thread of control capable of applying features to objects.
+In theory processors are not restricted to any particular type of hardware or software, for example they could correspond to threads, processes, hardware processors, or machines in a network.
+Currently however a SCOOP processor is implemented as a thread.}}
+
+== Separate Types==
+
+To support the concept of regions in a program text, SCOOP extends the type system by introducing a single new keyword: separate.
+
+The separate keyword is used to annotate a reference and means that the object attached to it may be in a different region.
+
+{{definition|Separate type|A type which has been declared including the keyword separate.}}
+
+If an entity uses the keyword separate in its declaration, such as:
+
+
+ my_x: separate X
+
+
+it indicates that the handler of my_x may be different than the handler of Current.
+This in turn means that it is forbidden to access and modify my_x directly.
+To perform any operation on my_x, a message should be sent to the other handler.
+
+Note that the SCOOP type system allows to attach an object to a separate reference, even if it is actually in the same region as Current.
+But it is not possible the other way around: An object in a different region must always be of a separate type.
+This is reflected in the type checker, which treats a regular type A as a subtype of the separate type separate A.
+
+In the image above, the three references that cross a processor boundary must be declared separate.
+The single reference in Region 2, which stays in the same region, can be of a non-separate type.
+
+== Creating regions and processors ==
+
+In order to turn a sequential program into a concurrent program, one has to create new regions and put objects into them.
+The means to achieve this is the creation instruction on an entity whose type is separate.
+
+
+ my_x: separate X
+ -- ...
+ create my_x.make
+
+
+The instruction create my_x.make does a lot of things at the same time:
+* It creates a new region.
+* It creates a new processor for the new region.
+* It creates a new object of type X which is placed into the newly created region.
+
+With this new knowledge we can create a small program that generates the object and region graph shown above:
+
+
+class APPLICATION create make feature
+
+ person: separate PERSON
+
+ thing: separate ANY
+
+ make
+ do
+ create person.make
+ create thing
+ end
+end
+
+class PERSON create make feature
+
+ name: STRING
+
+ thing: separate ANY
+
+ make
+ do
+ create name.make_from_string ("John Doe")
+ create thing
+ end
+end
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-separate-calls.wiki b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-separate-calls.wiki
new file mode 100644
index 00000000..a3e9b049
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/concurrent-eiffel-scoop/scoop-separate-calls.wiki
@@ -0,0 +1,126 @@
+[[Property:title|Separate Calls]]
+[[Property:weight|3]]
+[[Property:uuid|c030d521-1420-1570-b63e-9035332a3e26]]
+==Separate Calls==
+
+In the [[Regions and Processors | previous chapter]] we've learned that a concurrent SCOOP program consists of several ''regions'' that communicate via message passing.
+You may wonder how it is possible to pass a message to another processor, and the answer is simple:
+With the good old feature call.
+
+{{definition|Separate call|A feature call whose target is of a separate type.}}
+
+The ''separate call'' is the SCOOP way to pass messages from one region to another.
+A call such as this
+
+
+ do_call (my_x: separate X)
+ do
+ my_x.f (42)
+ end
+
+
+roughly corresponds to a message to the handler of my_x with the content:
+"Execute feature f on target my_x with argument 42."
+
+Note that there can be a difference between the time a message is sent and the time the feature is executed.
+In SCOOP we therefore distinguish between a ''feature call'' and a ''feature application''.
+
+{{definition|Feature call|Register a feature to be executed.}}
+{{definition|Feature application|Execute a feature.}}
+
+
+==Access to shared resources==
+
+The main issue with concurrent systems is the proper control of access to resources that can be shared among simultaneously executing processors.
+
+Traditional solutions to the problem involve the use of “critical sections” of code.
+These are sections of code in which the shared resource is accessed.
+Only one thread is allowed to be executing the critical section at a time.
+So if one thread wants to execute the critical section and another is already doing so, then the first must wait.
+Thread synchronization schemes ensure this “mutual exclusion” of access to the critical section.
+
+Rather than using critical sections, SCOOP relies on the mechanism of argument passing to assure exclusive access.
+As a result, there is a restriction placed on separate calls.
+
+{{Rule|name=Separate argument|text=A separate call a_x.f (a) is valid if a_x is an argument of the enclosing routine.}}
+
+So, according to this rule, for a separate call to be valid, the target of the call must be a formal argument of the routine in which the call occurs.
+The code below contains both an invalid separate call and a valid one.
+
+
+
+ my_separate_attribute: separate SOME_TYPE
+
+ ...
+ calling_routine
+ -- One routine
+ do
+ my_separate_attribute.some_feature -- Invalid call: Feature call on separate attribute
+ enclosing_routine (my_separate_attribute) -- Separate attribute passed as argument
+ end
+
+ enclosing_routine (a_arg: separate SOME_TYPE)
+ -- Another routine
+ do
+ a_arg.some_feature -- Valid call: Feature call on separate argument
+ end
+
+
+
+In the code above, my_separate_attribute is a class attribute declared as a separate type. In the first line in calling_routine a direct feature call is made to apply some_feature to my_separate_attribute. This is an invalid separate call. The second line calls feature enclosing_routine and passes my_separate_attribute as an argument. enclosing_routine takes an argument of type separate SOME_TYPE. Within enclosing_routine it is valid to call some_feature on a_arg.
+
+{{info|Congratulations! You've just gained enough knowledge to write a small SCOOP program.
+You may want to have a look at the [[Dining Philosophers]] example, which does not use any of the advanced concepts.}}
+
+{{SeeAlso|The launch_producer feature of the [[Producer-consumer|producer-consumer]] example, a feature which exists for the purpose of compliance with the separate argument rule.}}
+
+
+==Synchronous and asynchronous feature calls==
+
+When we think of the execution of sequential Eiffel, we tend to equate feature call and feature application. That is, it is expected that for a sequence of two feature calls:
+
+
+
+ x.f
+ y.g
+
+
+
+that the feature application of x.f will complete before y.g begins.
+
+In concurrent Eiffel with SCOOP things are different. This is because a particular feature call, x.f, may occur on one processor, and the consequent feature application (of feature f to x) may occur on a different processor.
+
+
+{{definition|Synchronous feature call|A feature call in which the execution of the calling client does not proceed until the feature application has completed. }}
+
+
+{{definition|Asynchronous feature call|A feature call which causes the “logging” of a request by a client for the associated feature application to be executed by the supplier’s processor. }}
+
+
+After an asynchronous feature call, the execution of the client proceeds immediately, possibly in parallel with the application of the feature on some other processor.
+
+
+===What makes a call synchronous or asynchronous?===
+
+First, every feature call is either a synchronous feature call or an asynchronous feature call. For a particular call, the following rules determine which it is:
+
+A feature call is always '''synchronous''' in the following cases:
+
+:S1 It is a non-separate call.
+:S2 It is a separate call to a query.
+
+A feature call may be '''asynchronous''' in the following case:
+:A1 It is a separate call to a command.
+
+Let’s look a little closer at those cases determining synchronous calls.
+
+Case S1 is the case of typical sequential Eiffel, where all calls are non-separate, and therefore synchronous. Of course, even in concurrent Eiffel with SCOOP, plenty of non-separate calls will occur, and these will be synchronous.
+
+Case S2 says that if a separate call is a query it must be synchronous. This is because even though the feature application will probably occur on a different processor, the instructions following the query will likely depend up on the result of the query, so they must wait until the feature application completes. This situation is known as ''wait by necessity''.
+
+The case A1 is the only case where asynchrony is involved. But be careful with the wording - it says the call '''may be asynchronous''', because there are some exceptions. The exact rules are a bit complex and are described in [[Asynchronous Calls]]. As a general rule of thumb, a separate call is executed asynchronously when the client does not have exclusive access over an object which is needed by the target region.
+
+Asynchronous execution means that when a client processes the call to the command, it “logs” the need for its associated feature application. But then, rather than waiting for the feature application to complete, the client continues execution of instructions beyond the asynchronous call.
+
+It is in this case that concurrent computation is achieved. The processor of the client object is free to continue processing while the processor handling the target of the asynchronous feature call applies that feature.
+
diff --git a/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-class-reference.wiki b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-class-reference.wiki
new file mode 100644
index 00000000..a2228d25
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-class-reference.wiki
@@ -0,0 +1,7 @@
+[[Property:title|EiffelThread Class Reference]]
+[[Property:weight|0]]
+[[Property:uuid|e1d3e50a-e67a-a375-7165-8a7856b7b969]]
+==View the [[ref:libraries/thread/reference/index|EiffelThread Class Reference]]==
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/compilation-multithreaded-systems.wiki b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/compilation-multithreaded-systems.wiki
new file mode 100644
index 00000000..1b38b0d2
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/compilation-multithreaded-systems.wiki
@@ -0,0 +1,49 @@
+[[Property:title|Compilation of multithreaded systems]]
+[[Property:weight|3]]
+[[Property:uuid|24e474b5-3cb7-16ff-365f-73be8e73bd56]]
+{{UpdateNeeded}}
+
+
+{{ReviewRequested}}
+
+
+==Settings==
+* Set the Concurrency option to EiffelThread in the project settings under Advanced.
+* Do not use a non-multi-threaded precompiled library. The corresponding multi-threaded libraries of base, WEL and Vision2 should be located in $ISE_EIFFEL/precomp/spec/$PLATFORM/ with the mt prefix.
+* You may want to include the thread library (located at "$ISE_EIFFEL/library/thread") in your project. This setting can be done in [[Group Options| the groups section of the project settings window]] .
+* When using external C libraries, be sure that they are MT-safe on the platforms where the Eiffel Threads are available. For example [[WEL]] and [[EiffelNet]] multi-threaded libraries can be recognized by the `mt` prefix.
+
+==Compilation==
+
+Just launch the compilation: the Eiffel compiler will generate and link the multi-threaded executable. If the project was already compiled, [[Clean compile|clean the project and recompile it from scratch]].
+
+==External C files==
+
+The C files that you link with a multi-threaded Eiffel application must be compiled in multi-threaded mode. In addition, you should follow some basic guidelines, which you can find in any documentation on threads. Here are the main requirements:
+* Check that what you are importing is safe: you cannot arbitrarily enter non-threaded code in a multi-threaded program. Check your include files and the libraries that you use for linking to decide if they can be used in multi-threaded mode.
+* If you are using CECIL in multi-threaded mode, you must compile your C files with the same defined symbols as those used to compile the generated C-code in multi-threaded mode.
+* Threaded code can safely refer to unsafe code ONLY from the initial thread.
+
+{{note|If you use the libraries EiffelNet and MEL in multi-threaded mode, you should use libmtnet. a and libmtmel. a. When using MEL, you have to be aware that Motif 1. 2 is not threaded-safe (i.e not reentrant). Motif 2. x is threaded-safe.}}
+
+==Thread Safe Eiffel libraries==
+
+Most libraries are not thread safe. This means that even though you can use them in a multi-threaded environment, you will need to add the necessary protection to ensure that objects are accessed only by one thread at a time.
+
+Most of the issues are related to the use of EiffelBase containers which were designed at a time when threads were not present. In the future we will certainly provide a version of EiffelBase which will be designed to be thread safe, in the meantime, you have to use basic protection mechanisms such as mutexes to guarantee the safe execution of your programs.
+
+Here is a summary of what you need to include in your project settings when using our libraries:
+
+- EiffelBase: not thread safe, no externals required
+
+- WEL: partly thread safe regarding creation of graphical objects that belong to two different threads, but since it relies on EiffelBase, be aware of what has been said. Other libraries have the same dependency on EiffelBase and this warning will not be repeated.
+
+- MEL: you have to be aware that Motif 1. 2 is not thread safe and that Motif 2.x is. Therefore you can use MEL in a multi-threaded program only if you have Motif 2.x. In this case, you need to include libmtmel.a instead of libmel.a
+
+- EiffelNet: thread safe with above limitation on EiffelBase.
+
+- COM: not thread safe.
+
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/index.wiki b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/index.wiki
new file mode 100644
index 00000000..4fccb2fb
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/index.wiki
@@ -0,0 +1,17 @@
+[[Property:title|EiffelThread Tutorial]]
+[[Property:weight|-1]]
+[[Property:uuid|c1965bc3-23cf-25d6-02c1-717b7035d41c]]
+Multithreaded applications provide a flexible, exciting way of utilizing the power of modern computer systems. EiffelThread supports a powerful multithreaded model, fast and easy to use.
+
+The EiffelThread library is mapped to the native thread library of your platform such as Windows, POSIX, Solaris and Unix International Threads.
+
+This document will explain how to use the EiffelThread library. To fully take advantage of this documentation you should know some basics about multithreaded systems
+
+To enable multithreading in the EiffelStudio environment, you will need to do some changes in your project settings.
+
+There are special considerations for using "once" features in an Eiffel multithreaded environment.
+
+If you encounter problems, take a look at the FAQ list.
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/multithread-faq.wiki b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/multithread-faq.wiki
new file mode 100644
index 00000000..9c5f58ec
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/multithread-faq.wiki
@@ -0,0 +1,24 @@
+[[Property:title|Multithread FAQ]]
+[[Property:weight|6]]
+[[Property:uuid|a0e1ddf6-cc19-b6f8-0e05-075908ddd347]]
+===I've launched several threads and they do not seem to be executed:===
+
+The thread that launched the several threads may be dead before its children.
+
+===Two threads can lock the same mutex, however none of them unlocks it:===
+
+Same problem as above. Maybe the first thread that locked the shared mutex died before the second tried to lock it: thus, the first one automatically unlocked it when it died. You should put a join_all or an infinite loop in the parent thread.
+
+===I've added the option multithreaded in the project settings and it crashes:===
+
+If you have already compiled your system in non-MT mode, you cannot change the mode of compilation and simply relaunch your compilation (the generated C-code would be incompatible). Delete all your object files in your W_code or F_code directory and freeze or finalize the system again.
+
+===My once function changed during my MT-Eiffel-program:===
+
+The once functions are once per thread in Multithreaded mode. Hence, each once function is thread-specific and is initialized the first time it is called in a thread.
+
+You can create a once per process by following [[Once features in multithreaded mode|these instructions]] .
+
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/once-features-multithreaded-mode.wiki b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/once-features-multithreaded-mode.wiki
new file mode 100644
index 00000000..55f695c8
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/once-features-multithreaded-mode.wiki
@@ -0,0 +1,87 @@
+[[Property:title|Once features in multithreaded mode]]
+[[Property:weight|4]]
+[[Property:uuid|5578da29-7603-b501-1a7d-305d20fd6485]]
+==Manipulating Once features in multithreaded mode==
+
+Eiffel introduced the powerful mechanism of once routines. A once routine has a body that will be executed only once, at the first call. Subsequent calls will have no further effect and, in the case of a function, will return the same result as the first. This provides a simple way of sharing objects in an object-oriented context.
+
+For multithreaded applications, the appropriate semantics is that once routines must be called once per thread (rather than once per process). This is the semantics supported by EiffelThread.
+
+Then the once feature is not initialized once per process but once per thread. Your once feature will be called again in any new thread execution.
+
+==Once per Process/Thread==
+
+By default, once features are once per thread. This means that when a once feature is called in a thread, the Eiffel run-time will check whether it has been already computed in this thread. If not, the once feature will be initialized and computed. This corresponds to the most commonly desired behavior for once features in multithreaded mode: most of the time, a once called in a thread is not likely to share its result with other threads.
+
+This is only the default, however: you may at times need to use "once per process" versus "once per thread". Objects created "once per process" in multithreading mode can be shared among threads. You can use a [[ET: Once routines and shared objects#Adjusting once semantics with "once keys"|'''once key''']] to indicate the mode you wish to use.
+
+==Specifying once per thread or once per process ==
+
+As mentioned above, in multithreaded mode, the default once syntax will ensure "once per thread", as in this example:
+
+
+ object_per_thread: OBJECT
+ -- Once per thread.
+ once
+ create Result.make
+ end
+
+
+You could obtain the same effect by explicitly coding the "THREAD" once key:
+
+
+ object_per_thread: OBJECT
+ -- Once per thread.
+ once ("THREAD")
+ create Result.make
+ end
+
+
+To ensure that a once function is executed only once per process, you would use the "PROCESS" once key:
+
+
+ object_per_process: OBJECT
+ -- New 'object' (once per process)
+ -- that could be shared between threads
+ -- without reinitializing it.
+ once ("PROCESS")
+ create Result.make
+ end
+
+
+
+The same concepts apply to once procedures.
+
+
+{{note|Remember the effect of exceptions on the execution of once routines. If an exception occurs during the execution of a once routine, then '''that same exception will be raised again on each subsequent call''' to the once routine.}}
+
+===Obsolete syntax===
+
+The syntax shown above is the current standard syntax. However in Eiffel code written for previous versions, you may run across once keys for multithreaded systems which are expressed in a different syntax. Specifically, the obsolete syntax used a feature's note clause to specify a once key, as in the following example.
+
+
+ object_per_process: OBJECT
+ -- Obsolete syntax
+ -- New 'object' (once per process)
+ -- that could be shared between threads
+ -- without reinitializing it.
+ note
+ once_status: global
+ once
+ create Result.make
+ end
+
+
+
+==Using once per object in a multithreaded system==
+
+It is possible to use a once key to specify a once function that is executed [[ET: Once routines and shared objects#Adjusting once semantics with "once keys"|once per object]]. However, in a multithreaded system, it is important to understand that no automatic synchronization of access occurs in this case. So the following caution is given.
+
+
+{{caution|You should understand that in a multithreaded system, you must synchronize access to the result of a function executed once per object in the same way that you would synchronize access to class attributes. }}
+
+
+
+{{SeeAlso|The Eiffel Tutorial section on [[ET: Once routines and shared objects]] .}}
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/thread-library-overview.wiki b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/thread-library-overview.wiki
new file mode 100644
index 00000000..6b5e0ae7
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/eiffelthread/eiffelthread-tutorial/thread-library-overview.wiki
@@ -0,0 +1,199 @@
+[[Property:title|Thread library overview]]
+[[Property:weight|1]]
+[[Property:uuid|2bdeeb91-1917-f443-ebfc-4f877107edd7]]
+This is only a quick overview of the EiffelThread Library. The class reference for this library should give its complete interface.
+
+==Creating and launching threads: the class THREAD (deferred)==
+
+The class of the thread object you want to create should inherit the
+class
+ MY_THREAD
+
+inherit
+ THREAD
+ ...
+
+feature
+
+ execute
+ -- define the deferred feature from THREAD.
+ do
+ ...
+ end
+
+ ...
+
+end -- class MY_THREAD
+
+
+
+Creating a thread is like creating an Eiffel object:
+
+
+
+ my_thread: MY_THREAD
+ -- MY_THREAD inherits from THREAD and defines
+ -- the deferred procedure `execute'
+
+ ...
+
+ create my_thread
+
+
+
+{{note|You have created a thread object but have not started the thread itself yet.
+ my_thread.launch
+
+
+On the Eiffel side, the procedure
+ my_mutex: MUTEX
+
+* Creation of mutex:
+
+ create my_mutex.make
+
+* Locking the mutex:
+
+ my_mutex.lock
+
+* Unlocking the mutex:
+
+ my_mutex.unlock
+
+*
+ my_mutex.try_lock
+
+* Is my mutex initialized?
+
+ my_mutex.is_set
+
+
+{{note|on Windows: The
+ my_sem: SEMAPHORE
+
+Creation of semaphore: initialize semaphore with nb_tokens, it requires nb_tokens > = 0
+
+ create my_sem.make (nb_tokens)
+
+* Wait for a token:
+
+ my_sem.wait
+
+* Give back a token:
+
+ my_sem.post
+
+* True , otherwise return False .
+
+ my_sem.try_wait
+
+
+{{caution|Be sure that a semaphore does not wait for a token when it is disposed }}
+
+==The class CONDITION_VARIABLE==
+
+This class allows to use condition variables in Eiffel. An instance of class
+ my_cond: CONDITION_VARIABLE
+
+* Creation:
+
+ create my_cond.make
+
+* Wait for a signal (send by
+ my_mutex: MUTEX
+
+ ...
+
+ create my_mutex.make
+
+
+
+my_mutex must be locked by the calling thread so as my_mutex and waits for the condition variable my_mutex to receive a signal. As soon as it received a signal, ''my_cond '' locks ''my_mutex ''
+
+
+ my_mutex.lock
+ -- You must lock `my_mutex' before calling wait.
+
+ my_cond.wait (my_mutex)
+ -- Here the critical code to execute when `my_cond' received a signal.
+
+ my_mutex.unlock
+ -- Unlock the mutex at the end of the critical section.
+
+
+
+* Send a signal one thread blocked on the condition variable `my_cond'.
+
+ my_cond.signal
+
+* Send a signal to all the threads blocked on the condition variable `my_cond'.
+
+ my_cond.broadcast
+
+
+{{caution|Be sure that a condition variable is unblocked when it is disposed. }}
+
+
+==Miscellaneous classes==
+
+class
+ thr: MY_THREAD
+ ...
+
+ thr.launch
+ ...
+ thr.join
+
+
+
diff --git a/documentation/18.11/solutions/concurrent-computing/eiffelthread/index.wiki b/documentation/18.11/solutions/concurrent-computing/eiffelthread/index.wiki
new file mode 100644
index 00000000..5a015796
--- /dev/null
+++ b/documentation/18.11/solutions/concurrent-computing/eiffelthread/index.wiki
@@ -0,0 +1,11 @@
+[[Property:link_title|EiffelThreads]]
+[[Property:title|EiffelThreads]]
+[[Property:weight|0]]
+[[Property:uuid|AAF0CEF9-7268-492F-9119-872164995898]]
+==EiffelThreads Library==
+
+Type: Library
+CREATE TABLE customer (
+ id INTEGER PRIMARY KEY AUTO_INCREMENT,
+ first_name VARCHAR (100),
+ last_name VARCHAR (100),
+ age INTEGER
+)
+
+
+In your Eiffel code you have a class which matches the table:
+
+
+class
+ CUSTOMER
+
+inherit
+ ANY redefine out end
+
+create
+ make
+
+feature -- Access
+
+ id: INTEGER
+ -- The customer ID.
+
+ first_name: STRING
+ -- The customer's first name.
+
+ last_name: STRING
+ -- The customer's last name.
+
+ age: INTEGER
+ -- The age of the customer.
+
+feature -- Element change
+
+ set_age (an_age: like age)
+ -- Set `age' to `an_age'
+ do
+ age := an_age
+ end
+
+feature -- Output
+
+ out: STRING
+ -- String output of `Current'.
+ do
+ Result := id.out + ": " + first_name + " " + last_name + " " + age.out + "%N"
+ end
+
+feature {NONE} -- Initialization
+
+ make (an_id: like id; first: like first_name; last: like last_name; an_age: like age)
+ -- Initialization for `Current'.
+ do
+ id := an_id
+ first_name := first
+ last_name := last
+ age := an_age
+ end
+
+end
+
+
+== Connection setup ==
+
+Because we're using an existing MySQL database, we need to choose the
+class
+ TUTORIAL
+
+create
+ make
+
+feature -- Access
+
+ repository: PS_REPOSITORY
+
+feature {NONE} -- Initialization
+
+ make
+ -- Set up the repository.
+ local
+ factory: PS_MYSQL_RELATIONAL_REPOSITORY_FACTORY
+ do
+ create factory.make
+
+ -- Feel free to change the login credentials.
+ factory.set_database ("my_database")
+ factory.set_user ("root")
+ factory.set_password ("1234")
+
+ repository := factory.new_repository
+ end
+
+end
+
+
+That's it. You're now ready to read and write table records using the repository.
+
+== Querying objects ==
+
+With the newly created repository, we can now query for
+
+ print_customers
+ -- Print all customers.
+ local
+ query: PS_QUERY [CUSTOMER]
+ do
+ create query.make
+ repository.execute_query (query)
+
+ across
+ query as cursor
+ loop
+ print (cursor.item)
+ end
+
+ if query.has_error then
+ print ("An error occurred!%N")
+ end
+
+ query.close
+ end
+
+
+== Writing objects ==
+
+You can also use ABEL to write or update customers, although the semantics are a bit different compared to other backends.
+ABEL by default treats every object as a value tuple without identity (like an expanded type).
+The reason is that the primary key of an object is usually stored directly inside the object,
+and a user may change it and thus mess with ABEL's internal data structures.
+
+The implication of this is that a user is only allowed to call
+ insert_customer
+ -- Insert a new customer.
+ local
+ albo: CUSTOMER
+ transaction: PS_TRANSACTION
+ do
+ -- Assume 42 is an valid, unused primary key.
+ create albo.make (42, "Albo", "Bitossi", 1)
+
+ transaction := repository.new_transaction
+
+ if not transaction.has_error then
+ -- This results in an insert, because
+ -- according to our previous assumption
+ -- there is no record with primary key 42
+ transaction.insert (albo)
+ end
+
+ -- Cleanup and error handling.
+ if not transaction.has_error then
+ transaction.commit
+ end
+
+ if transaction.has_error then
+ print ("An error occurred.%N")
+ end
+ end
+
+ update_customer
+ -- Update an existing customer.
+ local
+ factory: PS_CRITERION_FACTORY
+ query: PS_QUERY [CUSTOMER]
+ transaction: PS_TRANSACTION
+ do
+ create query.make
+ query.set_criterion (factory ("id", "=", 42))
+
+ transaction := repository.new_transaction
+
+ if not transaction.has_error then
+ transaction.execute_query (query)
+ end
+
+ across
+ query as cursor
+ loop
+ cursor.item.set_age (2)
+ -- The result is an update, because an object
+ -- with primary key 42 is already present.
+ transaction.insert (cursor.item)
+ end
+
+ -- Cleanup and error handling
+ query.close
+ if not transaction.has_error then
+ transaction.commit
+ end
+ if transaction.has_error then
+ print ("An error occurred!%N")
+ end
+ end
+
+
+== Managed types==
+
+Maybe you realized the weak spot in the previous section:
+We assumed that a primary key does not exist yet.
+This is a very dangerous assumption, especially in a multi-user setting.
+The way to resolve this issue is to usually to declare the primary key column as auto-incremented and let the database handle primary key generation.
+
+It is possible to use this facility in ABEL by declaring a type as "managed" and specifying the primary key column.
+This only works for tables which actually have an auto-incremented integer primary key column.
+
+There are some changes when declaring a type as managed:
+
+* ABEL will keep track of object identity. Thus it is possible (and recommended) to use {PS_TRANSACTION}.update.
+* As ABEL now takes care of primary keys, it is not allowed to change the primary key of an object. If it happens anyway, an error will be returned.
+* To insert a new object, you can just set the primary key attribute to zero. The database will then generate a new key.
+* After a successful insert, ABEL will update the Eiffel object with the new primary key.
+
+Our customer database table fulfills all requirements for ABEL to manage its primary key handling, thus we can rewrite the above examples:
+
+
+class
+ TUTORIAL
+
+create
+ make
+
+feature -- Access
+
+ repository: PS_REPOSITORY
+
+ generated_id: INTEGER
+ -- The ID generated by the database.
+
+feature {NONE} -- Initialization
+
+ make
+ -- Set up the repository.
+ local
+ factory: PS_MYSQL_RELATIONAL_REPOSITORY_FACTORY
+ do
+ create factory.make
+ factory.set_database ("my_database")
+ factory.set_user ("root")
+ factory.set_password ("1234")
+
+ -- Tell ABEL to manage the `CUSTOMER' type.
+ factory.manage ({CUSTOMER}, "id")
+
+ repository := factory.new_repository
+
+ insert_customer
+ update_customer
+ end
+
+feature -- Tutorial functions
+
+ insert_customer
+ -- Insert a new customer.
+ local
+ albo: CUSTOMER
+ transaction: PS_TRANSACTION
+ do
+ -- Note that the ID is now set to 0.
+ create albo.make (0, "Albo", "Bitossi", 1)
+
+ transaction := repository.new_transaction
+
+ if not transaction.has_error then
+ -- The next statement will be an insert in any case.
+ transaction.insert (albo)
+ end
+
+ -- The generated ID is now stored in `albo'
+ generated_id := albo.id
+
+ -- Cleanup and error handling.
+ if not transaction.has_error then
+ transaction.commit
+ end
+
+ if transaction.has_error then
+ print ("An error occurred.%N")
+ end
+ end
+
+ update_customer
+ -- Update an existing customer.
+ local
+ factory: PS_CRITERION_FACTORY
+ query: PS_QUERY [CUSTOMER]
+ transaction: PS_TRANSACTION
+ do
+ create factory
+ create query.make
+ query.set_criterion (factory ("id", "=", generated_id))
+
+ transaction := repository.new_transaction
+
+ if not transaction.has_error then
+ transaction.execute_query (query)
+ end
+
+ across
+ query as cursor
+ loop
+ cursor.item.set_age (3)
+ -- It is possible to call update.
+ transaction.update (cursor.item)
+ end
+
+ -- Cleanup and error handling
+ query.close
+ if not transaction.has_error then
+ transaction.commit
+ end
+ if transaction.has_error then
+ print ("An error occurred!%N")
+ end
+ end
+end
+
+
+
diff --git a/documentation/18.11/solutions/database-access/abel/tutorial/advanced-queries.wiki b/documentation/18.11/solutions/database-access/abel/tutorial/advanced-queries.wiki
new file mode 100644
index 00000000..f69a9935
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/abel/tutorial/advanced-queries.wiki
@@ -0,0 +1,151 @@
+[[Property:title|Advanced Queries]]
+[[Property:weight|-9]]
+[[Property:uuid|a630a4bb-6b25-54ef-085b-7e18050a21a2]]
+==The query mechanism==
+
+As you already know from [[Basic Operations]], queries to a database are done by creating a
+class
+ PS_CRITERION_FACTORY
+create
+ default_create
+
+feature -- Creating a criterion
+
+ new_criterion alias "()" (tuple: TUPLE [ANY]): PS_CRITERION
+ -- Creates a new criterion according to a `tuple'
+ -- containing either a single PREDICATE or three
+ -- values of type [STRING, STRING, ANY].
+
+ new_agent (a_predicate: PREDICATE [TUPLE [ANY]]): PS_CRITERION
+ -- Creates an agent criterion.
+
+ new_predefined (object_attribute: STRING; operator: STRING; value: ANY): PS_CRITERION
+ -- Creates a predefined criterion.
+
+feature -- Operators
+
+ equals: STRING = "="
+
+ greater: STRING = ">"
+
+ greater_equal: STRING = ">="
+
+ less: STRING = "<"
+
+ less_equal: STRING = "<="
+
+ like_string: STRING = "like"
+
+end
+
+
+Assuming you have an object
+ create_criteria_traditional : PS_CRITERION
+ -- Create a new criteria using the traditional approach.
+ do
+ -- for predefined criteria
+ Result:= factory.new_predefined ("age", factory.less, 5)
+
+ -- for agent criteria
+ Result := factory.new_agent (agent age_more_than (?, 5))
+ end
+
+ create_criteria_parenthesis : PS_CRITERION
+ -- Create a new criteria using parenthesis alias.
+ do
+ -- for predefined criteria
+ Result:= factory ("age", factory.less, 5)
+
+ -- for agent criteria
+ Result := factory (agent age_more_than (?, 5))
+ end
+
+ age_more_than (person: PERSON; age: INTEGER): BOOLEAN
+ -- An example agent
+ do
+ Result:= person.age > age
+ end
+
+
+
+===Combining criteria===
+
+You can combine multiple criterion objects by using the standard Eiffel logical operators.
+For example, if you want to search for a person called "Albo Bitossi" with
+ composite_search_criterion : PS_CRITERION
+ -- Combining criterion objects.
+ local
+ first_name_criterion: PS_CRITERION
+ last_name_criterion: PS_CRITERION
+ age_criterion: PS_CRITERION
+ do
+ first_name_criterion:= factory ("first_name", factory.equals, "Albo")
+
+ last_name_criterion := factory ("last_name", factory.equals, "Bitossi")
+
+ age_criterion := factory (agent age_more_than (?, 20))
+
+ Result := first_name_criterion and last_name_criterion and not age_criterion
+
+ -- Shorter version:
+ Result := factory ("first_name", "=", "Albo")
+ and factory ("last_name", "=", "Bitossi")
+ and not factory (agent age_more_than (?, 20))
+ end
+
+
+ABEL supports the three standard logical operators
+ insert_persons
+ -- Populate the repository with some person objects.
+ local
+ p1, p2, p3: PERSON
+ transaction: PS_TRANSACTION
+ do
+ -- Create persons
+ create p1.make (...)
+ create ...
+
+ -- We first need a new transaction.
+ transaction := repository.new_transaction
+
+ -- Now we can insert all three persons.
+ if not transaction.has_error then
+ transaction.insert (p1)
+ end
+ if not transaction.has_error then
+ transaction.insert (p2)
+ end
+ if not transaction.has_error then
+ transaction.insert (p3)
+ end
+
+ -- Commit the changes.
+ if not transaction.has_error then
+ transaction.commit
+ end
+
+ -- Check for errors.
+ if transaction.has_error then
+ print ("An error occurred!%N")
+ end
+ end
+
+
+==Querying==
+A query for objects is done by creating a
+ print_persons
+ -- Print all persons in the repository
+ local
+ query: PS_QUERY[PERSON]
+ do
+ -- First create a query for PERSON objects.
+ create query.make
+
+ -- Execute it against the repository.
+ repository.execute_query (query)
+
+ -- Iterate over the result.
+ across
+ query as person_cursor
+ loop
+ print (person_cursor.item)
+ end
+
+ -- Check for errors.
+ if query.has_error then
+ print ("An error occurred!%N")
+ end
+
+ -- Don't forget to close the query.
+ query.close
+ end
+
+
+In a real database the result of a query may be very big, and you are probably only interested in objects that meet certain criteria, e.g. all persons of age 20.
+You can read more about it in [[Advanced Queries]].
+
+Please note that ABEL does not enforce any kind of order on a query result.
+
+==Updating==
+
+Updating an object is done through feature
+ update_berno_citrini
+ -- Increase the age of Berno Citrini by one.
+ local
+ query: PS_QUERY[PERSON]
+ transaction: PS_TRANSACTION
+ berno: PERSON
+ do
+ print ("Updating Berno Citrini's age by one.%N")
+
+ -- Create query and transaction.
+ create query.make
+ transaction := repository.new_transaction
+
+ -- As we're doing a read followed by a write, we
+ -- need to execute the query within a transaction.
+ if not transaction.has_error then
+ transaction.execute_query (query)
+ end
+
+ -- Search for Berno Citrini
+ across
+ query as cursor
+ loop
+ if cursor.item.first_name ~ "Berno" then
+ berno := cursor.item
+
+ -- Change the object.
+ berno.celebrate_birthday
+
+ -- Perform the database update.
+ transaction.update (berno)
+ end
+ end
+
+ -- Cleanup
+ query.close
+ if not transaction.has_error then
+ transaction.commit
+ end
+
+ if transaction.has_error then
+ print ("An error occurred.%N")
+ end
+ end
+
+
+
+To perform an update the object first needs to be retrieved or inserted within the same transaction.
+Otherwise ABEL cannot map the Eiffel object to its database counterpart.
+
+==Deleting==
+
+ABEL does not support explicit deletes any longer, as it is considered dangerous for shared objects.
+Instead of deletion it is planned to introduce a garbage collection mechanism in the
+
+==Dealing with Known Objects==
+
+Within a transaction ABEL keeps track of objects that have been inserted or queried.
+This is important because in case of an update, the library internally needs to map the object in the current execution of the program to its specific entry in the database.
+
+Because of that, you can't update an object that is not yet known to ABEL.
+As an example, the following functions will fail:
+
+
+ failing_update
+ -- Trying to update a new person object.
+ local
+ bob: PERSON
+ transaction: PS_TRANSACTION
+ do
+ create bob.make ("Robert", "Baratheon")
+ transaction := repository.new_transaction
+ -- Error: Bob was not inserted / retrieved before.
+ -- The result is a precondition violation.
+ transaction.update (bob)
+ transaction.commit
+ end
+
+ update_after_commit
+ -- Update after transaction committed.
+ local
+ joff: PERSON
+ transaction: PS_TRANSACTION
+ do
+ create joff.make ("Joffrey", "Baratheon")
+ transaction := repository.new_transaction
+ transaction.insert (joff)
+ transaction.commit
+
+ joff.celebrate_birthday
+
+ -- Prepare can be used to restart a transaction.
+ transaction.prepare
+
+ -- Error: Joff was not inserted / retrieved before.
+ -- The result is a precondition violation.
+ transaction.update (joff)
+
+ -- Note: After commit and prepare,`transaction'
+ -- represents a completely new transaction.
+ end
+
+
+The feature
+class
+ CHILD
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make (first, last: STRING)
+ -- Create a new child.
+ require
+ first_exists: not first.is_empty
+ last_exists: not last.is_empty
+ do
+ first_name := first
+ last_name := last
+ age := 0
+ ensure
+ first_name_set: first_name = first
+ last_name_set: last_name = last
+ default_age: age = 0
+ end
+
+feature -- Access
+
+ first_name: STRING
+ -- The child's first name.
+
+ last_name: STRING
+ -- The child's last name.
+
+ age: INTEGER
+ -- The child's age.
+
+ father: detachable CHILD
+ -- The child's father.
+
+feature -- Element Change
+
+ celebrate_birthday
+ -- Increase age by 1.
+ do
+ age := age + 1
+ ensure
+ age_incremented_by_one: age = old age + 1
+ end
+
+ set_father (a_father: CHILD)
+ -- Set a father for the child.
+ do
+ father := a_father
+ ensure
+ father_set: father = a_father
+ end
+
+invariant
+ age_non_negative: age >= 0
+ first_name_exists: not first_name.is_empty
+ last_name_exists: not last_name.is_empty
+end
+
+
+This adds some complexity:
+Instead of having a single object, ABEL has to insert a
+ insert_children
+ -- Populate the repository with some children objects.
+ local
+ c1, c2, c3: CHILD
+ transaction: PS_TRANSACTION
+ do
+ -- Create the object graph.
+ create c1.make ("Baby", "Doe")
+ create c2.make ("John", "Doe")
+ create c3.make ("Grandpa", "Doe")
+ c1.set_father (c2)
+ c2.set_father (c3)
+
+ print ("Insert 3 children in the database.%N")
+ transaction := repository.new_transaction
+
+ -- It is sufficient to just insert "Baby Joe",
+ -- as the other CHILD objects are (transitively)
+ -- referenced and thus inserted automatically.
+ if not transaction.has_error then
+ transaction.insert (c1)
+ end
+
+ if not transaction.has_error then
+ transaction.commit
+ end
+
+ if transaction.has_error then
+ print ("An error occurred during insert!%N")
+ end
+ end
+
+ print_children
+ -- Print all children in the repository
+ local
+ query: PS_QUERY[CHILD]
+ do
+ create query.make
+ repository.execute_query (query)
+
+ -- The result will also contain
+ -- all referenced CHILD objects.
+ across
+ query as person_cursor
+ loop
+ print (person_cursor.item)
+ end
+
+ query.close
+ end
+
+
+==Going deeper in the Object Graph==
+ABEL has no limits regarding the depth of an object graph, and it will detect and handle reference cycles correctly.
+You are welcome to test ABEL's capability with very complex objects, however, please keep in mind that this may impact performance significantly.
+
diff --git a/documentation/18.11/solutions/database-access/abel/tutorial/error-handling.wiki b/documentation/18.11/solutions/database-access/abel/tutorial/error-handling.wiki
new file mode 100644
index 00000000..f040e781
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/abel/tutorial/error-handling.wiki
@@ -0,0 +1,58 @@
+[[Property:title|Error handling]]
+[[Property:weight|0]]
+[[Property:uuid|5f3afec1-939d-b1f5-3715-8bbd2f44ce79]]
+As ABEL is dealing with I/O and databases, a runtime error may happen at any time.
+ABEL will inform you of an error by setting the
+class
+ MY_PRIVATE_VISITOR
+
+inherit
+ PS_DEFAULT_ERROR_VISITOR
+ redefine
+ visit_transaction_aborted_error,
+ visit_connection_setup_error
+ end
+
+feature -- Visitor features
+
+ visit_transaction_aborted_error (transaction_aborted_error: PS_TRANSACTION_ABORTED_ERROR)
+ -- Visit a transaction aborted error
+ do
+ print ("Transaction aborted")
+ end
+
+ visit_connection_setup_error (connection_setup_error: PS_CONNECTION_SETUP_ERROR)
+ -- Visit a connection setup error
+ do
+ print ("Wrong login")
+ end
+
+end
+
+
diff --git a/documentation/18.11/solutions/database-access/abel/tutorial/getting-started.wiki b/documentation/18.11/solutions/database-access/abel/tutorial/getting-started.wiki
new file mode 100644
index 00000000..35d2f8ca
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/abel/tutorial/getting-started.wiki
@@ -0,0 +1,106 @@
+[[Property:title|Getting started]]
+[[Property:weight|-15]]
+[[Property:uuid|60a4120c-3994-c9b9-d22e-af7c6fe12147]]
+== Setting things up ==
+
+This tutorial only works with ABEL shipped with EiffelStudio 14.05.
+You can find the code in the ''unstable'' directory.
+
+It is also possible to get the latest code from the [https://svn.eiffel.com/eiffelstudio/trunk/Src/unstable/library/persistency/abel SVN directory] .
+
+== Getting started ==
+We will be using
+class PERSON
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make (first, last: STRING)
+ -- Create a newborn person.
+ require
+ first_exists: not first.is_empty
+ last_exists: not last.is_empty
+ do
+ first_name := first
+ last_name := last
+ age:= 0
+ ensure
+ first_name_set: first_name = first
+ last_name_set: last_name = last
+ default_age: age = 0
+ end
+
+feature -- Basic operations
+
+ celebrate_birthday
+ -- Increase age by 1.
+ do
+ age:= age + 1
+ ensure
+ age_incremented_by_one: age = old age + 1
+ end
+
+feature -- Access
+
+ first_name: STRING
+ -- The person's first name.
+
+ last_name: STRING
+ -- The person's last name.
+
+ age: INTEGER
+ -- The person's age.
+
+invariant
+ age_non_negative: age >= 0
+ first_name_exists: not first_name.is_empty
+ last_name_exists: not last_name.is_empty
+end
+
+
+There are three very important classes in ABEL:
+* The deferred class
+class START
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make
+ -- Initialization for `Current'.
+ local
+ factory: PS_IN_MEMORY_REPOSITORY_FACTORY
+ do
+ create factory.make
+ repository := factory.new_repository
+
+ create criterion_factory
+ explore
+ end
+
+ repository: PS_REPOSITORY
+ -- The main repository.
+
+ end
+
+end
+
+We will use
+ explore_tuple_queries
+ -- See what can be done with tuple queries.
+ local
+ query: PS_TUPLE_QUERY [CHILD]
+ transaction: PS_TRANSACTION
+ projection: ARRAYED_LIST [STRING]
+ do
+ -- Tuple queries are very similar to normal queries.
+ -- I.e. you can query for CHILD objects by creating
+ -- a PS_TUPLE_QUERY [CHILD]
+ create query.make
+
+ -- It is also possible to add criteria. Agent criteria
+ -- are not supportedfor tuple queries however.
+ -- Lets search for CHILD objects with last name Doe.
+ query.set_criterion (criterion_factory ("last_name", criterion_factory.equals, "Doe"))
+
+ -- The big advantage of tuple queries is that you can
+ -- define which attributes should be loaded.
+ -- Thus you can avoid loading a whole object graph
+ -- if you're just interested in e.g. the first name.
+ create projection.make_from_array (<<"first_name">>)
+ query.set_projection (projection)
+
+ -- Execute the tuple query.
+ repository.execute_tuple_query (query)
+
+ -- The result of the query is a TUPLE containing the
+ -- requested attribute.
+
+ print ("Print all first names using a tuple query:%N")
+
+ across
+ query as cursor
+ loop
+ -- It is possible to downcast the TUPLE
+ -- to a tagged tuple with correct type.
+ check attached {TUPLE [first_name: STRING]} cursor.item as tuple then
+ print (tuple.first_name + "%N")
+ end
+ end
+
+ -- Cleanup and error handling.
+ query.close
+ if query.has_error then
+ print ("An error occurred!%N")
+ end
+ end
+
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/EiffelStore-ODBC-with-PostgreSQL.wiki b/documentation/18.11/solutions/database-access/eiffelstore/EiffelStore-ODBC-with-PostgreSQL.wiki
new file mode 100644
index 00000000..0edc7cb9
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/EiffelStore-ODBC-with-PostgreSQL.wiki
@@ -0,0 +1,179 @@
+[[Property:modification_date|Thu, 18 Oct 2018 15:19:06 GMT]]
+[[Property:publication_date|Mon, 24 Sep 2018 12:04:18 GMT]]
+[[Property:uuid|6F78A05A-2054-4150-84FC-1D8663CA76E6]]
+[[Property:weight|5]]
+[[Property:title|EiffelStore ODBC with PostgreSQL]]
+[[Property:link_title|EiffelStore ODBC]]
+The following steps describe how to check the EiffelStudio installation and the required dependencies to use EiffelStore ODBC with PostgreSQL. The steps are also useful for other databases such as MySQL (for which you will to install the MySQL ODBC driver).
+
+{{note|For this documentation, tests used Ubuntu 18.04 64 bits and EiffelStudio 18.07 64 bits. }}
+
+* '''Install EiffelStudio'''
+ From here on, $YOUR_INSTALLATION_PATH denotes the path name of the EiffelStudio installation.
+
+{{seealso|
+sudo gedit ~/.bashrc
+
+-- Export the following variables
+
+export ISE_EIFFEL=$YOUR_INSTALLATION_PATH/Eiffel_18.07
+export ISE_PLATFORM=linux-x86-64
+export PATH=$PATH:$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin
+
+-- Refresh environment variables after edit
+
+. ~/.bashrc
+
+-- Or . /etc/profile.d/eiffel.sh if you put it there
+
+
+* '''Use the estudio command to check that EiffelStudio is installed and where it is''
+
+which estudio
+
+{{note|You should see the path to EiffelStudio, for example: /opt/Eiffel_18.07/studio/spec/linux-x86-64/bin/estudio. }}
+
+check EiffelStudio version using.
+
+ec -version
+
+{{note|You should see something like ISE EiffelStudio version 18.07.10.1981 GPL Edition - linux-x86-64 }}
+
+* '''Check/Install PostgreSQL'''
+
+
+-- Install PostgreSQL
+sudo apt install postgresql postgresql-contrib
+
+-- Check that PostgreSQL is working
+sudo -u postgres psql
+psql (10.5 (Ubuntu 10.5-0ubuntu0.18.04))
+Type "help" for help.
+
+postgres=#
+
+ -- Exit postgresql
+postgres=# \q
+
+
+* '''Install and Check ODBC Driver Manager and ODBC Driver for PostgreSQL'''
+
+
+-- Install the UnixODBC Driver Manager and the ODBC driver for PostgreSQL
+sudo apt-get install unixodbc unixodbc-dev odbc-postgresql
+
+-- Check
+odbcinst -j
+
+unixODBC 2.3.4
+DRIVERS............: /etc/odbcinst.ini
+SYSTEM DATA SOURCES: /etc/odbc.ini
+FILE DATA SOURCES..: /etc/ODBCDataSources
+USER DATA SOURCES..: /home/websocket/.odbc.ini
+SQLULEN Size.......: 8
+SQLLEN Size........: 8
+SQLSETPOSIROW Size.: 8
+
+
+* '''Configure PostgreSQL and ODBC Driver'''
+
+
+-- Edit the file /etc/odbcinst.ini adding full path instead of file only
+
+[PostgreSQL]
+Description=PostgreSQL ODBC driver (ANSI version)
+Driver=/usr/lib/x86_64-linux-gnu/odbc/psqlodbca.so
+Setup=/usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so
+Debug=0
+CommLog=1
+UsageCount=1
+
+[PostgreSQL Unicode]
+Description=PostgreSQL ODBC driver (Unicode version)
+Driver=/usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
+Setup=/usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so
+Debug=0
+CommLog=1
+UsageCount=1
+
+
+
+* '''Configure the Database name, username and password to use the Postgres ODBC Driver'''
+
+-- Edit file /etc/odbc.ini
+
+[PODBC]
+Driver = PostgreSQL Unicode
+Description = PostgreSQL Data Source
+Servername = localhost
+Port = 5432
+Protocol = 8.4
+UserName = postgres
+Password = example
+Database = example
+
+-- The previous files tells PODBC to use the PostgreSQL Unicode driver. Using as postgres as a user, example as password, and to connect to PostgreSQL running on the localhost on port 5432.
+
+
+* '''Test the ODBC to PostgreSQL connection by running the isql command'''
+
+Read the /etc/odbc.ini.
+
+isql -v PODBC
+encoding name too long
++---------------------------------------+
+| Connected! |
+| |
+| sql-statement |
+| help [tablename] |
+| quit |
+| |
++---------------------------------------+
+
+
+
+* '''Compile C code of the Eiffel library store:'''
+
+cd $YOUR_INSTALLATION_PATH/library/store/dbms/rdbms/odbc/Clib finish_freezing -library
+
+{{note|On debian at least before finish_freezing log in as superuser doing a '''sudo -i''' }}
+
+* '''Open EiffelStudio eSQL example and run it'''
+The example is located on `$ISE_EIFFEL/examples/store/esql/`
+
+
+-- You will see something like this.
+
+
+Database user authentication:
+Data Source Name: PODBC
+Name: postgres
+Password: example
+encoding name too long
+
+Welcome to the SQL interpreter
+Database used: DB
+ Type 'exit' to terminate
+
+SQL> select * from cities;
+
+names location
+milan italy
+SQL> insert into cities values ('Madrid', 'Spain');
+SQL> select * from cities;
+
+names location
+milan italy
+Madrid Spain
+SQL>
+
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/EiffelStore-SQL-injection.wiki b/documentation/18.11/solutions/database-access/eiffelstore/EiffelStore-SQL-injection.wiki
new file mode 100644
index 00000000..6bbf6d41
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/EiffelStore-SQL-injection.wiki
@@ -0,0 +1,86 @@
+[[Property:modification_date|Thu, 11 Oct 2018 20:09:39 GMT]]
+[[Property:publication_date|Thu, 11 Oct 2018 20:09:39 GMT]]
+[[Property:link_title|SQL injection]]
+[[Property:uuid|438C838C-C115-44B4-8480-05A825FE1047]]
+[[Property:weight|4]]
+[[Property:title|Defending against SQL injections with EiffelStore]]
+[[Property:weight|4]]
+
+
+= Introduction =
+In this article, we will explain to you how to use EiffelStore API to avoid SQL injections.
+
+= What is an SQL injection? =
+An SQL injection attack is a coding technique that inserts, or "injects", an SQL query via the input data, passing unsafe input from the client to the application. A successful SQL injection can enable the attacker to read sensitive data from the database, modify database data (Insert/Update/Delete), or become administrator of the database server. To learn more about SQL injection, read the following articles.
+
+{{SeeAlso| To learn more about SQL injection, read the following articles. }}
+
+* [https://en.wikipedia.org/wiki/SQL_injection https://en.wikipedia.org/wiki/SQL_injection]
+* [https://www.owasp.org/index.php/SQL_injection https://www.owasp.org/index.php/SQL_injection]
+
+
+= Template Query =
+A template query is a string containing the fixed parts of the query and placeholders for the variable parts, and you can later substitute in values into those placeholders. (Bind variables to the query.). A template query could be static or dynamic.
+
+{{Note|the way you bind variables to the query is quite important and it will define if your query is safe and avoid a SQL Injection attack.}}
+
+== How to define placeholders (variables) in a SQL Template query? ==
+Variables syntax is simple: the ':' special character followed by the variable name, for example :value
+
+ SELECT * FROM TABLE_NAME WHERE field1 = :value
+
+{{SeeAlso| To learn more about EiffelStore query variables read the following article}}
+* [https://www.eiffel.org/doc/solutions/Query%20variables Query Variables]
+
+==How to bind variables/placeholders to a template query.==
+
+To avoid SQL Injections you will need to map variables names to values using the EiffelStore API (using EiffelStore supported connectors)
+
+* Queries returning a result will need to use: DB_SELECTION
+* Queries updating the database (Insert, Update, Delete) will need to use: DB_CHANGE
+
+=== Safe binding ===
+The following example shows an attempt to do an SQL Injection attack, but as we are using EiffelStore API to bind the parameters the unsafe data will be escaped.
+
+
+ safe_query
+ local
+ l_connection: DATABASE_CONNECTION
+ db_selection: DB_SELECTION
+ l_query: STRING
+ do
+ ...
+ create db_selection.make
+ db_selection.set_query ("SELECT * FROM new_users where datetime = :datetime")
+ db_selection.set_map_name ("\''; DROP TABLE new_users; --", ":datetime")
+ db_selection.execute_query
+ db_selection.unset_map_name (":datetime")
+ ....
+ end
+
+
+As you can observe in the previous example the binding to map the variable name :datetime to their value is done using feature BD_SELECTION.set_map_name and the API is responsible to do the necessary encoding.
+
+=== Unsafe binding ===
+If you use your own binding to map variables names to values, for example using String replacement, EiffelStore does not ensure that your query is safe, because it will depend on how do you handle escaping inputs before adding them to the query.
+
+The following example shows how we can bypass the EiffelStore API to bind placeholders using an unsafe String replacement, in this case, is up to the developer to escape the input value. The example is unsafe and subject to SQL Injections attacks when the input is unsafe.
+
+
+unsafe_query
+ local
+ l_connection: DATABASE_CONNECTION
+ db_selection: DB_SELECTION
+ l_query: STRING
+ do
+ ...
+ check l_connection.is_connected end
+ create l_query.make_from_string ("SELECT * FROM new_users where datetime = :datetime")
+ l_query.replace_substring_all (":datetime", "\''; DROP TABLE new_users; --" )
+ create db_selection.make
+ db_selection.set_query (l_query)
+ db_selection.execute_query
+ ...
+ end
+
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-class-reference.wiki b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-class-reference.wiki
new file mode 100644
index 00000000..306d31de
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-class-reference.wiki
@@ -0,0 +1,5 @@
+[[Property:title|EiffelStore Class Reference]]
+[[Property:weight|2]]
+[[Property:uuid|a21dc8dc-51d8-09c5-3afd-d62effb3c23a]]
+==View the [[ref:libraries/store/reference/index|EiffelStore Class Reference]]==
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/esql-sample.wiki b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/esql-sample.wiki
new file mode 100644
index 00000000..d15d1a1d
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/esql-sample.wiki
@@ -0,0 +1,66 @@
+[[Property:title|Esql Sample]]
+[[Property:weight|0]]
+[[Property:uuid|04d03117-fdb2-8b73-677f-9b1a0c333dc4]]
+This sample consists of a command line SQL parser. SQL statements are filtered through a monitor and sent to the RDBMS.
+
+==Compiling==
+
+To compile the example:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\store\esql\''.
+* Choose ''esql.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Choose the targe according to the installed DBMS.
+* Click '''OK'''.
+
+==Running==
+
+This sample lets you interact with your database through a console.
+
+First you have to enter the database connection information:
+* For ODBC:
+
+Database user authentication:
+Data Source Name: handson
+Name: smith
+Password: mypass
+
+
+{{note|''Name'' and ''Password'' are not required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit ''Return'' when prompted. }}
+
+* For Oracle:
+
+Database user authentication:
+Name: smith@HANDSON
+Password: mypass
+
+
+{{note|You must specify the Oracle User Name and Net Service Name with the syntax ''
+SQL> select firstname, lastname from CONTACTS where lastname = 'Smith'
+John Smith
+SQL>
+
+
+{{note|Enter ''exit'' to quit the application. }}
+
+==Under the Hood==
+
+This sample showcases the use of the 3 basic classes to interact with your database:
+* [[ref:libraries/store/reference/db_control_chart|DB_CONTROL]] to connect and disconnect to your database.
+* [[ref:libraries/store/reference/db_selection_chart|DB_SELECTION]] to perform 'select' queries.
+* [[ref:libraries/store/reference/db_change_chart|DB_CHANGE]] to perform SQL queries that output no result.
+
+The whole sample code is contained in the root class:
+* ESQL for Oracle.
+* ESQL_ODBC for ODBC.
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/index.wiki b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/index.wiki
new file mode 100644
index 00000000..dec8004c
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/index.wiki
@@ -0,0 +1,13 @@
+[[Property:title|EiffelStore Samples]]
+[[Property:weight|3]]
+[[Property:uuid|65a0aab3-bc1d-28b8-a6f0-6d71b4c6d54d]]
+=EiffelStore Samples=
+
+The following basic examples showcases the different EiffelStore capabilities:
+* [[Esql Sample|esql]] : A command line SQL parser: very useful to test your Database connection!
+* [[Selector Sample|select]] : A basic example to perform smart database queries.
+* [[Inserter Sample|insert]] : A basic example to easily insert data in your database.
+
+
+
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/inserter-sample.wiki b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/inserter-sample.wiki
new file mode 100644
index 00000000..ffc2a3a1
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-samples/inserter-sample.wiki
@@ -0,0 +1,81 @@
+[[Property:title|Inserter Sample]]
+[[Property:weight|2]]
+[[Property:uuid|fa0b8601-ca7a-b1cc-384d-f366be33ac40]]
+This sample lets the user insert a DB_BOOK object in your database using EiffelStore insertion facilities.
+
+==Compiling==
+
+To compile the example:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\store\insert\''.
+* Clicking open loads the selected project
+* Choose inserter.ecf
+* Select the target according to the installed DBMS
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+==Running==
+
+This sample lets you interact with your database through a console.
+
+First you have to enter the database connection information:
+* For ODBC:
+
+Database user authentication:
+
+Data Source Name: handson
+
+Name: smith
+
+Password: mypass
+
+
+{{note|''Name'' and ''Password'' are not required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit '''Return''' when prompted ''.'' }}
+
+* For Oracle:
+
+Database user authentication:
+
+Name: smith@HANDSON
+
+Password: mypass
+
+
+{{note|You must specify the Oracle User Name and Net Service Name with the syntax ''
+What new book should I create?
+
+Author? John Smith
+
+Title? My book
+
+Quantity? 1
+
+Price? 50
+
+Year? 2001
+
+Double value? 12.675
+
+Object inserted
+
+
+{{note|If your database does not contain a data.sql from one of the files in the select example directory. You will see that the data.sql files in the example directory have names which include the names of the available DBMS handles. This is because the SQL can differ from one DBMS to another. For example, you'll see data.sql.oracle and data.sql.odbc. If you are using the Oracle DBMS, you should rename or make a copy of data.sql.oracle as data.sql and make sure it's in your execution directory before running the example.
+
+
+{{note|The data.sql file must be available in the sample application current directory. If you run the sample from EiffelStudio, this directory should be the ''EIFGENs/target/W_CODE/'' directory of your project (where target is one of the installed DBMS). }}
+
+This sample lets you interact with your database through a console.
+
+First you have to enter the database connection information:
+* For ODBC:
+
+Database user authentication:
+Data Source Name: handson
+Name: smith
+Password: mypass
+
+
+{{note|''Name'' and ''Password'' are not required with ODBC. If you don't need ''Name'' and ''Password'', you can simply hit ''Return'' when prompted. }}
+
+* For Oracle:
+
+Database user authentication:
+Name: smith@HANDSON
+Password: mypass
+
+
+{{note|You must specify the Oracle User Name and Net Service Name with the syntax ''
+Author? ('exit' to terminate):Bertrand Meyer
+Seeking for books whose author's name match: Bertrand Meyer
+
+Author:Bertrand Meyer
+Title:Eiffel The Libraries
+Quantity:11
+Price:20
+double_value:435.60000610351562
+First publication:07/01/1994 12:00:00.0 AM
+
+
+Author:Bertrand Meyer
+Title:Eiffel The Language
+Quantity:9
+Price:51
+double_value:775.22998046875
+First publication:07/01/1992 12:00:00.0 AM
+
+
+
+Author? ('exit' to terminate):
+
+
+{{note|Enter ''exit'' to quit the application. }}
+
+==Under the Hood==
+
+This sample showcases the use of the [[ref:libraries/store/reference/db_selection_chart|DB_SELECTION]] class to perform smart ''select'' queries, using:
+* [[Data Object Coupling|Database data and Eiffel objects Coupling]] .
+* [[Query variables|Variables Binding]] .
+
+The whole sample code is contained in the root class:
+* SELECTOR for Oracle.
+* SELECTOR_ODBC for ODBC.
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-dataview-cluster.wiki b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-dataview-cluster.wiki
new file mode 100644
index 00000000..f08e3d57
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-dataview-cluster.wiki
@@ -0,0 +1,432 @@
+[[Property:title|EiffelStore DataView Cluster]]
+[[Property:weight|3]]
+[[Property:uuid|75f8cc72-7ccf-28a4-f6b2-beeb2219dc43]]
+==1. Introduction==
+
+DataView cluster helps the programmer creating a GUI for a RDBMS. It gives a basic solution for a RDBMS GUI and also enables the developer to customize his GUI from this basic interface.
+
+This cluster is client of EiffelStore to interface with a RDBMS and EiffelVision2 to create a GUI. However, the use of EiffelStore and EiffelVision 2 is sufficiently encapsulated to let the programmer use other database/graphic libraries.
+
+Notice finally that DataView is based on some common O-O ''design patterns''. Knowing these patterns will help you understand how the library works. It can also give an example of patterns use.
+
+==2. Specifications==
+
+This part draws the main capabilities that can be expected from the DataView cluster. These capabilities are not exhaustive since the cluster architecture enables to add easily new capabilities to it.
+
+===2.1. Required database structure===
+
+The cluster has been designed to work well with relational databases on Third Normal Form. Database tables must also have an unique numeric ID.
+* The cluster automatically performs associations between related tables. This is required to work fine with 3rd NF architectures.
+* The unique ID enables to update the database content. If you only intend to display database table content, unique IDs are not required.
+* The numeric ID enables to directly give IDs to new table rows. If you don't intend to create table rows, this is not necessary. Notice that with only a couple of redefinitions, the numeric ID requirement problem can be overcome.
+
+===2.2. Database content display===
+
+The cluster provides facilities to:
+* display a set of table rows.
+* select a (current) table row in the set.
+* display the current table row so that it can be edited.
+
+For instance, an interface can display a multi-column list of table rows. A given row can be selected in the list and its information can be then edited through a set of text fields and combo-boxes.
+
+The standard cluster usage is to define a GUI that will associate a given frame/window to a given database table, that is, the information that is displayed in a GUI area will be determined at compile-time. This enables to adapt the GUI display to the type of information displayed, which is recommended when creating a GUI for non-developer users (or any people that should not be aware of the database structure and functioning). Nevertheless, determining the type of information displayed by a frame/window at runtime is still possible as not hard-coded.
+
+Abstracting database in the GUI might not be as easy as only changing database attribute fields names. Information to display may not match the database tables structure. However, for consistency reasons, we can assume that he information to display within a GUI area belongs to a set of associated tables. The easiest solution is to create database views that directly contain the information to display on the GUI area. This implies though that the database has to be modified for the GUI needs.
+
+DataView cluster affords a second solution:
+* Model-View separation enables to merge graphically information that is separated in the process part (i.e. that is from a different table).
+* Table associations facilities enable to specify to display automatically content of table rows associated to a given table row. For instance, with a CONTACTS table associated to a COMPANIES table, the cluster can retrieve automatically a COMPANIES table row associated to a selected CONTACTS table row.
+
+===2.3. Actions performed on the database===
+
+The cluster provides facilities for the following actions:
+* Creating a table row
+* Deleting a table row
+* Updating the content of a table row
+* Selecting a set of table rows
+
+Other capabilities can be added to these ones, for instance by writing descendants of DataView cluster classes that would handle more database operations.
+
+Operations relative to the database structure modification, for instance creating a database table, may be more difficult to add since the database structure is hard-coded. But these advanced capabilities might not be necessary in a GUI for non-developer users.
+
+==3. General description==
+
+===3.1. Global architecture===
+
+The DataView cluster is based on 1 class called [[ref:libraries/store/reference/dv_table_component_chart|DV_TABLE_COMPONENT]] that represents the interface for 1 relational database table. An architecture using ''DataView'' is centered on database table structure rather than the GUI structure. The basic idea is to have:
+* 1 database relational table
+* 1 GUI window or frame
+* 1 [[ref:libraries/store/reference/dv_table_component_chart|DV_TABLE_COMPONENT]] object
+
+This is then possible to adapt the code to have a GUI meeting the specifications, database structure can be totally abstracted in the interface, which might be more convenient for non-developer GUI users.
+
+===3.2. Library structure===
+
+The cluster can be separated into 3 main parts:
+* The '''model''': processes the information and interfaces with an abstract graphic interface (the handle) and an abstract database interface.
+* The '''handle''': defines an abstract graphic interface for the model.
+* The '''view''': implements the handle interface with EiffelVision2 widgets.
+
+The abstract database interface is defined in the EiffelStore generation.tables_access cluster. This cluster can indeed been used independently from the DataView cluster.
+
+===3.3. Model cluster structure===
+
+The '''model''' cluster processes the information retrieved from the GUI and the database and update then both GUI and database.
+
+The cluster is based on the [[ref:libraries/store/reference/dv_table_component_chart|DV_TABLE_COMPONENT]] class which objects represents a database relational table (or view).
+
+DV_TABLE_COMPONENT objects can be interconnected to match the table associations. The [[ref:libraries/store/reference/dv_table_component_chart|DV_TABLE_COMPONENT]] class has been designed to work with 3rd Normal Form relational databases. [[ref:libraries/store/reference/dv_table_component_chart|DV_TABLE_COMPONENT]] achieves most of the work to retrieve associated table rows for a 3NF database. For instance, when deleting a table row, the component ensures that every associated table row is also deleted.
+
+[[ref:libraries/store/reference/dv_table_component_chart|DV_TABLE_COMPONENT]] objects can be customized by adding some subcomponents to it. Subcomponents enable to display table rows content on screen, to navigate among table rows and to perform different database queries.
+
+[[Image:sub-component-objects]]
+
+Process objects structure for a GUI
+
+===3.4. Design patterns===
+
+This cluster adapts several well-known O-O design patterns.
+
+====3.4.1. Model-View separation pattern====
+
+The GUI appearance is totally abstracted in the GUI processing part, this enables to change the GUI display without changing any part of the model part.This is implemented with 2 sets of classes:
+* A set of interfaces that corresponds to each type of abstract widgets needed by the model.
+* A set of classes that implements these interfaces. Notice that an implementation class can implement several interfaces and several classes can implement the same interface.
+
+Let's see an example through a BON diagram:
+
+[[Image:model-view-relationship]]
+
+Model-View separation pattern implementation in ''DataView''
+* Light blue classes represents the model cluster.
+* Orange class represents the handle.
+* Yellow and green classes represents the view cluster.
+* Pink classes represents the EiffelVision2 library.
+
+====3.4.2. Strategy pattern====
+
+DataView cluster provides the developer with a basic GUI implementation AND lets them customize their application. This is possible with a strategy pattern:
+
+The developer assigns different subcomponents to a [[ref:libraries/store/reference/dv_table_component_chart|DV_TABLE_COMPONENT]] object to define its behavior. The component object only uses the interface of each subcomponent.
+
+A default implementation is written for each interface to let the user use the cluster as quick as possible. To adapt components behavior to their needs, the developer can then create a new subcomponent class inheriting from the abstract interface.
+
+This BON diagram illustrates this for [[ref:libraries/store/reference/dv_creator_chart|DV_CREATOR]] and [[ref:libraries/store/reference/dv_searcher_chart|DV_SEARCHER]] subcomponents:
+
+[[Image:dv-table-component-strategy]]
+
+Strategy pattern used in ''DataView'' model cluster
+
+==4. Cluster interface==
+
+This part describes how to use the table component class and its subcomponents classes:
+* The [[ref:libraries/store/reference/dv_searcher_chart|DV_SEARCHER]] class to [[#dv_searcher|select table rows from the database]] .
+* The [[ref:libraries/store/reference/dv_tablerows_navigator_chart|DV_TABLEROW_NAVIGATOR]] class to [[#dv_tablerow_navigator|navigate among selected table rows]] .
+* The [[ref:libraries/store/reference/dv_creator_chart|DV_CREATOR]] class to [[#dv_creator|create new table rows in the database]] .
+* The [[ref:libraries/store/reference/dv_tablerow_fields_chart|DV_TABLEROW_FIELDS]] class to [[#dv_tablerow_fields|edit a table row content]] .
+
+===4.1. DV_TABLE_COMPONENT class===
+
+This class is responsible for the management of a database table. Its behavior is determined by its assigned subcomponents.
+
+To create a valid and functional [[ref:libraries/store/reference/dv_tablerows_component_chart|DV_TABLE_COMPONENT]] object, follow these steps:
+# Call set_tablecode to specify which table the component will deal with.
+# Specify [[#output_handler|handlers to output messages]] .
+# Set the [[#database_handler|database handler]] .
+# Add different [[#controllers|controllers corresponding to actions to perform]] .
+# Set [[#subcomponents|subcomponents]] .
+# Set [[#associated_components|associated components]] .
+# Call activate to let the component work. This will basically set different default values for non required information not set during the creation process.
+
+The component can then be used on an interface:
+* Input interactions are done via component and subcomponents controllers (4).
+* Output interactions are done via output handlers (2).
+
+====4.1.1. Output handlers====
+
+Output handlers are specific to the [[ref:libraries/store/reference/dv_tablerows_component_chart|DV_TABLE_COMPONENT]] object, that is, you can output messages in a different way within your GUI. However, the same handlers will be used for subcomponents.
+
+3 handlers can be set:
+* `status_handler` to display status information
+* `warning_handler` to display warning information. Warnings usually correspond to database errors, they are called warnings because the database error is "caught" and the message should enable the user to round the problem.
+* `confirmation_handler` to ask for confirmation before an action.
+
+These handlers have default values, which are:
+* For `status_handler` and `warning_handler`, messages are displayed on standard output (with {ANY}.io.put_string)
+* For `confirmation_handler`, action is executed without confirmation.
+
+====4.1.2. Database handler====
+
+This handler is specific to the application. It must inherit from
+ class CONTACTS
+
+ feature
+
+ id: INTEGER
+
+ lastname: STRING
+
+ firstname: STRING
+
+
+
+You can also modify the piece of code to map for the first and last attributes, for cosmetics reasons. You can also choose to only map a piece of code to attributes of a given type.
+
+====2.1.2. Database content classes====
+
+Database content classes can basically store the list of your database tables.
+
+You can select a piece of code and map it to database table information:
+* Database table name.
+* Database table position in the database.
+
+The mapped pieces of code are then concatenated in your file.
+
+===2.2. General mapping system===
+
+EiffelStore follows this sequence of steps to generate a class:
+# You provide meta-data about the table or view
+# You provide the template
+# It parses the template to find the tags
+# It replaces each tag by the meta-data value corresponding to the tag
+
+Let us take an example:
+{| border="1"
+|-
+| template file extract
+| corresponding result file extract
+|-
+| attribute_count:
+| attribute_count: 5
+|}
+
+This works for meta-data on the class or view. For meta-data on class (or view) attributes, a second tag type enables to specify text areas that are mapped to specific table (or view) attributes.
+
+Let us take an example:
+{| border="1"
+|-
+| template file extract
+| corresponding result file extract
+|-
+| :
+| companyid: DOUBLE companyname: STRING
+|}
+
+Text contained in the tag 'A' is mapped to each table (or view) attribute and the resulting texts are concatenated. Let us see now the details about each tag.
+
+===2.3. Tags description===
+
+====2.3.1. Database table tags description====
+
+The available tags for database table classes generation can be separated into 3 types:
+* Tags corresponding to [[#table_meta-data|table meta-data]]
+* Tags corresponding to [[#attribute_meta-data|attribute meta-data]]
+* Tags to [[#enclosing_tag|enclose attribute meta-data]]
+
+=====2.3.1.1. Table meta-data tags=====
+{| border="1"
+|-
+| '''Tag name'''
+| '''Tag description'''
+| '''Options'''
+|-
+| '''Option name'''
+| '''Option description'''
+|-
+|
+| Table name
+| U
+| in uppercase
+|-
+| I
+| with initial capital
+|-
+| L
+| in lowercase
+|-
+|
+| Attribute count
+| N/A
+|}
+
+=====2.3.1.2. Attribute meta-data tags=====
+{| border="1"
+|-
+| '''Tag name'''
+| '''Tag description'''
+| '''Options'''
+|-
+| '''Option name'''
+| '''Option description'''
+|-
+|
+| Attribute name
+| U
+| in uppercase
+|-
+| I
+| with initial capital
+|-
+| L
+| in lowercase
+|-
+|
+| Attribute position in the table
+| N/A
+|-
+|
+| Attribute type name
+| U
+| in uppercase
+|-
+| I
+| with initial capital
+|-
+| L
+| in lowercase
+|-
+|
+| Attribute type default value
+| N/A
+|}
+
+'''Note''': Attribute tags are only valid within an enclosing tag.
+
+=====2.3.1.3. Enclosing tags=====
+
+The tag encloses text that will be mapped to attributes matching criteria. These criteria are specified by the tag options:
+* First option: attribute type criterion
+{| border="1"
+|-
+| '''Option name'''
+| '''Option description'''
+|-
+| A
+| All attributes
+|-
+| I
+| INTEGER attributes
+|-
+| S
+| STRING attributes
+|-
+| D
+| DATE attributes
+|-
+| B
+| BOOLEAN attributes
+|-
+| C
+| CHARACTER attributes
+|-
+| F
+| DOUBLE attributes
+|}
+
+* Second option: attribute position criterion
+{| border="1"
+|-
+| '''Option name'''
+| '''Option description'''
+|-
+| A
+| All attributes
+|-
+| F
+| First attribute
+|-
+| I
+| Intermediate attributes
+|-
+| L
+| Last attribute
+|}
+
+* '''Note''': this option is generally used to have a valid and nice layout or indentation.
+
+'''Note''': several options can be selected for one criterion.
+
+====2.3.2. Database content tags description====
+
+The tags described above can be reused for database content:database content class mapping is equivalent to the previous mapping but within a different scope:
+* class corresponds to the database rather than tables
+* class content deals with tables rather than table attributes
+
+The meaning of available tags is so modified:
+* [[#system_meta-data_ext|System meta-data tags]]
+* [[#table_meta-data_ext| Table meta-data tags]]
+* [[#enclosing_tag_ext| Enclosing tags]]
+
+'''Note''': every tag is not available for this mapping.
+
+=====2.3.2.1. System meta-data tags=====
+{| border="1"
+|-
+| '''Tag name'''
+| '''Tag description'''
+|-
+|
+| Table count
+|}
+
+=====2.3.2.2. Table meta-data tags=====
+{| border="1"
+|-
+| '''Tag name'''
+| '''Tag description'''
+| '''Options'''
+|-
+| '''Option name'''
+| '''Option description'''
+|-
+|
+| Table name
+| U
+| in uppercase
+|-
+| I
+| with initial capital
+|-
+| L
+| in lowercase
+|-
+|
+| Table position in the database
+| N/A
+|}
+
+=====2.3.2.3. Enclosing tags=====
+
+The tag encloses text that will be mapped to tables matching a position criterion. This criterion is specified by the tag options:
+{| border="1"
+|-
+| '''Option name'''
+| '''Option description'''
+|-
+| A
+| All tables
+|-
+| F
+| First table
+|-
+| I
+| Intermediate tables
+|-
+| L
+| Last table
+|}
+
+===2.4. Implementation overview===
+
+The data structure generation system is implemented with 4 EiffelStore classes:
+* DB_CLASS_GENERATOR abstractly generates a class mapped to database meta-data.
+* DB_TABLE_CLASS_GENERATOR generates a class mapped to a database table.
+* DB_ACCESS_CLASS_GENERATOR generates a class mapped to the database.
+* DB_TEMPLATE_TAGS defines available tags for mapping and their meaning.
+
+[[Image:estore-generation.generator]]
+
+Generation classes BON diagram
+
+==3.EiffelStore wizard==
+
+{{Warning|The wizard is not delivered anymore}}
+
+The EiffelStore wizard uses the [[#generation_system| EiffelStore generation system]] described above to generate the data structures mapped to your database.
+
+The wizard generates 3 types of classes:
+* [[#wiz_table_classes|Classes storing database table rows content]]
+* [[#wiz_descr_classes|Classes describing a database table]]
+* [[#wiz_access_class|A class describing the database and giving access to the previous types of classes]]
+
+The wizard uses one different template for each class.
+===3.1. Table classes===
+
+For each selected database table, a class is created from the same template, mapping the database table. This template is:
+
+ indexing
+ description: "Class which allows EiffelStore to retrieve/store%
+ %the content of a table row from database table "
+ author: "EiffelStore Wizard"
+ date: "$Date: 2004-12-09 23:29:16 +0100 (Thu, 09 Dec 2004) $"
+ revision: "$Revision: 46989 $"
+
+ class
+
+
+ inherit
+ DB_TABLE
+ -- redefine
+ -- out
+ -- end
+ undefine
+ Tables,
+ is_valid_code
+ end
+
+ DB_SPECIFIC_TABLES_ACCESS_USE
+
+ create
+ make
+
+ feature -- Access
+
+ :
+
+ table_description: DB_TABLE_DESCRIPTION is
+ -- Description associated to the .
+ do
+ tables._description.set_ (Current)
+ Result := tables._description
+ end
+
+ feature -- Initialization
+
+ set_default is
+ do
+ :=
+
+ end
+
+ feature -- Basic operations
+
+ set_ (a_: ) is
+ do
+ := a_
+ end
+
+ feature -- Output
+
+ out: STRING is
+ -- Printable representation of current object.
+ do
+ Result := ""
+
+ if /= Void then
+ Result.append (": " + .out + "%N")
+ end
+
+ end
+
+ end -- class CODES
+
+
+
+'''Note''': the template content can be adjusted, for instance to add comments or change the indexing. However, the fundamental template structure should not be changed to use data structures as described in the [[Data structures use|corresponding section]] .
+
+===3.2. Description classes===
+
+For each selected database table, a class is also created from a unique template, mapping the database table. This template is:
+
+ indexing
+ description: "Description of class "
+ author: "EiffelStore Wizard"
+ date: "$Date: 2004-12-09 23:29:16 +0100 (Thu, 09 Dec 2004) $"
+ revision: "$Revision: 46989 $"
+
+ class
+ _DESCRIPTION
+
+ inherit
+ DB_TABLE_DESCRIPTION
+ -- rename
+ -- Tables as Abstract_tables
+ undefine
+ Tables,
+ is_valid_code
+ end
+
+ DB_SPECIFIC_TABLES_ACCESS_USE
+
+ create
+ {DB_SPECIFIC_TABLES_ACCESS} make
+
+ feature -- Access
+
+ Table_name: STRING is ""
+
+ Table_code: INTEGER is
+
+ Attribute_number: INTEGER is
+ -- Number of attributes in the table.
+
+ Id_code: INTEGER is
+ -- Table ID attribute code.
+ do
+ Result :=
+ end
+
+ : INTEGER is
+
+ attribute_code_list: ARRAYED_LIST [INTEGER] is
+ -- Feature code list
+ once
+ create Result.make (Attribute_number)
+ Result.extend ()
+ end
+
+ description_list: ARRAYED_LIST [STRING] is
+ -- Feature name list. Can be interpreted as a list
+ -- or a hash-table.
+ once
+ create Result.make (Attribute_number)
+ Result.extend ("")
+ end
+
+ type_list: ARRAYED_LIST [INTEGER] is
+ -- Feature type list. Can be interpreted as a list
+ -- or a hash-table.
+ once
+ create Result.make (Attribute_number)
+ Result.extend (_type)
+ end
+
+ to_delete_fkey_from_table: HASH_TABLE [INTEGER, INTEGER] is
+ -- List of tables depending on this one and their
+ -- foreign key for this table.
+ -- Deletion on this table may imply deletions on
+ -- depending tables.
+ once
+ end
+
+ to_create_fkey_from_table: HASH_TABLE [INTEGER, INTEGER] is
+ -- List of associated necessary tables and the
+ -- linking foreign keys.
+ -- Creation on this table may imply creations on
+ -- associated necessary tables.
+ once
+ end
+
+ attribute (i: INTEGER): ANY is
+ -- Get feature value of feature whose code is 'i'.
+ do
+ inspect i
+
+ when then
+ Result := .
+
+ end
+ end
+
+ set_attribute (i: INTEGER; value: ANY) is
+ -- Set feature value of feature whose code is `i' to `value'.
+ -- `value' must be of type STRING, INTEGER, BOOLEAN, CHARACTER,
+ -- DOUBLE or DATE_TIME. References are made automatically from
+ -- expanded types.
+ local
+ integer_value: INTEGER_REF
+ double_value: DOUBLE_REF
+ boolean_value: BOOLEAN_REF
+ character_value: CHARACTER_REF
+ date_time_value: DATE_TIME
+ string_value: STRING
+ do
+ inspect i
+
+ when then
+ string_value ?= value
+ .set_ (string_value)
+ when then
+ double_value ?= value
+ if double_value /= Void then
+ .set_ (double_value.item)
+ else
+ .set_ (0.0)
+ end
+
+ when then
+ integer_value ?= value
+ if integer_value /= Void then
+ .set_ (integer_value.item)
+ else
+ .set_ (0)
+ end
+
+ when then
+ date_time_value ?= value
+ .set_ (date_time_value)
+
+ when then
+ character_value ?= value
+ if character_value /= Void then
+ .set_ (character_value.item)
+ else
+ .set_ ('%U')
+ end
+
+ when then
+ boolean_value ?= value
+ if boolean_value /= Void then
+ .set_ (boolean_value.item)
+ else
+ .set_ (False)
+ end
+
+ end
+ end
+
+ feature {} -- Basic operations
+
+ set_ (a_: ) is
+ -- Associate the description to a piece of .
+ require
+ not_void: a_ /= Void
+ do
+ := a_
+ ensure
+ = a_
+ end
+
+ feature {NONE} -- Implementation
+
+ :
+ -- Piece of associated with the description
+
+ end -- class CODES_DESCRIPTION
+
+
+'''Note''': As for the table class generation, the template content can be adjusted, for instance to add comments or change the indexing. However, the fundamental template structure should not be changed.
+
+Some additional tags are directly replaced by the wizard:
+* The and tags are replaced with information on associated tables.
+* The tag is replaced by information on the primary key (table ID).
+* The tag is replaced by the table position in the database.
+
+===2.3.3. Access class===
+
+The DB_SPECIFIC_TABLES_ACCESS class is mapped to the database from the following template:
+
+ indexing
+ description: "Description of database tables.%
+ %Use this class through DB_SPECIFIC_TABLES_ACCESS_USE."
+ author: "EiffelStore Wizard"
+ date: "$Date: 2004-12-09 23:29:16 +0100 (Thu, 09 Dec 2004) $"
+ revision: "$Revision: 46989 $"
+
+ class
+ DB_SPECIFIC_TABLES_ACCESS
+
+ inherit
+ DB_TABLES_ACCESS
+
+ creation
+ make
+
+ feature -- Access
+
+ : INTEGER is
+
+ Table_number: INTEGER is
+
+ code_list: ARRAYED_LIST [INTEGER] is
+ -- Table code list.
+ once
+ create Result.make (Table_number)
+ Result.extend ()
+ end
+
+ name_list: ARRAYED_LIST [STRING] is
+ -- Table name list. Can be interpreted as a list
+ -- or a hash-table.
+ once
+ create Result.make (Table_number)
+ Result.extend ("")
+ end
+
+ obj (i: INTEGER): DB_TABLE is
+ -- Return instance of table with code `i'.
+ do
+ inspect i
+
+ when then
+ create {} Result.make
+
+ end
+ end
+
+ description (i: INTEGER): DB_TABLE_DESCRIPTION is
+ -- Return description of table with code `i'.
+ do
+ inspect i
+
+ when then
+ Result := _description
+
+ end
+ end
+
+ _description: _DESCRIPTION is
+ -- Unique description of table `'.
+ once
+ create Result.make
+ end
+
+
+
+ end -- class DB_SPECIFIC_TABLES_ACCESS
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-generation-cluster/data-structures-use.wiki b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-generation-cluster/data-structures-use.wiki
new file mode 100644
index 00000000..94cc9e12
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-generation-cluster/data-structures-use.wiki
@@ -0,0 +1,223 @@
+[[Property:title|Data structures use]]
+[[Property:weight|0]]
+[[Property:uuid|25885469-d6c8-5d1c-bbf8-c5fca5524d36]]
+==1. Overview==
+
+EiffelStore affords a context that optimizes and facilitates the use of the classes that maps your database content.
+
+The main advantage of database-specific structures is the static checking: you can determine at compile-time the type of information you are accessing or modifying.
+
+However, it can be more flexible to determine the type of data you are dealing with at run-time. This can be particularly useful for GUI applications, take a look at the [[EiffelStore DataView Cluster|DataView cluster]] .
+
+Each data structure carries some meta-data about its type so that the run-time typing hazards can be avoided with assertions based on this meta-data.
+
+The advantage of this system is two-fold:
+* You can choose to use compile-time type checking or not, depending on your own needs.
+* If you choose run-time type checking, assertions ensure that each object type is valid and prevent cat calls.
+
+Let us see first [[#capabilities|what you can do]] with data structures and their context, then [[#implementation|how it is implemented]] .
+
+==2. Data structure capabilities==
+
+Database-specific classes and their context let you perform the following operations:
+* [[#cap_storage|Storing table/view rows content]]
+* [[#cap_manipulation|Manipulating abstract table/view rows content]]
+* [[#cap_objects_metadata|Getting objects metadata]]
+* [[#cap_database_metadata|Accessing database metadata]]
+* [[#cap_more|More interesting features]]
+
+===2.1. Storing table/view rows content===
+
+You can store table/view rows content into classes that have the table or view name: one database table/view row correspond to one Eiffel object. Each table attribute will correspond to a class attribute with the same name. ''set'' commands enable to change the object content to insert rows in the database or update rows. [[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] class can directly map database results into these objects, and you can directly create a table/view row from one object with the [[ref:libraries/store/reference/db_store_flatshort|DB_STORE]] class. Take a look at the [[Data Object Coupling|data-object coupling]] section.
+
+===2.2. Manipulating abstract table/view rows content===
+
+Each table/view storage structure inherits from the [[ref:libraries/store/reference/db_table_flatshort|DB_TABLE]] abstract class. This enables to handle [[ref:libraries/store/reference/db_table_flatshort|DB_TABLE]] objects as abstract database table/view structures.
+
+You can then access or modify [[ref:libraries/store/reference/db_table_flatshort|DB_TABLE]] attributes: instead of accessing attributes with their ''name'', which implies that the object type is known at compile-time, attributes can then be accessed with a ''code''.
+
+ tablerow: DB_TABLE
+ ...
+ display_attribute (code: INTEGER)
+ -- Display attribute with `code'.
+ do
+ io.putstring (tablerow.table_description.attribute (code).out)
+ end
+
+
+{{note|to access attributes data with ''code'', you need to use the [[ref:libraries/store/reference/db_table_description_flatshort|DB_TABLE_DESCRIPTION]] object associated to your [[ref:libraries/store/reference/db_table_flatshort|DB_TABLE]] object. }}
+
+===2.3. Getting objects metadata===
+
+While manipulating
+ set_table_code (code: INTEGER)
+ -- Assign `code' to `tablecode'.
+
+ tablecode: INTEGER
+ -- Table code.
+
+ compute (tablerow: DB_TABLE)
+ -- Compute `tablerow'.
+ require
+ type_is_ok: tablerow.table_description.Table_code = tablecode
+
+
+===2.4. Accessing database metadata===
+
+Basic database metadata is also available: the
+ tables: DB_SPECIFIC_TABLES_ACCESS
+ ...
+ new_object (code: INTEGER): DB_TABLE
+ -- New object of table with `code'.
+ do
+ Result := tables.obj (code)
+ end
+
+
+===2.5. More interesting features===
+
+The
+ row: DB_TABLE
+ description: DB_TABLE_DESCRIPTION
+ ...
+ row := db_manager.database_result
+ description := row.table_description
+
+
+As descriptions are unique, every table row object is associated to the same description. The following figure illustrates this:
+[[Image:table-descr-objects]]
+
+table and description objects relationship
+
+As seen in the previous section, to manipulate abstract table/view rows content, you have to use the description class. The following example shows how to output a table row ID value.
+
+
+ row: DB_TABLE
+ description: DB_TABLE_DESCRIPTION
+ ...
+ -- Link description unique object to `row' content.
+ description := row.table_description
+ io.putstring (description.attribute (description.id_name) + ": ")
+ io.putstring (description.attribute (description.id_code).out)
+
+
+
+As descriptions are unique, this means that description objects are also associated to a specific table object to deal with it (i.e. access or modify its content). Actually, the table_description feature associates the description with the current object and then returns this description.
+
+{{note|The table_description feature is still a query as the association part should not be visible at the interface level. }}
+
+On the whole, you have to pay attention to always execute table_descriptionon your table/view row to get the appropriate description.
+
+==3. Table access classes==
+
+===3.1. Overview===
+
+Table access classes provide facilities to manage table row and table description objects. They also give basic database table meta-data.
+
+The following figure shows table access classes and their relations.
+* Yellow classes are EiffelStore classes
+* Green class is generated
+* Pink class is an application class
+
+[[Image:db-specific-tables-access-use]]
+
+Table access classes BON diagram
+
+[[Image:table-descr-access-objects]]
+
+Relationship between the tables access object, description and table objects
+
+===3.2. DB_SPECIFIC_TABLES_ACCESS class===
+
+The ARRAY [STRING] containing element attribute names and an ARRAY [ANY] containing element attribute values. This solution has one major drawback: any static checking is impossible: the developer cannot be sure at compile time of the nature of a [[ref:libraries/store/reference/db_tuple_flatshort|DB_TUPLE]] , i.e. what it represents, and cannot know if attributes number, names and types are correct. To overcome this problem, a second solution is to use data structures that statically fits to the expected database element, as introduced in the [[Data Object Coupling|DataObject Coupling]] section.
+
+The major problem of this technique is that structures are static: one structure, so one class instead of one object, should be created for each database element.
+
+
+
+
diff --git a/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-implementation-layer.wiki b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-implementation-layer.wiki
new file mode 100644
index 00000000..8f7912a8
--- /dev/null
+++ b/documentation/18.11/solutions/database-access/eiffelstore/eiffelstore-tutorial/eiffelstore-implementation-layer.wiki
@@ -0,0 +1,90 @@
+[[Property:title|EiffelStore Implementation Layer]]
+[[Property:weight|1]]
+[[Property:uuid|80cd0938-6837-3c17-8515-b4ac60a51d09]]
+Each interface class has an implementation counterpart that implements specific DBMS handling. The class prefix indicates clearly its layer, for instance:
+* [[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] is the interface to perform a database selection query.
+* [[ref:libraries/store/reference/database_selection_flatshort|DATABASE_SELECTION]] [ [[ref:libraries/store/reference/database_flatshort|DATABASE]] ] is its implementation.
+
+The abstract [[ref:libraries/store/reference/database_flatshort|DATABASE]] class represents a DBMS, i.e. it is the Eiffel-side database call interface. It is inherited for instance by the instantiable
+ login: LOGIN [DATABASE]
+ -- Session login
+
+
+* Database status information:
+
+ status: DB_STATUS
+ -- Status of active database
+
+
+
+==Association between interface and implementation==
+
+The association between an interface object and its implementation counterpart is done at the interface object creation.
+
+Every interface class inherits from the
+ make
+ -- Create an interface object to change active base.
+ do
+ implementation := handle.database.db_change
+ create ht.make (name_table_size)
+ implementation.set_ht (ht)
+ end
+
+
+==Access to the DBMS call interface==
+
+Every implementation class can access the active database call interface by inheriting from the
+ session_status: DB_STATUS
+ -- A session management object reference.
+
+ ...
+
+ set_base
+ ...
+ update_handle
+ if session_status = Void then
+ create session_status.make
+ end
+ handle.set_status (session_status)
+ ...
+
+
+{{seealso|
+ modification: DB_CHANGE
+ -- Modification tool.
+
+ ...
+
+ create modification.make
+ modification.modify ("Update CONTACTS set Firstname = ' John'")
+
+
+* Commit your changes with your session control:
+
+ session_control: DB_CONTROL
+ -- Session control.
+
+ ...
+
+ session_control.commit
+
+
+{{tip|It is always better to check the database status for errors before committing changes. }}
+
+
+{{seealso|
+ repository: DB_REPOSITORY
+
+ ...
+
+ create repository.make ("CONTACTS")
+ repository.load
+ if repository.exists then
+ ...
+ end
+
+
+
+{{tip|Loading a table description is often a costly operation: table has to be fetched among existing tables then every table column description must be loaded. Hence it is better to store and reuse a repository (maybe with a HASH_TABLE) once it has been loaded. }}
+
+
+Using the table information, [[ref:libraries/store/reference/db_repository_flatshort|DB_REPOSITORY]] then helps generating Eiffel classes mapping relational tables:
+* You can directly use {[[ref:libraries/store/reference/db_repository_flatshort|DB_REPOSITORY]] }.generate_class. Generated class may look like:
+
+class CONTACTS
+
+feature -- Access
+
+ id: INTEGER
+ ...
+feature -- Settings
+
+ set_id (an_id: INTEGER)
+ -- Set an_id to id.
+ do
+ id := an_id
+ end
+ ...
+
+
+
+{{note|The EiffelStore Wizard uses the generation.generator cluster to generate the classes mapped to your database. }}
+
+
+==Inserting data in the database==
+
+[[ref:libraries/store/reference/db_store_flatshort|DB_STORE]] lets you easily insert rows into a table using:
+* the table description provided by [[ref:libraries/store/reference/db_repository_flatshort|DB_REPOSITORY]] .
+* a class mapping the relational table.
+This is straight-forward since you only have to give [[ref:libraries/store/reference/db_store_flatshort|DB_STORE]] the object filled with the table values. Suppose you want to add a contact into your database:
+
+ storage: DB_STORE
+ contacts_rep: DB_REPOSITORY
+ a_contact: CONTACTS
+
+ ...
+
+ create storage.make
+ -- contacts_rep is loaded and exists.
+ storage.set_repository (contacts_rep)
+ -- a_contact carries values to insert into the database.
+ storage.put (a_contact)
+
+
+==Accessing database content with Eiffel objects==
+
+[[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] lets you map data retrieved from the database into Eiffel objects: Result column names must match object attributes names so you can use for instance classes created by [[ref:libraries/store/reference/db_repository_flatshort|DB_REPOSITORY]] . Class
+ selection: DB_SELECTION
+ list_filling: DB_ACTION [CONTACTS]
+ contact: CONTACTS
+
+ ...
+
+ selection.object_convert (contact)
+ create list_filling.make (selection, contact)
+ selection.set_action (list_filling)
+ ...
+ selection.load_result
+ if selection.is_ok then
+ Result := list_filling.list
+ end
+
+
+
+{{note|You can see how actions are used in [[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] . }}
+
+ database_appl: DATABASE_APPL [ODBC]
+ -- Database handle.
+
+ ...
+
+ create database_appl.login (a_name, a_psswd)
+ database_appl.set_base
+
+
+ session_control: DB_CONTROL
+ -- Session control.
+
+ ...
+
+ create session_control.make
+ session_control.connect
+
+
+{{note|Take a look at the [[Database control|database control]] part to see how to use
+ session_control: DB_CONTROL
+
+ ...
+
+ session_control.connect
+ if session_control.is_connected then
+ -- Perform your transactions here.
+ session_control.disconnect
+ end
+
+
+==Committing changes in the database==
+
+With many database systems, modifications you make to the database are usually not saved immediately. Rather, changes are accumulated in a "transaction". At some point the entire transaction is committed to the database (i.e., the changes are actually made to the data) or the entire transaction is rolled back (i.e., absolutely no changes are made to the data.) You can manage database modification through 2 commands:
+* ''Commit'' saves the changes in the database.
+* ''Rollback'' restores the database content to its state after the most recent commit.
+
+The following example illustrates the use of these commands:
+
+ session_control: DB_CONTROL
+
+ ...
+
+ from
+ until
+ transaction_completed or else not session_control.is_ok
+ loop
+ -- Perform your transaction here.
+ end
+ if session_control.is_ok then
+ session_control.commit
+ else
+ session_control.rollback
+ end
+
+
+The loop performs a multi-step transaction. If transaction is not carried out entirely, the database could stay in an invalid state: this code ensures that database remains in a valid state.
+
+{{caution|Some databases can be in an auto-commit mode. Furthermore, some special database commands can automatically commit database changes. }}
+
+{{seealso|
+ selection: DB_SELECTION
+ -- Selection tool
+
+ ...
+
+ create selection.make
+ selection.set_query ("select * from CONTACTS where firstname = 'John'") -- Set query text
+ selection.execute_query -- Execute query
+
+ ... -- Process query results
+
+ selection.terminate -- Clear database cursor
+
+
+
+{{tip|{DB_SELECTION}.terminate to free resources from a completed query. }}
+
+* You can also customize your selection using [[Query variables|bind variables]] .
+
+{{seealso|
+ selection: DB_SELECTION
+ Bind_var: STRING = "firstname"
+
+ ...
+
+ create selection.make
+ selection.set_query ("Select * from CONTACTS where Firstname = ':" + Bind_var + "'")
+
+
+{{note|The code example shows how to bind variables to a [[ref:libraries/store/reference/db_selection_chart|DB_SELECTION]] object but the mechanism is exactly the same for [[ref:libraries/store/reference/db_change_chart|DB_CHANGE]] objects. }}
+
+==Binding variables to a query==
+
+Once you have created your query, you can map variable names to values and execute the query:
+
+ selection: DB_SELECTION
+ Bind_var: STRING is "firstname"
+
+ ...
+
+ loop
+ io.read_line
+ selection.set_map_name (io.laststring, Bind_var)
+ selection.execute_query
+ ...
+ selection.unset_map_name (Bind_var)
+ end
+
+
+{{seealso|
+ selection: DB_SELECTION
+ my_result: DB_RESULT
+
+ ...
+
+ selection.query ("...")
+ if selection.is_ok then
+ selection.load_result
+ my_result := selection.cursor
+ end
+
+
+* You want to load a '''complete list''' of rows: [[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] can store [[ref:libraries/store/reference/db_result_flatshort|DB_RESULT]] objects in a list. To do this, you have mainly to provide a LIST object to DB_SELECTION with set_container:
+
+ selection: DB_SELECTION
+ container: ARRAYED_LIST [DB_RESULT]
+
+ ...
+
+ create container.make (Max_results)
+ ...
+ selection.set_container (container)
+ selection.load_result
+ ...
+ from
+ container.start
+ until
+ container.after
+ loop
+ ...
+ end
+
+
+{{tip|Provide [[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] with the LIST structure convenient for what you need to do with the results. }}
+
+* You want to '''select part''' of the result set: you can set an action in [[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] that will be executed each time a row is loaded. This action can for instance manipulate current row and define a stop condition.
+** You need to define a descendant of class ACTION and set it to [[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] :
+
+class
+ MY_ACTION
+inherit
+ ACTION
+ redefine
+ execute, found
+ end
+
+ ...
+
+ execute
+ do
+ i := i + 1
+ end
+
+ ...
+
+ found: BOOLEAN
+ do
+ Result := i >= Max_result
+ end
+
+** Then set action to [[ref:libraries/store/reference/db_selection_flatshort|DB_SELECTION]] :
+
+ selection: DB_SELECTION
+ action: MY_ACTION
+
+ ...
+
+ selection.set_action (action)
+ selection.query ("...")
+ if selection.is_ok then
+ selection.load_result
+ end
+
+
+
+
+==Accessing content of DB_RESULT==
+
+A DB_RESULT object merely carries data retrieved from the database. You have to convert it to a DB_TUPLE to access data within the retrieved row conveniently, i.e. mostly the column values:
+
+ selection: DB_SELECTION
+ tuple: DB_TUPLE
+
+ ...
+
+ create tuple.make_from_cursor (selection.cursor)
+ if tuple.count >= 2 and then tuple.column_name (2).is_equal ("Firstname") then
+ io.putstring (tuple.item (2).out)
+ end
+
+
+
+{{seealso|
+ procedure: DB_PROC
+
+ ...
+
+ create procedure.make ("UPDATE")
+ procedure.load
+ if procedure.exists then
+ ...
+ end
+
+
+* Execute the procedure through a [[ref:libraries/store/reference/db_selection_chart|DB_SELECTION]] (if a result is expected) or a [[ref:libraries/store/reference/db_change_chart|DB_CHANGE ]] object (otherwise).
+
+{{note|Requests with a result ([[ref:libraries/store/reference/db_selection_chart|DB_SELECTION]] ) or without ([[ref:libraries/store/reference/db_change_chart|DB_CHANGE]] ) are both abstract '''expressions'''. DB_PROC executes an abstract expression using an object of [[ref:libraries/store/reference/db_expression_chart|DB_EXPRESSION]] type, which corresponds to an abstract expression. [[ref:libraries/store/reference/db_selection_chart|DB_SELECTION]] and [[ref:libraries/store/reference/db_change_chart|DB_CHANGE]] inherits from [[ref:libraries/store/reference/db_expression_chart|DB_EXPRESSION]] . }}
+
+You can execute your request mostly like a basic one:
+** Create your request.
+** Bind request variables. Variables are stored procedure arguments.
+
+{{note|Take a look at how to [[Query variables|bind variables]] to a query. }}
+
+** Execute the query through the DB_PROC object.
+
+ procedure: DB_PROC
+ expr: DB_CHANGE
+
+ ...
+
+ procedure.execute (expr)
+ expr.clear_all
+
+
+** Check for errors and load result if any.
+
+
+==Creating a stored procedure==
+
+DB_PROC also enables you to create or drop stored procedures:
+* Use store to create a procedure.
+* Use drop to delete one.
+The following example shows how to overwrite a procedure in the database:
+
+ procedure: DB_PROC
+
+ ...
+
+ create procedure.make ("NEW_PROCEDURE")
+ procedure.load
+ if procedure.exists then
+ procedure.drop
+ end
+ procedure.load
+ if not procedure.exists then
+ procedure.set_arguments (<<"one_arg">>, <<"">>)
+ procedure.store ("update contacts set firstname = one_arg where contactid = 1")
+ end
+
+
+
+{{seealso|<, <=, >, and >= are available on instances of [[ref:libraries/time/reference/absolute_chart|ABSOLUTE]] and its descendants.
+
+==TIME==
+
+[[ref:libraries/time/reference/time_chart|TIME]] models times of day, supporting queries: <, <=, >, and >= are available for ordering instances. Function <, <=, >, and >= are available for ordering instances by value. Function <, <=, >, and >= are available for ordering instance by value. Function
+03 FEB 2008
+
+
+
+The following table lists format conversion codes.
+{|
+|-
+| '''Code'''
+| '''Description'''
+|-
+| dd
+| day - numeric
+|-
+| <, >, <=, and >= are available. The > or <) is applied in a state in which either the current instance or the argument or both are relative durations, the result will be always <, >, <=, and >= are available. If both instances are definite, numbers of days are compared. If one of them is non-definite, the result is False.
+
+====Element change====
+
+Features <, >, <=, and >= are available. If both instances are definite, numbers of days are compared. If one of them is non-definite, the result is False.
+
+====Element change====
+
+It is possible to change reference of time and date with the features
+ modify_button_text: STRING
+ -- `Result' is STRING constant named modify_button_text.
+ once
+ Result := "Modify"
+ end
+
+
+
+==Integer constant==
+
+A Integer constant represents an Eiffel INTEGER, and may be any valid INTEGER value. For example, in the generated constants file, for an Integer constant named `medium_padding`, the following code is generated:
+
+ medium_padding: INTEGER
+ -- `Result' is INTEGER constant named medium_padding.
+ once
+ Result := 8
+ end
+
+==Directory constant==
+
+A Directory constant is an Eiffel representation of a directory, as a STRING value. For example, in the generated constants file, for a Directory constant named `pixmap_location`, the following code is generated:
+
+ pixmap_location: STRING
+ -- `Result' is DIRECTORY constant named pixmap_location.
+ once
+ Result := "C:\pixmaps"
+ end
+
+
+==Pixmap constant==
+
+A pixmap constant is a representation of a pixmap image, and two types are available:
+* '''Absolute''' - The generated code contains a constant of type EV_PIXMAP, built from a single, absolute path, based on the location of the original pixmap on disk as follows:
+
+ main_pixmap: EV_PIXMAP
+ -- `Result' is PIXMAP constant named main_pixmap.
+ local
+ a_file_name: FILE_NAME
+ once
+ create Result
+ create a_file_name.make_from_string ("C:\pixmaps\main_pixmap.png")
+ -- Now set `Result' based on `a_file_name'.
+ set_with_named_file(Result, a_file_name)
+ end
+
+* '''Relative''' - The generated code contains a constant of type EV_PIXMAP, built from a file name and a directory constant. This type of pixmap constant is the most frequently used, as it is more flexible. By redefining the value of the directory constant on which it is based, your systems may easily account for the installation location of the pixmap. A relative Pixmap constant is generated as follows:
+
+ main_pixmap: EV_PIXMAP
+ -- `Result' is PIXMAP constant named main_pixmap.
+ local
+ a_file_name: FILE_NAME
+ once
+ create Result
+ create a_file_name.make_from_string (pixmap_location)
+ a_file_name.set_file_name("main_pixmap.png")
+ -- Now set `Result' based on `a_file_name'.
+ set_with_named_file(Result, a_file_name)
+ end
+
+Where `pixmap_location` is the name of the Directory constant to which the pixmap is relative.
+
+
+==Font constant==
+
+A Font constant represents an EV_FONT. For example, in the generated constants file, for a font constant named `times_new_roman`, the following code is generated:
+
+ times_new_roman: EV_FONT
+ -- `Result' is EV_FONT constant named `times_new_roman'.
+ once
+ create Result
+ Result.set_family (feature {EV_FONT_CONSTANTS}.Family_roman)
+ Result.set_weight (feature {EV_FONT_CONSTANTS}.Weight_regular)
+ Result.set_shape (feature {EV_FONT_CONSTANTS}.Shape_regular)
+ Result.set_height_in_points (12)
+ Result.preferred_families.extend ("Times New Roman")
+ end
+
+==Color constant==
+
+A Color constant represents an EV_COLOR. For example, in the generated constants file, for a color constant named `red`, the following code is generated:
+
+ red: EV_COLOR
+ -- `Result' is EV_COLOR constant named `red'.
+ once
+ Result := create {EV_COLOR}.make_with_8_bit_rgb (255, 0, 0)
+ end
+
+===Pixmap constant dialog===
+
+The Pixmap Constant dialog is used to select pixmaps for addition to an EiffelBuild project, and is displayed from the Constants dialog when necessary. The Pixmap Constant dialog has the following appearance:
+
+[[Image:pixmap-selection-dialog]]
+
+An individual pixmap may be selected, or a whole directory of pixmaps may be selected from this dialog for addition. In the screenshot above, a directory containing two pixmaps was selected. The "Build from" option at the bottom of the dialog permits you to select if you wish to add an absolute or relative pixmap, and if multiple pixmaps are being added, the currently selected pixmap from the list above is active. The relative "DIRECTORY" for relative pixmaps is filled in automatically if EiffelBuild finds a directory constant in the system that matches the path chosen. If not, you may enter a name in this field to create a new directory matching the required path. If you do not enter a directory name for one or more relative pixmaps, upon closing the dialog, you will be prompted to enter a name for a directory constant used for these pixmaps.
+{{note|If you are selecting new pixmaps, and they appear in the dialog as unchecked, it means that an equivalent pixmap already exists in the project. }}
+
+
+==Loading constants==
+
+The generation of an EiffelBuild project creates two constants classes, an interface class and an implementation class, named to match the setting from the [[EiffelBuild: Project settings window|project settings]] . For example, if you have specified the name "constants" for the constants, two classes are generated,
+ create_interface_objects
+ --
+ do
+ create actions
+ end
+
+ create_implementation
+ -- Create implementation of timeout.
+ do
+ create {EV_TIMEOUT_IMP} implementation.make
+ end
+
+
+
+==Inheritance from an Implementation Interface Class with Associating Interface Class==
+
+If you have an existing, custom platform-dependent implementation, a few more changes will be needed above and beyond those required for the interface class.
+
+For interface class changes, now the interface object is passed to the implementation after creation, via
+ make (an_interface: like interface)
+ -- Create `Current' with interface `an_interface'.
+ do
+ base_make (an_interface)
+ wel_make (default_parent, "", 0, 0, 0, 0, 0)
+ extra_width := 20
+ text_alignment := default_alignment
+ -- Retrieve the theme for the button.
+ open_theme := application_imp.theme_drawer.open_theme_data (wel_item, "Button")
+ end
+
+ initialize
+ -- Initialize `Current'.
+ do
+ Precursor {EV_PRIMITIVE_IMP}
+ set_default_font
+ end
+
+ interface: EV_BUTTON;
+
+
+would become:
+
+
+ make
+ -- Initialize `Current'.
+ do
+ wel_make (default_parent, "", 0, 0, 0, 0, 0)
+ extra_width := 20
+ text_alignment := default_alignment
+ -- Retrieve the theme for the button.
+ open_theme := application_imp.theme_drawer.open_theme_data (wel_item, "Button")
+ Precursor {EV_PRIMITIVE_IMP}
+ set_default_font
+ end
+
+ interface: detachable EV_BUTTON note option: stable attribute end;
+
+
+The following steps are needed during the conversion:
+
+* The attribute
+ text: STRING
+
+ set_text (a_text: STRING)
+ ...
+ do
+ ...
+ end
+
+
+Boolean properties have a different convention. Instead of one set-routine, it has one enable-routine and one disable-routine. The first one sets the property to true, and the second to false. This has been done this way because sometimes these enable/disable features have trivial equivalents, for example for feature `enable_visible` a clearer name is `show`.
+
+ is_sensitive: BOOLEAN
+
+ enable_sensitive
+ ...
+ do
+ ...
+ end
+
+
+ disable_sensitive
+ ...
+ do
+ ...
+ end
+
+
+
+==Implementation==
+
+For flexibility, EiffelVision 2 is built using the bridge pattern. This means that every platform-dependent component of the library consist of two classes, plus an implementation class for each platform (currently two). One is the select_actions action sequence. This gets fired when the user selects (clicks) the button. To have a procedure called on this event, you need to create an agent based on this procedure, and then add this to the action sequence (via extend). For a more detailed description of agents and their uses click [[ET: Agents|here]] .
+
+An example of adding an agent to an action_sequence:
+
+ my_button.select_actions.extend (agent print ("Button Clicked!%N"))
+
+
+All EiffelVision 2 action sequences inherit from [[ref:libraries/vision2/reference/ev_action_sequence_chart|EV_ACTION_SEQUENCE]] and when it is called, all of the agents held within are fired, thus calling all of the procedures represented by the agents. The signature of any agent that you place in an action sequence must conform to those of the action sequence's actual generic parameter(s).
+
+When you want an agent to be called from a certain action sequence and the signatures do not match, you may use [[ref:libraries/vision2/reference/ev_action_sequence_chart|force_extend]] . This will call your agent but there are no guarantees as to the arguments passed to your procedure.
+
+
+
diff --git a/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/figures.wiki b/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/figures.wiki
new file mode 100644
index 00000000..e55d176d
--- /dev/null
+++ b/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/figures.wiki
@@ -0,0 +1,166 @@
+[[Property:title|Figures]]
+[[Property:weight|7]]
+[[Property:uuid|c12fee6e-5e99-ae59-8ac5-f57abb4c1878]]
+{{ReviewRequested}}
+
+
+The EiffelVision 2 figure cluster provides a high-level way of drawing on an [[ref:libraries/vision2/reference/ev_drawable_chart|EV_DRAWABLE]] descendant. It offers a number of advantages:
+* The model (tree of figures) is separated from the graphical representation by using projectors that take a "world" (an entire set of figures) and project it onto any device, not just a drawing area.
+* Instead of drawing with static APIs like draw_line, you can use real figure objects, which internally remember their location, rotation and scaling; later on you can perform limitless transformations on them, either individually or as part of an entire branch in the tree of figures: move, rotation, scaling, change of color...
+* For projection devices that support the mouse, pointer events propagate to the affected figures.
+
+
+==Figure Classes==
+
+Every basic figure class inherits from [[ref:libraries/vision2/reference/ev_atomic_figure_chart|EV_ATOMIC_FIGURE]]. An atomic figure has the property of having its own graphical representation. [[ref:libraries/vision2/reference/ev_figure_group_chart|EV_FIGURE_GROUP]] on the other hand is a collection of figures. Finally, [[ref:libraries/vision2/reference/ev_figure_chart|EV_FIGURE]] is the common ancestor to those two. Since [[ref:libraries/vision2/reference/ev_figure_group_chart|EV_FIGURE_GROUP]] is a collection of EV_FIGUREs, it can contain both atomic figures and subgroups, thus forming a tree of figures.
+
+Any "branch" of that tree that wishes to be drawn (i.e. rendered to a device or file) (especially the top-level root) must be a figure group of type [[ref:libraries/vision2/reference/ev_figure_world_chart|EV_FIGURE_WORLD]]. It inherits from [[ref:libraries/vision2/reference/ev_figure_group_chart|EV_FIGURE_GROUP]], and adds some features for grid and background color, required for drawing.
+
+===Figures===
+
+{| border="1"
+|-
+| class
+| open/closed
+| points
+| description
+|-
+| [[ref:libraries/vision2/reference/ev_figure_arc_chart|EV_FIGURE_ARC]]
+| open
+| 2
+| a segment of an open ellipse
+|-
+| [[ref:libraries/vision2/reference/ev_figure_dot_chart|EV_FIGURE_DOT]]
+| open
+| 1
+| a single point
+|-
+| [[ref:libraries/vision2/reference/ev_figure_ellipse_chart|EV_FIGURE_ELLIPSE]]
+| closed
+| 2
+| an ellipse inside imaginary rectangle
+|-
+| [[ref:libraries/vision2/reference/ev_figure_equilateral_chart|EV_FIGURE_EQUILATERAL]]
+| closed
+| 2
+| a figure with any number of sides of the same length
+|-
+| [[ref:libraries/vision2/reference/ev_figure_line_chart|EV_FIGURE_LINE]]
+| open
+| 2
+| a straight line between two points
+|-
+| [[ref:libraries/vision2/reference/ev_figure_picture_chart|EV_FIGURE_PICTURE]]
+| open
+| 1
+| an image positioned by its top-left point
+|-
+| [[ref:libraries/vision2/reference/ev_figure_pie_slice_chart|EV_FIGURE_PIE_SLICE]]
+| closed
+| 2
+| a part of a closed ellipse
+|-
+| [[ref:libraries/vision2/reference/ev_figure_polygon_chart|EV_FIGURE_POLYGON]]
+| closed
+| *
+| a figure defined by any number of points
+|-
+| [[ref:libraries/vision2/reference/ev_figure_polyline_chart|EV_FIGURE_POLYLINE]]
+| open
+| *
+| a figure consisting of any number of connecting lines
+|-
+| [[ref:libraries/vision2/reference/ev_figure_rectangle_chart|EV_FIGURE_RECTANGLE]]
+| closed
+| 2
+| a figure with four sides
+|-
+| [[ref:libraries/vision2/reference/ev_figure_star_chart|EV_FIGURE_STAR]]
+| open
+| 2
+| any number of lines emerging from a center point
+|-
+| [[ref:libraries/vision2/reference/ev_figure_text_chart|EV_FIGURE_TEXT]]
+| open
+| 1
+| a string positioned by its top-left point displayed in the specified font
+|}
+
+
+A closed figure is a figure that has some area enclosed when drawn that can optionally be filled with a color. Closed figures inherit [[ref:libraries/vision2/reference/ev_closed_figure_chart|EV_CLOSED_FIGURE]] which gives them the property fill_color. Open figures inherit [[ref:libraries/vision2/reference/ev_atomic_figure_chart|EV_ATOMIC_FIGURE]] directly, as does [[ref:libraries/vision2/reference/ev_closed_figure_chart|EV_CLOSED_FIGURE]].
+
+===Points===
+
+Central in the design of the figures are points. Figures are defined from their points. For example, an ellipse is not a center point with two radii, but is instead the largest fitting ellipse inside an imaginary rectangle, so of two points.
+
+As you can see in the table above, each figure has a certain number of points. These values can be 1, 2 or * (any number). For each value there is a class the figure inherits from. These are:
+* 1 (figure has one point): [[ref:libraries/vision2/reference/ev_single_pointed_figure_chart|EV_SINGLE_POINTED_FIGURE]].
+* 2 (figure has two points): [[ref:libraries/vision2/reference/ev_double_pointed_figure_chart|EV_DOUBLE_POINTED_FIGURE]].
+* * (figure has zero or more points): [[ref:libraries/vision2/reference/ev_multi_pointed_figure_chart|EV_MULTI_POINTED_FIGURE]].
+
+These classes offer features to handle the given number of points. [[ref:libraries/vision2/reference/ev_single_pointed_figure_chart|EV_SINGLE_POINTED_FIGURE]] offers the feature:
+
+
+ point: EV_RELATIVE_POINT
+
+
+[[ref:libraries/vision2/reference/ev_double_pointed_figure_chart|EV_DOUBLE_POINTED_FIGURE]] inherits [[ref:libraries/vision2/reference/ev_single_pointed_figure_chart|EV_SINGLE_POINTED_FIGURE]] for its first point, which is renamed to
+ point_a: EV_RELATIVE_POINT
+ point_b: EV_RELATIVE_POINT
+
+
+[[ref:libraries/vision2/reference/ev_multi_pointed_figure_chart|EV_MULTI_POINTED_FIGURE]] internally holds an array of points:
+
+
+ i_th_point (i: INTEGER): EV_RELATIVE_POINT
+
+
+===Relative Point===
+
+The points that the figures use are of type [[ref:libraries/vision2/reference/ev_relative_point_chart|EV_RELATIVE_POINT]]. Each point is relative to the location of the parent figure group (point), which is relative to the location of its parent figure group, and so on up to the top-level (world) figure group. Thus, each figure is defined by a set of relative points and a reference point (origin). If the reference point is not attached (as may be the case for immediate children of the top-level group, when it has no point object), the subordinate relative points are relative to point (0,0). The absolute coordinates are calculated only when needed by adding the absolute coordinates of the reference point to the relative coordinates.
+
+{{note|Even the top-level (world) figure group can be "moved" by calling its set_point feature, passing a new relative point. However, if this is done, then THAT relative point is relative to point (0,0). If you do this, do so before extend-ing it with figures and sub-groups so that they receive the point in question as their reference point.}}
+
+
+==Figure Worlds==
+
+In order to put the figures you want to display in a context, you insert them (or the figure groups that contain them) into a top-level a "figure world" object: an instance of [[ref:libraries/vision2/reference/ev_figure_world_chart|EV_FIGURE_WORLD]]. This is a descendant of [[ref:libraries/vision2/reference/ev_figure_group_chart|EV_FIGURE_GROUP]] and hence works in the same way. This figure world is later associated with one or more projectors. [[ref:libraries/vision2/reference/ev_figure_world_chart|EV_FIGURE_WORLD]], as previously mentioned, adds a number of features to [[ref:libraries/vision2/reference/ev_figure_group_chart|EV_FIGURE_GROUP]]. These extra features are needed for graphical representation by a projector. One is the background color. This feature is used to erase the canvas for a graphical projector in the specified color. The other features are to manage the grid.
+
+
+==Projectors==
+
+A projector is an object that knows what a figure world should look like. The figure world itself is only a hint of its representation. For example, if a line is "20" long, this might mean 20 pixels, miles, centimeters or whatever. It is up to the projector to interpret units. Also, color might be interpreted as gray scale. Typically, a projector will do the best possible job projecting the "world" of figures onto its device.
+
+With EiffelVision come these projectors:
+* [[ref:libraries/vision2/reference/ev_postscript_projector_chart|EV_POSTSCRIPT_PROJECTOR]]
+* [[ref:libraries/vision2/reference/ev_drawing_area_projector_chart|EV_DRAWING_AREA_PROJECTOR]]
+* [[ref:libraries/vision2/reference/ev_pixmap_projector_chart|EV_PIXMAP_PROJECTOR]]
+The first one maps figure worlds to a postscript file. The other two are descendants of [[ref:libraries/vision2/reference/ev_widget_projector_chart|EV_WIDGET_PROJECTOR]], and can project on widgets that inherit from [[ref:libraries/vision2/reference/ev_drawable_chart|EV_DRAWABLE]], two of which are [[ref:libraries/vision2/reference/ev_drawing_area_chart|EV_DRAWING_AREA]] and [[ref:libraries/vision2/reference/ev_pixmap_chart|EV_PIXMAP]], eventually using double-buffering, which normally results in a smoother animation but requires fast copying from memory to the video buffer (and thus can be slow if the display is remote).
+
+
+==Events==
+
+The other features of drawing area and widget is that they generate pointer events. These events are translated by projectors to the map of the figure world. These projectors send the event to the appropriate figure. Every figure is set up to receive all the common pointer events, including Pick-and-Drop events:
+* point of an [[ref:libraries/vision2/reference/ev_figure_group_chart|EV_FIGURE_GROUP]], which rotation and/or scaling will then propagate down the tree to all the contained figures and sub-groups, by way of something like set_menu_bar):
+** [[ref:libraries/vision2/reference/ev_menu_bar_chart|EV_MENU_BAR]] accepts items of type:
+*** [[ref:libraries/vision2/reference/ev_menu_chart|EV_MENU]] accepts items of type:
+**** [[ref:libraries/vision2/reference/ev_menu_chart|EV_MENU]]
+**** [[ref:libraries/vision2/reference/ev_menu_item_chart|EV_MENU_ITEM]]
+**** [[ref:libraries/vision2/reference/ev_menu_separator_chart|EV_MENU_SEPARATOR]]
+**** [[ref:libraries/vision2/reference/ev_radio_menu_item_chart|EV_RADIO_MENU_ITEM]]
+**** [[ref:libraries/vision2/reference/ev_check_menu_item_chart|EV_CHECK_MENU_ITEM]]
+
+* [[ref:libraries/vision2/reference/ev_multi_column_list_chart|EV_MULTI_COLUMN_LIST]] accepts items of type:
+** [[ref:libraries/vision2/reference/ev_multi_column_list_row_chart|EV_MULTI_COLUMN_LIST_ROW]]
+
+* [[ref:libraries/vision2/reference/ev_tool_bar_chart|EV_TOOL_BAR]] accepts items of type:
+** [[ref:libraries/vision2/reference/ev_tool_bar_button_chart|EV_TOOL_BAR_BUTTON]]
+** [[ref:libraries/vision2/reference/ev_tool_bar_radio_button_chart|EV_TOOL_BAR_RADIO_BUTTON]]
+** [[ref:libraries/vision2/reference/ev_tool_bar_separator_chart|EV_TOOL_BAR_SEPARATOR]]
+** [[ref:libraries/vision2/reference/ev_tool_bar_toggle_button_chart|EV_TOOL_BAR_TOGGLE_BUTTON]]
+
+* EV_TREE accepts items of type:
+** [[ref:libraries/vision2/reference/ev_dynamic_tree_item_chart|EV_DYNAMIC_TREE_ITEM]] accepts items of type:
+*** [[ref:libraries/vision2/reference/ev_dynamic_tree_item_chart|EV_DYNAMIC_TREE_ITEM]]
+*** [[ref:libraries/vision2/reference/ev_tree_item_chart|EV_TREE_ITEM]]
+** [[ref:libraries/vision2/reference/ev_tree_item_chart|EV_TREE_ITEM]] accepts items of type:
+*** [[ref:libraries/vision2/reference/ev_dynamic_tree_item_chart|EV_DYNAMIC_TREE_ITEM]]
+*** [[ref:libraries/vision2/reference/ev_tree_item_chart|EV_TREE_ITEM]]
+
diff --git a/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/kernel.wiki b/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/kernel.wiki
new file mode 100644
index 00000000..b115ed4f
--- /dev/null
+++ b/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/kernel.wiki
@@ -0,0 +1,93 @@
+[[Property:title|Kernel]]
+[[Property:weight|1]]
+[[Property:uuid|d830dc77-cd77-1f52-0e39-e0ec1cffa028]]
+The kernel cluster contains classes that provide functionality common to most Windowed application. These classes are considered the core of any EiffelVision 2 application. The most important of these classes is [[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]]. This class is used to initialize the graphical toolkit and event loop of your EiffelVision 2 application. Kernel also includes classes such as [[ref:libraries/vision2/reference/ev_timeout_chart| EV_TIMEOUT]] that calls procedures (via agents) at specified intervals, and [[ref:libraries/vision2/reference/ev_color_chart| EV_COLOR]] which is used for coloring widgets and items. To start programming with EiffelVision 2, you first have to correctly initialize [[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]].
+
+
+==Launching Your Application with EV_APPLICATION — The Heart of All EiffelVision 2 Systems==
+
+[[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]] is the basis for every EiffelVision 2 application and is considered the most important class in the library. It is responsible for initializing the underlying toolkit that is driving the windowing system on the platform that you compile your system on. It is also where the main event loop that drives your application is executed.
+
+{{note|It is an '''error''' to attempt to create any EiffelVision 2 components before the application object has been created (see the Flat Contracts view of [[ref:libraries/vision2/reference/ev_environment_chart|EV_ENVIRONMENT]]). }}
+
+You may inherit [[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]] or use it as a client in order to create your EiffelVision 2 application. A simple method of using EV_APPLICATION is as follows:
+
+# Create an instance of EV_APPLICATION.
+# Create one or more windows for your application.
+# Launch the application.
+
+An example of an EiffelVision 2 application using inheritance from [[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]] is shown below.
+
+
+class
+ HELLOWORLD_APP
+
+inherit
+ EV_APPLICATION
+
+create
+ make
+
+feature
+
+ make
+ -- Create the application.
+ local
+ helloworld_window: EV_TITLED_WINDOW
+ do
+ default_create
+ create helloworld_window
+ helloworld_window.set_title ("Helloworld!")
+ helloworld_window.close_request_actions.extend (agent destroy)
+ helloworld_window.show
+ launch
+ end
+
+end
+
+
+The following EiffelVision 2 application functions identically, but instead of inheriting from [[ref:libraries/vision2/reference/ev_application_chart|EV_APPLICATION]], it is used in a client/supplier relationship.
+
+
+class
+ HELLOWORLD_APP
+
+create
+ make
+
+feature
+
+ make
+ -- Create the EiffelVision 2 application with a helloworld window.
+ local
+ app: EV_APPLICATION
+ helloworld_window: EV_TITLED_WINDOW
+ do
+ create app
+ create helloworld_window
+ helloworld_window.set_title ("Helloworld!")
+ helloworld_window.close_request_actions.extend (agent app.destroy)
+ helloworld_window.show
+ app.launch
+ end
+
+end
+
+
+
+==What Does Launch Actually Do?==
+
+In EiffelVision 2, to launch an application means to pass control to the underlying graphical toolkit. Simply creating an application does not launch it. An explicit call to
+ button1.set_pebble ("A PND transport has occured%N")
+ button2.drop_actions.extend (agent print (?))
+
+
+Because drop_actions list to which the '''pebble''' [[uuid:b8c10baa-4f50-adfe-a6f8-9cb56a8f1917#Conformance|conforms]].}}
+
+
+==Three Different Modes of Transport==
+
+There are three different modes of transport available for pick and drop. They are listed below with details of their use:
+* Pick and Drop Mode.
+ add_to_container
+ -- Add 3 buttons to a hbox and then show in window.
+ local
+ my_window: EV_TITLED_WINDOW
+ my_hbox: EV_HORIZONTAL_BOX
+ my_button: EV_BUTTON
+ do
+ create my_window
+ create my_hbox
+ create my_button.make_with_text ("Button1")
+ my_hbox.extend (my_button)
+ my_hbox.extend (create {EV_BUTTON}.make_with_text ("Button2"))
+ my_hbox.extend (create {EV_BUTTON}.make_with_text ("Button3"))
+ my_window.extend (my_hbox)
+ my_window.show
+ end
+
+
+The mapping of a EiffelVision 2 container interface is very close to that of containers in [[EiffelBase]], such as a linked list.
+* To add a widget to a container call extend.
+* To remove a widget from the container call prune.
+* To empty a container call wipe_out.
+* To traverse the container, you can use features such as start, forth, item, and off.
+
+{{note|When a widget is added to a container, the container is the parent of the widget. }}
+
+
+==Size of a Widget Within a Container==
+
+The size of a widget in a container is always at least its minimum size. By default, when a widget is added to a container it is expandable. This means that if the container gets bigger, the widget will expand to fit the extra space. This convenient functionality means that you don't have to worry about handling the size of the widget (such as when a user alters the size of a window) as this is all performed automatically. If, on the other hand, you decide you want the widget to remain at a certain size (its minimum size), [[ref:libraries/vision2/reference/ev_box_chart| EV_BOX]] (and therefore its descendants) contain the convenient call disable_item_resize.
+
+
+==Sizing of Containers==
+
+Since [[ref:libraries/vision2/reference/ev_container_chart|EV_CONTAINER]] inherits from type [[ref:libraries/vision2/reference/ev_widget_chart|EV_WIDGET]], the following facilities are provided for setting the minimum size: set_minimum_width, set_minimum_height and set_minimum_size. It is important to remember that as a general rule, '''the current size of a container is always at least the minimum size of all its contents.'''
+
+{{note|The exception to this is: [[ref:libraries/vision2/reference/ev_fixed_chart|EV_FIXED]], [[ref:libraries/vision2/reference/ev_viewport_chart|EV_VIEWPORT]], and [[ref:libraries/vision2/reference/ev_scrollable_area_chart|EV_SCROLLABLE_AREA]] which do actually allow their contents to be larger than their current size.}}
+
+
+
diff --git a/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/widgets/eiffelvision-dialogs.wiki b/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/widgets/eiffelvision-dialogs.wiki
new file mode 100644
index 00000000..f8cba2a5
--- /dev/null
+++ b/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/widgets/eiffelvision-dialogs.wiki
@@ -0,0 +1,32 @@
+[[Property:title|EiffelVision Dialogs]]
+[[Property:weight|2]]
+[[Property:uuid|85cfcfd3-a46e-4e2e-330a-61c2d1579b0f]]
+This cluster contains all the dialogs provided by EiffelVision 2.
+
+==Standard Dialog Boxes==
+
+A standard dialog box provides a way of interacting with the underlying platform (such as Windows or Linux) to perform basic tasks such as opening a file or printing a document. EiffelVision 2 provides six standard dialogs that allow the user to perform common tasks. They are:
+* [[ref:libraries/vision2/reference/ev_color_dialog_chart|EV_COLOR_DIALOG]] — allows the user to select an RGB color (useful for graphical apps such as a Paint Program).
+* [[ref:libraries/vision2/reference/ev_directory_dialog_chart|EV_DIRECTORY_DIALOG]] — allows the user to select a directory.
+* [[ref:libraries/vision2/reference/ev_file_open_dialog_chart|EV_FILE_OPEN_DIALOG]] — allows the user to select an existing file to be opened.
+* [[ref:libraries/vision2/reference/ev_file_save_dialog_chart|EV_FILE_SAVE_DIALOG]] — allows the user to select a filename to be used for creation of a file.
+* [[ref:libraries/vision2/reference/ev_font_dialog_chart|EV_FONT_DIALOG]] — allows the user to select a font (useful for a Word Processor for example).
+* [[ref:libraries/vision2/reference/ev_print_dialog_chart|EV_PRINT_DIALOG]] — allows the user to confirm or change printer settings for printing (may be used in conjunction with [[ref:libraries/vision2/reference/ev_print_projector_chart|EV_PRINT_PROJECTOR]]).
+
+
+==Creating Custom Dialog Boxes==
+
+If you wish to provide a custom dialog in your application, [[ref:libraries/vision2/reference/ev_dialog_chart| EV_DIALOG]] has been provided to facilitate this.
+
+
+==Message Dialog Boxes==
+
+A message dialog box gives your application a standard way of displaying information, or asking simple questions. This information can be displayed with the following message dialog boxes.
+* [[ref:libraries/vision2/reference/ev_message_dialog_chart|EV_MESSAGE_DIALOG]] — displays a simple message with an "OK" button.
+* [[ref:libraries/vision2/reference/ev_information_dialog_chart|EV_INFORMATION_DIALOG]] — displays information to the user (in Windows this dialog box contains an "information" icon).
+* [[ref:libraries/vision2/reference/ev_question_dialog_chart|EV_QUESTION_DIALOG]] — displays a question and allows user to respond with "Yes" or "No" button.
+* [[ref:libraries/vision2/reference/ev_warning_dialog_chart|EV_WARNING_DIALOG]] — displays a warning to the user.
+* [[ref:libraries/vision2/reference/ev_confirmation_dialog_chart|EV_CONFIRMATION_DIALOG]] — allows the user to confirm an action that has been requested.
+* [[ref:libraries/vision2/reference/ev_error_dialog_chart|EV_ERROR_DIALOG]] — displays an error message.
+
+
diff --git a/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/widgets/index.wiki b/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/widgets/index.wiki
new file mode 100644
index 00000000..455941fb
--- /dev/null
+++ b/documentation/18.11/solutions/gui-building/eiffelvision-2/eiffelvision-library-reference-manual/widgets/index.wiki
@@ -0,0 +1,60 @@
+[[Property:title|Widgets]]
+[[Property:weight|2]]
+[[Property:uuid|595bb73e-146a-ea19-221f-40f3415aad34]]
+==What Is a Widget?==
+
+A Widget is the fundamental building block of your application's GUI. Components such as Windows, Buttons, Text fields, Check Boxes, List Boxes and layout Containers are examples of widgets. The widget set in EiffelVision 2 provides you with the flexibility to easily create powerful graphical applications. All widgets in EiffelVision 2 inherit from [[ref:libraries/vision2/reference/ev_widget_chart| EV_WIDGET]], thus the features provided in
+ my_button: EV_BUTTON
+ create my_button
+
+
+Along with the default creation, EiffelVision 2 also includes a few additional creation features for convenience. An example of this is make_with_text for all widgets that may have text associated with them (those that inherit from [[ref:libraries/vision2/reference/ev_textable_chart| EV_TEXTABLE]] ), this saves a call to set_text upon default creation of the textable widget. Thus:
+
+ create my_button.make_with_text ("Click Me")
+
+
+would replace
+
+ create my_button
+ my_button.set_text ("Click Me")
+
+
+{{note|When a widget is created, no extra initialization has to be performed. '''The only exception is with windows, for which it is necessary to call show in order for the windows to be displayed on screen'''. This permits widgets to be added to a window while it is still invisible, and then when made visible with show, the window and all its visible widgets are displayed at once.}}
+
+
+==Sizing==
+
+Since [[ref:libraries/vision2/reference/ev_primitive_chart|EV_PRIMITIVE]] inherits from type [[ref:libraries/vision2/reference/ev_widget_chart|EV_WIDGET]], the following facilities are provided for setting the minimum size: set_minimum_width, set_minimum_height and set_minimum_size.
+
+The minimum size of a widget is the smallest possible size that it can be inside its parent container. If an [[ref:libraries/vision2/reference/ev_button_chart|EV_BUTTON]] was created and set with a minimum_size of width/height (100, 100), if this button was inserted in to an [[ref:libraries/vision2/reference/ev_horizontal_box_chart| EV_HORIZONTAL_BOX]], then the box's size could never be below (100, 100) or it would violate the minimum size of the button. '''The size of a container must always be greater or equal to the minimum sizes of its children.'''
+
+{{note|In EiffelVision 2, there is no way to set the current size of the primitive. The current size is dependent on the size of the parent or the minimum_size. }}
+
+
+==Now What Do I Do?==
+
+Now that you can create a widget, you will need to actually make it usable to your intended user. This will usually involve these three steps.
+
+
+
+
+
+
+As projects grow and multiply, the number of these variables adds up quickly. A dozen or more such environment variables per system is (prior to IRON) not uncommon. Coordinating their use and evolution among a team of programmers can become a challenge.
+
+IRON has made it possible to simplify this scenario dramatically. For any commonly used library, it suffices to:
+* Install the related package from an IRON repository.
+* And for any project that uses the library, include an IRON uri in the related ECF.
+** an IRON uri has the form: iron:package-name:relative-path-to-file.ecf
+** as you can see, no more environment variable, and only a relative path from the root of the package. This simplifies a lot the referencing, and package/library management. No need to know where are located the installed files on the local machine.
+
+That's all! In the above example, the location of the libraries, in the project, then become something like:
+ iron path ...
+:{| class="wikitable"
+|-
+! Command
+! Result
+! Example
+|-
+| iron path
+| Base directory of IRON (~ IRON_PATH variable)
+| C:\Users\jfiat\Documents\Eiffel User Files\14.05\iron
+|-
+| iron path base
+| location of installed package base
+| C:\Users\jfiat\Documents\Eiffel User Files\14.05\iron\packages\base
+|-
+| iron path xml
+| location of installed package xml
+| C:\Users\jfiat\Documents\Eiffel User Files\14.05\iron\packages\xml
+|}
+
+Notes:
+* It is possible to override the default location of IRON installation directory, by setting the environment variable IRON_PATH or ISE_IRON_PATH.
+* In the scope of the .ecf file, the IRON_PATH variable is always set: to default path or to the value of environment variable IRON_PATH.
+* In addition to the IRON way to reference library, it is also possible to use the absolute URL in the repository, see advanced usage for more details.
+
+https://iron.eiffel.com/14.05/com.eiffel/library/base/base.ecf
+https://iron.eiffel.com/14.05/com.eiffel/library/text/parser/xml/parser/xml_parser.ecf
+https://iron.eiffel.com/14.05/others/dummy/src/foo/bar.ecf
+
+
+But this implies putting the version in the url (i.e 14.05), or you could set ISE_LIBRARY to https://iron.eiffel.com/14.05/com.eiffel
+
+= IRON client tool =
+The '''iron''' client executable is a facility that permits Eiffel programmers to easily install, remove, update, list, examine, search and share Eiffel packages.
+Additionally, it permits easy maintenance of a local list of IRON repositories.
+
+A default IRON server is provided and a default repository is added automatically by the iron executable, based on the version of EiffelStudio that installed the iron executable (iron:package-name:relative-path-to-file.ecf, as you would have previously for local libraries. This can be done directly by editing the .ecf file, or using the EiffelStudio '''Project Settings''' tool from Eiffel Studio:
+
+ Project Settings -> IRON_PATH environment variable to locate the install libraries, such as:
+ $IRON_PATH\packages\base\base.ecf
+
+This latter method, while it works, is not recommended simply because it defeats some of the advantages of using the IRON repository in the first place.
+
+== External dependencies ==
+If the package has some other way of linking it with your Eiffel projects, e.g. to an external '''.dll''' or '''.so''' , then instructions for this should be provided within the package.
+
+== Optional ==
+If you do not define one of these environment variables, the location used is:
+By default the base directory for IRON is under //iron , but it is possible to overwrite this value by setting the environment variable IRON_PATH (or ISE_IRON_PATH). Note that if the physical location does not exists, the local '''iron''' executable will create it.
+
+Setting IRON_PATH, can be a way to setup different development environments (with different registered repositories, ...)
+
+=How to Get Information About IRON Packages=
+At the website provided by a particular IRON server, you can get information about available packages in a number of ways. You can start by simply visiting the server's base address: https://iron.eiffel.com/ .
+
+* This page lists the repository versions available.
+* Select the version that matches the version of EiffelStudio you have installed.
+Example: clicking on version 14.05 takes you to https://iron.eiffel.com/repository/14.05/ where you can list existing packages, or add a new package if you have an account on the server.
+
+If you click the "Package list" or "All packages" link, it takes you to a list of packages available under that version.
+
+== Search/filter==
+To filter this list, you can use the search window. You can specify search criteria in this format :criterion:search_string
+
+Criteria available:
+
+:{| class="wikitable"
+|-
+! Criterion
+! Meaning
+|-
+| name
+| string is contained in package name (wildcards are supported)
+|-
+| title
+| string is contained in title
+|-
+| tag
+| package contains search_string in its tags (i.e. keywords)
+|-
+| downloads
+| has at least N downloads, e.g. downloads:25
+|}
+If a criterion is omitted, '''name''' is used by default.
+'''Operators available''': or, and, not (example: name:er and not name:parser)
+
+Finally, when you have found the package you want, click on its title, and the page displayed will contain detailed information about the package.
+
+== Associated paths ==
+Part of the information is a portion of the URI which you can use to define the path to the package.
+For the '''base''' library (title: EiffelBase), these URIs look like this:
+
+/14.05/com.eiffel/library/base
+/14.05/com.eiffel/library/data_structure/adt/base
+
+
+Given that the server's HTTP address is (in this example) https://iron.eiffel.com/, you can compose full paths from this, and use them in your Eiffel project. In this case, you can include the EiffelBase library in your project by specifying either:
+
+https://iron.eiffel.com/14.05/com.eiffel/library/base/base.ecf
+or https://iron.eiffel.com/14.05/com.eiffel/library/data_structure/adt/base/base.ecf
+
+
+Both will cause your project to compile with the same EiffelBase library provided by this IRON repository, provided you previously issued the following command on your system:
+
+> iron install base
+or
+> iron install https://iron.eiffel.com/14.05/com.eiffel/library/base
+
+
+'''IMPORTANT''': those associated URIs may be deprecated soon with the use of IRON uri iron:base:base.ecf.
+
+=Using IRON from the Command Line=
+The "iron" executable is used to perform various operations such as search, install, remove, update and share. This executable is installed with EiffelStudio in $ISE_EIFFEL/tools/spec/$ISE_PLATFORM/bin/.
+
+==Quick Help from the Command Line==
+*iron help
+:lists the actions that are available.
+
+*iron --help
+:displays detailed usage syntax for the action specified. Note that most of the actions have a -v (verbose) option that will display additional helpful information about the action performed, including (when relevant) the local path to the package.
+
+==Action Summary==
+
+:{| class="wikitable"
+|-
+! Action
+! Meaning
+|-
+| update
+| updates cached package information
+|-
+| list
+| displays a list of available packages, and whether they are installed
+|-
+| search
+| searches for a specified packages
+|-
+| info
+| displays information about a specified packages
+|-
+| install
+| installs specified packages
+|-
+| remove
+| removes specified packages
+|-
+| repository
+| manages repository list
+|-
+| share
+| share and manage your packages (an account on the IRON server is required)
+|}
+
+
+==Examples==
+
+===Update cached iron repository information===
+ iron update
+
+
+===Display information about package===
+:For instance for the '''api_wrapper''' package:
+ iron info api_wrapper
+
+:If the package is installed, the installation path will also be displayed.
+
+===Search for a package by name, ID or URI===
+:(package IDs and URIs are displayed by the "info" action) (future releases will enable searching by other criteria as well, such as by tags [i.e. keywords]):
+ iron search base
+
+
+===List available packages===
+ iron list
+
+
+===List installed packages===
+ iron list --installed
+
+
+===Install a package===
+ iron install base
+
+(or iron remove base
+
+
+===Install all available packages===
+ iron install --all
+
+
+===Uninstall all installed packages===
+ iron remove --all
+
+
+=Advanced Usage=
+==Managing Multiple Repositories==
+
+It is possible to have more than one IRON repository server registered.
+Examples:
+
+iron repository --list
+iron repository --add https://iron.eiffel.com/14.05
+iron repository --add https://custom.example.com/14.05
+iron repository --add C:\eiffel\my_repository
+iron repository --remove https://custom.example.com/14.05
+
+
+===Multiple-Repository Name Conflict Resolution===
+
+If you have more than one IRON repository registered on your system, it is possible that the same package name may exist on more than one repository. If this is the case, and you attempt to perform operations using that name only, the repository that will be used will be the first repository in the list that contains a package with that name. If you need the package with that name from a different repository, then use the "id" "uri" form of the identifying the package you want.
+
+If the sequence of repositories is not to your liking, you can change it in three ways:
+
+:* use the iron executable to remove and add repositories to re-sequence them, or
+:* delete the repositories.conf file and use the iron executable to add them again in the sequence you want them.
+:* edit the file repositories.conf with a plain text editor in the directory indicated by your IRON_PATH (or ISE_IRON_PATH) environment variable (or //iron/ if one of these environment variables are not defined on your system). (Note that this latter method, while possible, is not recommended, since the syntax of that file can change with new releases.)
+
+==Building a package==
+An IRON package has to provide, at its root, a file package.iron. This file describes the package with name, description, and various other information.
+See for instance, the package.iron for Eiffel Base package:
+
+package base
+
+project
+ base_safe = "base-safe.ecf"
+ base = "base.ecf"
+ base_testing = "testing/testing-safe.ecf"
+ base_testing = "testing/testing.ecf"
+
+note
+ title: Eiffel Base
+ description: "Eiffel Base: kernel library classes, data structure, Input and Output"
+
+ tags: base,kernel,structure,io
+ license: Eiffel Forum License v2
+ copyright: 1984-2013 Eiffel Software and others
+ link[doc]: "Documentation" http://eiffelroom.com/
+ link[source]: "Subversion" https://svn.eiffel.com/eiffelstudio/trunk/Src/library/base
+ link[license]: http://www.eiffel.com/licensing/forum.txt
+ maps: /com.eiffel/library/data_structure/adt/base
+
+end
+
+
+Note: The package iron file for the Eiffel Base package is available online at https://svn.eiffel.com/eiffelstudio/trunk/Src/library/base/package.iron .
+
+Current status:
+* only the '''name of the package is required'''
+* the section "project" list the various available .ecf projects
+* the section "note" contains title, description, tags, ... informations. The formation is similar to Eiffel indexing note, and in addition it supports bracket in the name of note, such as in ''link[category]: "Optional Title" associated-url
+* The following notes have semantic that are processed by Iron: '''title, description, tags, linkcompile_library tool delivered with EiffelStudio on the provided directory.
+
+Example at https://svn.eiffel.com/eiffelstudio/trunk/Src/library/cURL/package.iron :
+
+package cURL
+
+setup
+ compile_library = Clib
+...
+
+
+This compile_library tool relies on finish_freezing -library and thus process the Makefile-win.SH or Makefile.SH.
+
+==Using your own IRON packages locally==
+There are various ways to use your own Eiffel package libraries:
+* Using local location as it was currently done before 14.05 (i.e relative or absolute path, and eventually using an environment variable...).
+* Sharing the package on an IRON server, and then install it from that server:
+** The default https://iron.eiffel.com/ is the recommended server
+** But it is possible to host your own server easily. (server how-to documentation will be provided soon).
+* And there is another solution: local repository.
+
+Local repositories rely heavily on the package.iron files. So if a folder is registered as iron repository, internally iron will search this folder recursively for package.iron files.
+
+Example on Windows:
+iron repository --add %ISE_LIBRARY%\library
+
+It should find and list all the official ISE IRON packages.
+Now if you want to install the '''time''' package from it, just do
+
+> iron install time
+Searching [time]
+-> several packages for name [time]!
+ 1) time (https://iron.eiffel.com/14.05) "EiffelTime"
+ 2) time (file:///C:/EiffelDev/Src/library)
+ > Select a package [1] (q=cancel): 2
+-> Install time (file:///C:/EiffelDev/Src/library)
+Installing [time (file:///C:/EiffelDev/Src/library)] -> successfully installed.
+
+
+To make development easier, you may want to edit/update the repositories.conf file, in order to put that file://... local repository on the top.
+
+> iron path
+C:\Users\jfiat\Documents\Eiffel User Files\14.05\iron
+and then edit "C:\Users\jfiat\Documents\Eiffel User Files\14.05\iron\repositories.conf"
+
+
+*However, unless you are using the iron tool in batch mode ( --batch flag ), you will be asked to choose which package you want to install.
+*You can also use the EiffelStudio "Add Library" dialog via the "Iron" tab, to install, uninstall the various packages.
+*And last solution, you can use the full url as:
+ > iron install file:///C:/EiffelDev/Src/library/time
+
+Of course, do not forget that local repository should be used only for code in progress, otherwise you should share that library and use it as a simple user. One of the goal of IRON is to encourage people sharing their libraries with other Eiffel users.
+
+==Sharing Your Packages==
+To build and share your own packages on an IRON server, you will need a user account on that IRON server which will host your packages.
+Please visit https://iron.eiffel.com/repository/account/?register to create a new account.
+
+As usual, to see the available options, use:
+ iron share --help
+
+Example:
+
+To build the '''gps_nmea''' package from your library c:\eiffel\library\gps_nmea\ :
+
+
+iron share create --username --password
+ --repository https://iron.eiffel.com/14.05
+ --package "c:\eiffel\library\gps_nmea\package.iron" --package-name "gps_nmea"
+
+
+This command will:
+* create a new package named '''gps_nmea''' on iron repository '''https://iron.eiffel.com/14.05''',
+* using the local package '''c:\eiffel\library\gps_nmea''' (i.e: you need to provide the package.iron file)
+
+Note:
+* the --package-name is for now required, even if the package.iron already provides such information.
+* see the iron share --help for advanced usage (such as --index, --package-archive-source, ...).
+
+After adding such a package to the library, it is recommended that you go to the website, double check that the package was created they way you wanted it to be, and you can edit its information.
+Then, using the iron executable, install the package on your system, and go through the steps of using it in an Eiffel project, and correct any problems discovered, to verify that end users will be able to productively use your package.
+
+It is also '''''strongly''''' encouraged to include (or provide a link to) documentation that orients the user to its use, and answers basic questions such as: What is the package? What motivated you to create it? What problem(s) does it address? Under what circumstances can the package be productively used? Under what circumstances should it ''not'' be used (if applicable)? And some basic examples of its use. If the package is complex, it can be very helpful to include a well-commented application that demonstrates intended reuse of the package in software.
+
+Important note: having clear documentation that enables end users to easily learn how to use your package is a VITAL link in the ability to reuse software components as is so aptly described in ''[[uuid:496983ef-b86e-772e-16b9-39b37ef80e37|Object‑Oriented Software Construction, 2nd Edition]]'', in the Modular Understand-ability criterion:
+
+:''''' "A method favors Modular Understand-ability if it helps produce software in which a human reader can understand each module without having to know the others, or, at worst, by having to examine only a few of the others." '''''
+
+and the Self-Documentation Principle:
+
+:''''' "The designer of a module should strive to make all information about the module part of the module itself." '''''
+
+The point: reuse is only possible when end users can easily and quickly learn how to reuse software components available to them.
+
+=Origin of the Name IRON=
+
+As many readers will know, the name "Eiffel" was chosen to reflect the elegance and soundness of constructing large, complex software systems, with '''simple, individual components, each of which is a unit by itself and has its own existence, and can be tested for integrity as a separate unit, but its role in the larger scheme of things is to be used as a "building block"''' for constructing high-integrity software systems. The picture on the front of the book ''[[uuid:496983ef-b86e-772e-16b9-39b37ef80e37|Object‑Oriented Software Construction, 2nd Edition]]'' illustrates this.
+
+This of course is intentionally meant as a direct parallel to the famous structure built by the architect and civil engineer Alexandre Gustave Eiffel. This structure was constructed with '''simple, individual components, each of which is a unit by itself and has its own existence, and can be tested for integrity as a separate unit, but its role in the larger scheme of things is to be used as a "building block"''' for constructing a high-integrity structure: the Eiffel Tower.
+
+As a parallel to this, "IRON", as a name, was chosen to reflect the fact that the individual building blocks were themselves made from iron. In the Eiffel world, constructing a large complex software system is done with libraries of high-quality reusable components. Thus, the "building blocks" are made from iron, and software systems are made from those building blocks. Hence, IRON provides the "raw material" from which complex Eiffel systems are developed.
+
+=Planned Enhancements=
+This documentation describes the version of iron released with EiffelStudio 14.05.
+More features are planned or are already under development:
+:* the ability to analyze the contents of the package, to extract information related to its .ECF file(s)
+:* a way of ensuring that the package compiles under the specified version of EiffelStudio
+:* support for test suite
+:* detection and actions related to package dependencies
+:* package version
+:* ability to upgrade of packages already installed
+:* extended post-installation operations
+:* more features that users may request or suggest.
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-class-reference.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-class-reference.wiki
new file mode 100644
index 00000000..8bb6f404
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-class-reference.wiki
@@ -0,0 +1,5 @@
+[[Property:title|EiffelNet Class Reference]]
+[[Property:weight|1]]
+[[Property:uuid|25ab1fde-b4bc-2f45-1ec2-6dd109bdfc39]]
+==View the [[ref:libraries/net/reference/index|EiffelNet Class Reference]]==
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/advanced.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/advanced.wiki
new file mode 100644
index 00000000..7da22e1f
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/advanced.wiki
@@ -0,0 +1,29 @@
+[[Property:title|Advanced]]
+[[Property:weight|0]]
+[[Property:uuid|9229e5c1-165e-add7-6ce2-355dec4544f1]]
+==Compiling==
+
+To compile the example, you must compile two projects: ''chat'' and ''join''.
+
+To compile the ''chat ''project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\advanced\chat\''.
+* Choose ''chat.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+To compile the ''join ''project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\advanced\join\''.
+* Choose ''join.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/index.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/index.wiki
new file mode 100644
index 00000000..1126a995
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/index.wiki
@@ -0,0 +1,7 @@
+[[Property:title|EiffelNet Samples]]
+[[Property:weight|2]]
+[[Property:uuid|c9c0fe01-a80f-5834-8503-aad1063e1503]]
+=Description=
+
+Here is a set of five examples written to show some basic applications using the EiffelNet library . Two of them (Advanced and Same Machine) rely on specific code to Unix Operating systems and consequently cannot be run under Windows.
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/polling.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/polling.wiki
new file mode 100644
index 00000000..e73b581d
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/polling.wiki
@@ -0,0 +1,26 @@
+[[Property:title|Polling]]
+[[Property:weight|1]]
+[[Property:uuid|3bdc742f-2214-c5fb-2336-bc613b721c0d]]
+==Compiling==
+
+To compile the example, you must compile two projects: ''client'' and ''server.''
+
+To compile the ''client'' project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\polling\client\''.
+* Choose ''polling_client.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+To compile the ''server'' project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\polling\server\''.
+* Choose ''polling_server.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/predef.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/predef.wiki
new file mode 100644
index 00000000..95e15f27
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/predef.wiki
@@ -0,0 +1,26 @@
+[[Property:title|Predef]]
+[[Property:weight|2]]
+[[Property:uuid|d9851197-ae39-5e73-9bf3-51d7cb9fa23c]]
+==Compiling==
+
+To compile the example, you must compile two projects: ''client'' and ''server.''
+
+To compile the ''client'' project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\predef\client\''.
+* Choose ''our_client.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+To compile the ''server'' project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\predef\server\''.
+* Choose ''our_server.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/same-machine.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/same-machine.wiki
new file mode 100644
index 00000000..77df8f93
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/same-machine.wiki
@@ -0,0 +1,26 @@
+[[Property:title|Same Machine]]
+[[Property:weight|3]]
+[[Property:uuid|d10e1e4b-94c1-2725-f465-79da88730196]]
+==Compiling==
+
+To compile the example, you must compile two projects: ''client'' and ''server.''
+
+To compile the ''client'' project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\same_mach\client\''.
+* Choose ''our_client.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+To compile the ''server'' project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\same_mach\server\''.
+* Choose ''our_server.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/two-machines.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/two-machines.wiki
new file mode 100644
index 00000000..568ae9d2
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-samples/two-machines.wiki
@@ -0,0 +1,27 @@
+[[Property:title|Two Machines]]
+[[Property:weight|4]]
+[[Property:uuid|52307bfe-116d-f5c4-ccf1-98f330ef82e5]]
+==Compiling==
+
+To compile the example, you must compile two projects: ''client'' and ''server.''
+
+To compile the ''client'' project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\two_mach\client\''.
+* Choose ''our_client.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+To compile the ''server'' project:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\net\two_mach\server\''.
+* Choose ''our_server.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/bibliography.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/bibliography.wiki
new file mode 100644
index 00000000..07a3ed15
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/bibliography.wiki
@@ -0,0 +1,16 @@
+[[Property:title|Bibliography]]
+[[Property:weight|10]]
+[[Property:uuid|739d59a6-c0b0-899f-24cf-5a17655a5512]]
+[1] Bertrand Meyer: [[Eiffel: The Language]], Prentice Hall, 1992. (Available from Eiffel Software.)
+
+
+[2] Bertrand Meyer: [http://www.eiffel.com/services/training/books.html Reusable Software: The Base Object-Oriented Component Libraries], Prentice Hall, 1994. (Available from Eiffel Software.)
+
+
+[3] W. Richard Stevens: ''Unix Network Programming'', Prentice Hall, 1990.
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/clients-and-servers.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/clients-and-servers.wiki
new file mode 100644
index 00000000..b91e1308
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/clients-and-servers.wiki
@@ -0,0 +1,19 @@
+[[Property:title|Clients and servers]]
+[[Property:weight|1]]
+[[Property:uuid|3c1711f8-3aa0-9f3b-c1ce-0cd9324b3e00]]
+In the client-server model of computing, a number of software systems, the clients, may require general-purpose services provided by other systems, the servers. Clients and servers run concurrently, on the same machine or, more generally, on different machines connected through a network.
+
+Typically, the clients are systems, for example systems that provide useful facilities for human users; the servers take care of operations that clients could not perform on their own (or would perform less efficiently), and of operations that are common to several clients. Example of servers include:
+* '''Computation servers''', which take care of heavy or specialized computations not appropriate for the clients, assuming the servers' processors are more powerful.
+* '''File servers''' and '''database servers''', providing access to persistent data that different clients may need to access.
+
+The client-server relation is usually many-to-many: each client application, in the course of performing its duties, may successively require services from different servers; and each server may cater to different clients. This second aspect, illustrated by the following figure, is particularly important; it allows a single server to communicate with as many clients as appropriate.
+ [[Image:fig-1]]
+Although communication occurs both ways - clients sending objects to servers and conversely - the situation in such a scheme is usually not symmetric. Whereas a client requesting a certain service will need to know beforehand what server provides that service, the server, for its part, will not in general name its clients in advance; it will simply stand ready to provide its services to whatever suitable client happens to request them.
+
+This dissymmetry appears clearly in EiffelNet and in the examples of this manual. It means in particular that clients and servers act differently at the '''beginning''' of their client-server lifecycle. The party that initiates the communication is the client; in this operation it will identify the desired server (through a local file name for communication on the same machine, or though a machine name for network communication). The server simply makes itself ready for possible connections by starting to "listen" on the communication channels - relying for this on an EiffelNet procedure that is indeed called ''listen''.
+
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/event-driven-command-execution.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/event-driven-command-execution.wiki
new file mode 100644
index 00000000..d9ef0d3e
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/event-driven-command-execution.wiki
@@ -0,0 +1,207 @@
+[[Property:title|Event-driven command execution]]
+[[Property:weight|8]]
+[[Property:uuid|66036773-3e41-2877-7fa4-e0601558fc7c]]
+{{note|The example classes discussed in this section appear in the subdirectory ''polling ''of the example directory.}}
+
+
+===9.1 Commands and events===
+
+In the preceding examples each participant in a communication had to get ready to send or receive at specific stages of its life. Although this did not preclude asynchronous communication, it is sometimes desirable to make the scheme even more asynchronous, and control more decentralized, by letting each system simply specify certain communication events that it wants to monitor, and certain commands to be executed on occurrence of the specified events.
+
+The commands are objects, instances of a general-purpose class COMMAND or its proper descendants. Class COMMAND has, among its features, a procedure COMMAND.
+
+===9.2 Command classes===
+
+The example uses three command classes: DATAGRAM_READER, used by both clients and servers, and specialized versions of a datagram writer: one for clients, CLIENT_DATAGRAM_WRITER, and one for servers, SERVER_DATAGRAM_WRITER. These classes model operations that must be triggered in the case of a read event and a write event.
+
+Here is the common reader command:
+
+class
+ DATAGRAM_READER
+
+inherit
+
+ POLL_COMMAND
+ redefine
+ active_medium
+ end
+
+create
+
+ make
+
+feature
+
+ active_medium: NETWORK_DATAGRAM_SOCKET
+
+ execute (arg: ANY)
+ local
+ rec_pack: PACKET
+ datagram: DATAGRAM_PACKET
+ i: INTEGER
+ do
+ rec_pack := active_medium.received (10, 0)
+ create datagram.make_from_managed_pointer (rec_pack.data)
+ io.putint (datagram.packet_number)
+ io.new_line
+ from i := 0 until i > 9 loop
+ io.putchar (datagram.element (i))
+ i := i + 1
+ end
+ io.new_line
+ end
+
+end -- class DATAGRAM_READER
+
+
+
+The
+class
+ CLIENT_DATAGRAM_WRITER
+
+inherit
+
+ POLL_COMMAND
+ redefine
+ active_medium
+ end
+
+create
+
+ make
+
+feature
+
+ active_medium: NETWORK_DATAGRAM_SOCKET
+
+ execute (arg: ANY)
+ local
+ sen_pack: DATAGRAM_PACKET
+ char: CHARACTER
+ do
+ -- Make packet with characters `a' to `j' in successive positions
+ create sen_pack.make (10)
+ from char := 'a' until char > 'j' loop
+ sen_pack.put_element (char, char |-| 'a')
+ char := char.next
+ end
+ sen_pack.set_packet_number (1)
+ active_medium.send (sen_pack, 0)
+ end
+
+end -- class CLIENT_DATAGRAM_WRITER
+
+
+===9.3 The server and the client===
+
+Once the commands have been defined, it suffices for the server and the client to associate instances of these commands with the appropriate.
+
+The abstraction needed for this purpose is provided by class MEDIUM_POLLER. An instance of this class knows about a number of commands, each associated with a certain socket in read, write or special event mode. By applying procedure
+class
+ POLLING_SERVER
+
+create
+
+ make
+
+feature
+
+ make (argv: ARRAY [STRING])
+ local
+ soc: detachable NETWORK_DATAGRAM_SOCKET
+ ps: MEDIUM_POLLER
+ readcomm: DATAGRAM_READER
+ writecomm: SERVER_DATAGRAM_WRITER
+ do
+ if argv.count /= 2 then
+ io.error.putstring ("Usage: ")
+ io.error.putstring (argv.item (0))
+ io.error.putstring (" portnumber%N")
+ else
+ create soc.make_bound (argv.item (1).to_integer)
+ create ps.make_read_only
+ create readcomm.make (soc)
+ ps.put_read_command (readcomm)
+ create writecomm.make (soc)
+ ps.put_write_command (writecomm)
+ ps.execute (15, 20000)
+ ps.make_write_only
+ ps.execute (15, 20000)
+ soc.close
+ end
+ rescue
+ if soc /= Void and then not soc.is_closed then
+ soc.close
+ end
+ end
+
+end -- POLLING_SERVER
+
+
+
+Procedure POLLING_CLIENT). Then the server reverses the poller's set-up to write-only, and calls
+class
+ POLLING_CLIENT
+
+create
+
+ make
+
+feature
+
+ make (argv: ARRAY [STRING])
+ local
+ soc: detachable NETWORK_DATAGRAM_SOCKET
+ ps: MEDIUM_POLLER
+ readcomm: DATAGRAM_READER
+ writecomm: CLIENT_DATAGRAM_WRITER
+ do
+ if argv.count /= 3 then
+ io.error.putstring ("Usage: ")
+ io.error.putstring (argv.item (0))
+ io.error.putstring (" hostname portnumber%N")
+ else
+ create soc.make_targeted (argv.item (1), argv.item (2).to_integer)
+ create ps.make_write_only
+ create readcomm.make (soc)
+ ps.put_read_command (readcomm)
+ create writecomm.make (soc)
+ ps.put_write_command (writecomm)
+ ps.execute (15, 20000)
+ ps.make_read_only
+ ps.execute (15, 20000)
+ soc.close
+ end
+ rescue
+ if soc /= Void and then not soc.is_closed then
+ soc.close
+ end
+ end
+
+end
+
+
+
+===9.4 A less deterministic scheme===
+
+Although the example uses the event-driven mechanisms of EiffelNet, it is still relatively deterministic in that it follows a precise protocol defined by a strict sequence of read and write operations on both sides. This is why every call to IO_MEDIUM, to send and receive simple objects such as integers. But for this first example we are already more ambitious and want to exchange entire linked lists of strings. The structures that we will exchange are described by the following class:
+
+class
+ OUR_MESSAGE
+
+inherit
+
+ LINKED_LIST [STRING]
+
+ STORABLE
+ undefine
+ is_equal, copy
+ end
+
+create
+ make
+
+end
+
+
+Note that to make use of the storage and retrieval facilities the objects to be exchanged must be instances of a class which, as here, is a descendant of STORABLE.
+
+
+
+{{caution|On Windows, the examples `advanced` and the `same_mach` are nonfunctional. This is because these examples use code specific to Unix Operating systems. }}
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/more-complex-example.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/more-complex-example.wiki
new file mode 100644
index 00000000..76edfdfc
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/more-complex-example.wiki
@@ -0,0 +1,17 @@
+[[Property:title|A more complex example]]
+[[Property:weight|9]]
+[[Property:uuid|a57bbf5b-d877-8a50-1bca-92848868bdec]]
+{{note|The example classes discussed in this section appear in the subdirectory ''advanced ''of the example directory.}}
+
+
+The last example exercises most of EiffelNet's major facilities. It consists of a server that allows an arbitrary number of clients to connect to it. Each time the user of one of the client systems types a line on the keyboard, the client sends this character to the server, which then broadcasts it to all the clients (including the original sender). This scheme allows several people to talk together, hence the names chosen: the server class is called CHAT, and the client is called JOIN.
+
+The example uses the network mode of communication, based on the [[ref:libraries/net/reference/network_client_chart|NETWORK_CLIENT]] and [[ref:libraries/net/reference/network_server_chart|NETWORK_SERVER ]] classes. It uses automatic polling through [[ref:libraries/net/reference/medium_poller_chart|MEDIUM_POLLER]] as in the previous example; the relevant command is given by class CONNECTION, an heir of [[ref:libraries/net/reference/poll_command_chart|POLL_COMMAND]] . The information exchanged between the server and its clients is described by class MESSAGE, an heir of [[ref:libraries/base/reference/linked_list_chart|LINKED_LIST]] [ [[ref:libraries/base/reference/string_8_chart|STRING]] ] similar to the earlier examples' OUR_MESSAGE (see [[Introduction to the examples]] ). Attributes include, the name OUR_CLIENT and OUR_SERVER, which are part of two different systems and will run concurrently. The communication uses streams rather than datagrams; the datagram form of communication will be examined in section [[Using datagram sockets|using datagram sockets]] .
+
+===A client and a server on the same machine===
+
+{{note|The example classes discussed in this section appear in the subdirectory ''same_mach'' of the example directory }}
+
+First, let us assume that the client and server run on the same machine, so that we will use the UNIX_ versions of the classes (the next example will be multi-machine). The communication protocol is also the same as before: the client sends a list of strings, the server returns it extended.
+
+Here we will create and manipulate sockets directly. For that reason, both classes inherit from the EiffelNet class SOCKET_RESOURCES which introduces a number of constants and other useful socket-related features.
+
+The two sockets must be able to refer to a common address. For a communication within a single machine, as noted, this address is a path name, again ''/tmp/here'' for this example. The address will be an argument of the creation procedure used to obtain a socket
+ create soc1.make_client ("/tmp/here")
+ create soc1.make_server ("/tmp/here")
+
+The
+ soc1.connect
+
+To make itself ready for the communication, the server will execute:
+
+ soc1.listen (n)
+
+where _SERVER classes of the predefined level, as in the earlier example, 5 is indeed the default; you can change the value to a positive integer
+ soc1.accept
+ soc2 := soc1.accepted
+ ... Storage and retrieval operations using soc2 (not soc1) ...
+ soc2.close
+
+
+Procedure
+ if attached {SOME_EXPECTED_TYPE} soc2.retrieved as l_temp then
+-- soc2.retrieved was attached to an object of the expected type. Now that object is attached to `l_temp'
+-- Proceed with normal computation, typically involving calls of the form l_temp.some_feature
+ else
+-- soc2.retrieved was not attached to an object of the expected type.
+ end
+
+
+applying to
+class
+ OUR_SERVER
+inherit
+
+ SOCKET_RESOURCES
+
+ STORABLE
+
+creation
+ make
+
+feature
+
+ make
+ -- Accept communication with client and exchange messages
+ local
+ count: INTEGER
+ soc1: detachable UNIX_STREAM_SOCKET
+ do
+ create soc1.make_server ("/tmp/here")
+ from
+ soc1.listen (5)
+ count := 0
+ until
+ count = 3
+ loop
+ process (soc1) -- See below
+ count := count + 1
+ end
+ soc1.cleanup
+ rescue
+ if soc1 /= Void then
+ soc1.cleanup
+ end
+ end
+
+ process (soc1: UNIX_STREAM_SOCKET)
+ -- Receive a message, extend it, and send it back
+ do
+ soc1.accept
+ if attached soc1.accepted as l_soc2 then
+ if attached {OUR_MESSAGE} retrieved (l_soc2) as l_our_new_list then
+ across
+ l_our_new_list as it
+ loop
+ io.put_string (it.item)
+ io.new_line
+ end
+ l_our_new_list.extend ("%N I'm back.%N")
+ l_our_new_list.independent_store (l_soc2)
+ end
+ soc2.close
+ end
+ end
+
+end
+
+
+Note that at the end the server should not only closes the original socket
+class
+ OUR_CLIENT
+
+inherit
+
+ SOCKET_RESOURCES
+
+creation
+ make
+
+feature
+
+ make
+ -- Establish communication with server, and exchange messages
+ local
+ soc1: detachable UNIX_STREAM_SOCKET
+ do
+ create soc1.make_client ("/tmp/here")
+ soc1.connect
+ process (soc1) -- See below
+ soc1.cleanup
+ rescue
+ if soc1 /= Void then
+ soc1.cleanup
+ end
+ end
+
+ process (soc1: UNIX_STREAM_SOCKET)
+ -- Build a message to server, receive answer, build
+ -- modified message from that answer, and print it.
+ local
+ our_list: OUR_MESSAGE
+ do
+ create our_list.make
+ our_list.extend("This")
+ our_list.extend (" is")
+ our_list.extend (" our")
+ our_list.extend (" test")
+ our_list.independent_store (soc1)
+ if attached {OUR_MESSAGE} our_list.retrieved (soc1) as l_our_new_list then
+ across
+ l_our_new_list as it
+ loop
+ io.putstring (it.item)
+ end
+ io.new_line
+ end
+ end
+
+end
+
+
+===Communication between two different machines===
+{{note|The example classes discussed in this section appear in the subdirectory ''two_mach'' of the example directory }}
+
+
+Let us now assume that the client and the server will run on two separate machines. Instead of UNIX_ sockets, we must now use sockets of type NETWORK_STREAM_SOCKET.
+
+The available creation procedures are slightly different. The server will be set up so as to listen to clients from any machine; it designates a '''port''', identified by an integer, on which it will listen. The socket creation on the server side is then
+
+ create soc1.make_server_port (2000)
+
+For the client, the creation will specify two elements of information: the port number and the server. The server argument, a string, identifies the machine used as a server; it may be the host name of that machine, for example ''"serverhost" ''as used in the example; or it can be the machine's internet address, made of a sequence of numbers separated by periods, such as ''"127.0.0.1"''.
+
+The rest of the classes is as before.
+
+class
+ OUR_SERVER
+
+inherit
+
+ SOCKET_RESOURCES
+
+ STORABLE
+
+creation
+ make
+
+feature
+
+ soc1: detachable NETWORK_STREAM_SOCKET
+
+ make
+ -- Accept communication with client and exchange messages.
+ do
+ create soc1.make_server_by_port (2000)
+ ... The rest as before...
+ end
+
+ process
+ ... As before ...
+ end
+
+end
+
+
+class
+ OUR_CLIENT
+
+inherit
+
+ SOCKET_RESOURCES
+
+creation
+ make
+
+feature
+
+ soc1: detachable NETWORK_STREAM_SOCKET
+
+ make
+ do
+ create soc1.make_client_by_port (2000, "serverhost")
+ ... The rest as before ...
+ end
+
+ process
+ ... As before ...
+ end
+
+end
+
+
+
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/overview-eiffelnet-mechanisms.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/overview-eiffelnet-mechanisms.wiki
new file mode 100644
index 00000000..8764a745
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/overview-eiffelnet-mechanisms.wiki
@@ -0,0 +1,130 @@
+[[Property:title|An overview of EiffelNet Mechanisms]]
+[[Property:weight|2]]
+[[Property:uuid|08d7ca19-65e3-7f35-fbce-a50d0aedf626]]
+{{UpdateNeeded}}
+
+
+
+To enable clients and servers to exchange objects, you will have to ensure that they can refer to a common '''address'''. At the predefined level this is really the only notion that you need to know, although it is useful to get the bigger picture, in particular the concept of '''socket '''(which enables systems to set up communication channels), the various forms of communication (single-machine versus multi-machine, stream versus datagram), the kinds of object structure that may be exchanged, the notion of packet, and how to associate commands with communication events. The following paragraphs review these ideas and the corresponding EiffelNet abstractions.
+
+===Establishing a common address===
+
+When two systems need to communicate through sockets, they must establish a binding through some common point of reference, called an '''address'''. Predictably, the notion of address is one of the important internal abstractions of EiffelNet, although in most cases developers of applications using EiffelNet do not need to manipulate address objects directly.
+
+EiffelNet supports two modes of communication: single-machine and multi-machine. In the single-machine case, the two communicating systems are known to be running on the same machine. In the multi-machine case, also known as the '''network''' case, they may be running on different machines, and communication occurs through a network. These two modes clearly require a different binding mechanism.
+
+When a client and a server reside on the same machine, they both have access to that machine's file system. This provides a straightforward binding mechanism: the common address will simply be a "path name", the Unix terminology for the full name of a file in a hierarchically organized file system. In the examples below this file will be ''/tmp/here ''(file ''here'' in the ''/tmp'' directory, conventionally used for temporary files). This file must not exist prior to the communication; it will be created by the socket mechanisms and then removed.
+
+For the network style of communication, this simple device of using a path name is no longer applicable. To define a common address, we may use two elements of information: the name of a machine, and the indication of a '''port''' on that machine. More precisely:
+* The port will be identified by an integer. In the examples below port ''2000'' will be used.
+* The machine may be identified in either of two ways: its '''host name''' (the name assigned to the machine when the operating system was first installed on it) or its '''Internet address''', a sequence of numbers separated by periods, such as ''127.0.0.1''. EiffelNet routines that need an argument identifying a machine will indifferently take a host name or an Internet address, passed in either case as a string. In the examples below the identification will be a host name, given as the string ''"serverhost"''.
+
+In network-style client-server communication, the mechanism will be dissymmetric, reflecting the possibility (noted earlier) of a single server catering to many clients. The clients will state both the machine identification of their intended server and the port on which they will talk to that server. The server, however, will only specify the port; this means that it makes itself available to any client that cares to talk to it on that port. This provides some of the essential flexibility of client-server communication, where only one of the partners needs to state beforehand whom it wants to talk to.
+
+===Sockets and communication modes===
+
+A software system will exchange objects with another by sending them to a socket. Although if you stay at the predefined level you will not need to manipulate sockets explicitly, it is useful to understand this concept and know about the corresponding EiffelNet classes.
+
+You may think of a socket as a communication port; by attaching sockets together you enable communication between the corresponding systems, for example a client and a server:
+
+
+[[Image:fig-2]]
+
+
+EiffelNet has been designed so that sockets look very much like files. You send objects to a socket in the same way that you write objects onto a file, and receive objects from a socket in the same way that you read objects from a file. This fundamental commonality is reflected in the inheritance hierarchy of the corresponding classes:
+
+
+[[Image:fig-3]]
+
+
+Note that the hierarchy as shown is not complete; in particular the full structure uses classes STREAM (of which the STREAM_ classes are heirs) and DATAGRAM for multiple inheritance ''. ''Only the classes below the dotted line are part of EiffelNet; the others are part of EiffelBase, the fundamental data structure and algorithm library of ISE Eiffel [ [[Bibliography|2]] ].
+
+The most important property of this inheritance hierarchy is that it shows how sockets fit within the overall structure. Thanks to the common ancestor IO_MEDIUM, socket classes have most of their features in common with files.
+
+In normal usage, the only socket classes that you will need are four classes appearing at the bottom of the above figure. They correspond to two separate distinctions: single-machine versus multi-machine, and reliable versus unreliable.
+
+On the first distinction:
+* If the communicating systems run on the same machine, you may use one of the UNIX_ classes.
+* For systems that run on different machines, you must use one of the NETWORK_ classes. This will also work if the systems are on the same machine, but less efficiently since communication may go through the network.
+
+The use of the word UNIX_ does not mean that the machine must be running the Unix operating system; rather, it denotes a certain style of client-server communication, the Unix style. (This is comparable to the use of the name UNIX_FILE in EiffelBase, for a class describing files that behave in the Unix style even though they may be implemented on non-Unix machines.)
+
+The second distinction reflects two modes of socket communication: stream communication and datagram communication. Both of these modes support two-way communication between systems, but with different properties:
+* A stream socket, as provided by the STREAM_ classes, provides sequenced communication without any loss or duplication of data. Stream communication is normally synchronous: the sending system waits until it has established a connection to the receiving system and transmitted the data.
+* A datagram socket, as provided by the DATAGRAM_ classes, is asynchronous: the sending system emits its data and does not wait for an acknowledgment. Because the sender is not blocked, this mode is more efficient, but it does not guarantee sequencing, reliability or non-duplication.
+
+===Sending and receiving simple values===
+
+IO_MEDIUM has all the basic input and output facilities applying to objects of basic types, as also offered in FILE(see the specification of FILE in reference [ [[Bibliography|2]] ]). So you can use sockets to send and receive characters, integers, real numbers in simple or double precision and strings. For example, if the type of
+`my_socket' is one of the socket classes shown on the preceding figures, any of the following calls will be valid:
+
+ my_socket.put_string ("Some text")
+ my_socket.read_integer_32
+ my_last_integer := my_socket.last_integer_32
+
+
+Since sockets are bidirectional, these instructions may all appear as part of the same class provided you make sure to guarantee proper synchronization between senders and receivers. You may also prefer to specialize certain sockets for sending and others for receiving.
+
+===Sending and receiving object structures===
+
+In many cases, what you will want to send and receive is not just simple values but non-basic objects (instances of arbitrary classes, having as many fields as needed) and, more generally, entire object structures.
+
+The basic mechanism enabling a system to send objects through EiffelNet is also the basic mechanism for storing objects into a file: class STORABLE from EiffelBase.
+
+
+{{note|Although this discussion uses the class STORABLE, it should be noted that this class will in the future be made obsolete by the classes in the Serialization (SED) subcluster of EiffelBase. You will notice that the EiffelNet examples delivered with EiffelStudio use the classes from the Serialization cluster.}}
+
+
+As documented in [ [[Bibliography|2]] ], STORABLE provides features to store and retrieve complete object structures. There are three storage procedures, called under the respective forms
+
+ struct1.basic_store (iom1)
+ struct1.general_store (iom1)
+ struct1.independent_store (iom1)
+
+
+Assuming that the type of ''iom1 ''is IO_MEDIUM or a conforming type such as [[ref:libraries/base/reference/file_chart|FILE]] or one of the _SOCKET classes, and that the type of ''struct1'' conforms to STORABLE. Note that reference [2] in its original version does not include ''independent_store'', and requires ''iom'' to be of type FILE rather than the more general IO_MEDIUM. The current version of EiffelBase, however, supports the more general properties described here.
+
+All three storage procedures have the effect of sending to ''iom1 ''(whether a file, a socket or some other IO-medium) a copy of the entire object structure starting at ''struc1''. Together with the retrieval routines seen below, they apply the principle of reference completeness stated in [ [[Bibliography|1]] ] and [ [[Bibliography|2]] ]:
+{| border="1"
+|-
+| Whenever a routine of class STORABLE stores an object into an external file, it stores with it the dependents of that object.
+| Whenever one of the associated retrieval routines retrieves a previously stored object, it also retrieves all its dependents.
+|}
+
+For EiffelNet, of course, "storing" and "retrieving" mean sending and receiving. The rest of this section, which applies to sockets as well as to files, will continue to use the original terminology of storage and retrieval.
+
+The three storage procedures differ in their degree of generality:
+* ''basic_store'' will only work if the sending and retrieving are performed by instances of the same system (the same executable module).
+* ''general_store'' will work if the sender and retriever are different systems (using the same classes for the objects that they exchange), but these systems must run on machines of the same architecture, or at least of architectures that use the same data representation.
+* ''independent_store'' will work in the most general case, with the sender and receiver possibly running on platforms using different data representations.
+
+The penalty for using more general representations is that the data representation (as stored into the file or sent to the socket) will have to include more information. So ''basic_store ''uses the most compact representation, and ''independent_store'' the most verbose.
+
+The scheme for accessing an object structure produced by one of these three procedures is the following, used in a descendant of class STORABLE:
+
+ if attached {SOME_EXPECTED_TYPE} retrieved (iom2) as l_temp then
+-- Retrieved object is of expected type and now attached to `l_temp'
+-- Proceed with normal processing, typically involving calls of the form `l_temp.some_feature'
+ else
+-- Retrieved was not attached to an object of SOME_EXPECTED_TYPE
+ end
+
+
+Here ''iom2'' must be of a type conforming to IO_MEDIUM. The [[ET: Inheritance#Object test|object test]] using the "attached" syntax checks that the root object of the structure produced by the corresponding call to one of the ''_store'' procedures is of a type that conforms to the expected type.
+
+Although there are three separate storage procedures, there is only one retrieval routine, ''retrieved''; the algorithm for ''retrieved ''is able to figure out, from the format of the retrieved objects, whether they were produced in the basic, general or independent mode.
+
+===Packets===
+
+The classes PACKET and DATAGRAM_PACKET are used to represent packets of data that can be sent to sockets.
+
+Their main use is for a system that relies on datagram communication. As noted above, this mode does not guarantee sequencing, making each system responsible for checking that packets arrive in the proper order. This is possible through feature ''number ''of class DATAGRAM_PACKET, which gives the number of the current packet.
+
+===Associating commands with events===
+
+EiffelNet supports a highly asynchronous (and hence efficient) mode of operation by offering mechanisms through which you can specify that a certain action must be executed whenever a certain medium becomes available for reading, writing or handling of special cases (out of bounds). This facility is provided by a set of related classes:
+* The actions are represented by class POLL_COMMAND, an heir of the EiffelBase class COMMAND with, in particular, the procedure ''execute''.
+* Using MEDIUM_POLLER, you can specify that a certain command (an instance of POLL_COMMAND) must be executed whenever a certain medium becomes available for the appropriate operation (read, write, handling of out-of-bounds cases).
+* Using POLL_MASK, you can set a mask to select the sockets or files on which your instance of MEDIUM_POLLER is working.
+
+
diff --git a/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/using-datagram-sockets.wiki b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/using-datagram-sockets.wiki
new file mode 100644
index 00000000..54389a94
--- /dev/null
+++ b/documentation/18.11/solutions/networking/eiffelnet/eiffelnet-tutorial/using-datagram-sockets.wiki
@@ -0,0 +1,14 @@
+[[Property:title|Using datagram sockets]]
+[[Property:weight|7]]
+[[Property:uuid|ba27b7dd-77db-7f6f-9b8c-2a3111d9d432]]
+{{note|The example classes discussed in this section appear in the subdirectory ''datagram'' of the example directory. }}
+
+Using datagram sockets implies a few differences from the preceding schemes. You create a [[ref:libraries/net/reference/network_datagram_socket_chart|NETWORK_DATAGRAM_SOCKET]] or a $ISE_LIBRARY/library/net/net.ecf
+
+* '''ZeroMQ''':
+: wrapping for the [http://zeromq.org/ ZeroMQ] Distributed Messaging . [https://svn.eiffel.com/eiffelstudio/trunk/Src/library/zeromq]
+
+* '''http_client''':
+: simple web client to send http (GET, POST, ...) request and receive associated response. $ISE_LIBRARY/contrib/library/network/http_client/http_client.ecf
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/cecil/cecil-interface-overview.wiki b/documentation/18.11/solutions/other-languages/cecil/cecil-interface-overview.wiki
new file mode 100644
index 00000000..2812a2ed
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/cecil/cecil-interface-overview.wiki
@@ -0,0 +1,581 @@
+[[Property:title|CECIL interface overview]]
+[[Property:weight|3]]
+[[Property:uuid|7d8b4785-6f05-02c9-ba1c-12bad3d4b331]]
+==Eiffel basic types==
+The EIFFEL include files define types for every EIFFEL types:
+* An Eiffel
+ c_foo (ptr: POINTER; obj: OBJECT): INTEGER
+ external
+ "C | %"your_file.h%""
+ alias
+ "foo"
+ end
+
+
+
+In the C side, The C function `foo` is defined as follow:
+
+
+EIF_INTEGER foo (EIF_POINTER ptr, EIF_OBJECT obj)
+ {
+ /* some code */
+ }
+
+
+In some cases, you may not be able to change the signature of a C function you want to use. In this case, you must describe its actual signature in the Eiffel code. On the C side, foo is already defined as below:
+
+int foo (void *arg1, char c, FILE *file)
+ {
+ /* some code */
+ }
+
+To match the signature, you must declare it in Eiffel as:
+
+ c_foo (arg1: POINTER; c: CHARACTER; file: POINTER): INTEGER
+ external
+ "C (void *, char, FILE *) : int | %""your_file.h%""
+ alias
+ "foo"
+ end
+
+Not doing this would generally produce warnings during the C compilation, and it could crash with some C compilers.
+
+To perform the conversion, here is the actual Eiffel types mapping to C types:
+*
+ c_foo (ptr: POINTER; obj: OBJECT): INTEGER
+ external
+ "C | %""your_file.h%""
+ alias
+ "foo"
+ end
+
+
+
+the Eiffel run-time will protect obj, which can asynchronously move, and give a static and safe indirection to C.
+
+'''Here is an example of how accessing obj: OBJECT:'''
+
+EIF_INTEGER foo (EIF_POINTER ptr, EIF_OBJECT obj);
+{
+ /* Print the Eiffel object `obj', with the feature `print'
+ * from ANY. (do not forget to put `visible' the class
+ * ANY in the project configuration file.
+ */
+
+ EIF_PROCEDURE ep;
+ EIF_TYPE_ID tid;
+ tid = eif_type_id ("ANY");
+ ep = eif_procedure ("print", tid);
+ (ep) (eif_access(obj),eif_access(obj));
+}
+
+
+'''Important rules when using eif_access:'''
+
+{{note|The first argument of ''(ep)'' is the target of the function (the eiffel object to which you want to apply the Eiffel feature ''(ep)'') and the second argument corresponds to the first argument of `print`. Any Eiffel object could have been the 1st argument of ''(ep)'' since all of them inherit ''ANY''. }}
+
+
+* '''Never pre compute the value returned by eif_access. '''
+EIF_REFERENCE e_ref = eif_access (obj);
+...
+(ep) (e_ref, e_ref);
+
+
+
+because e_ref is the direct reference to the Eiffel object when calling ''eif_access(). '' There is not guarantee that it will still be valid when the call to ''(ep)'' is done: meanwhile, e_ref may have been moved by the GC.
+(ep) (eif_access (a), eif_string ("Hello world"));
+ /* eif_string is a macro returning a direct reference to an Eiffel string,
+ * which corresponds to the C string passed as its argument.
+ */
+
+Nothing guarantees that the direct reference returned by `eif_access (a)` will be still valid when executing (ep): it may be obsolete after the Eiffel call eif_string ("Hello world"), which may invoke a collection cycle.
+
+The correct code is
+
+
+EIF_REFERENCE my_string;
+/* some code */
+my_string = eif_string ("Hello world");
+(ep) (eif_access (a), my_string);
+
+
+
+In this case, you do not need to protect `my_string` since the GC is not likely to be triggered after the call to ''eif_string'' and before `my_string` is given as argument in ''(ep). '' A collection is triggered only during Eiffel calls. If an Eiffel call had been performed, you would have had to use ''eif_protect'' (see paragraph 3. 2):
+
+
+EIF_REFERENCE my_string;
+EIF_OBJECT i_my_string;
+/* some code */
+my_string = eif_string ("Hello world");
+i_my_string = eif_protect (my_string); /* Protect `my_string'. */
+/* Some eiffel calls */
+(ep) (eif_access (a), eif_access (i_my_string));
+eif_wean (i_my_string); /* Release protection. */
+
+
+
+
+===Keeping a reference from C after an external call: eif_adopt===
+'''# include "eif_hector. h"'''
+
+
+EIF_OBJECT eif_adopt (EIF_OBJECT object)
+
+
+When passing Eiffel objects to C, you may need to keep a reference to them after the C external is called. Since the Eiffel run-time automatically will unprotect the Eiffel object references passed to a C external after execution, if one of the Eiffel objects is not referenced any longer from Eiffel, then the garbage collector will collect it because it is not aware that you may still need to reference this object from the C side.
+
+Called within a C external, the function ''eif_adopt'' creates a user protection for the Eiffel object ''object'' passed to C ( ''object'' is a C external argument). This way, the GC cannot collect the Eiffel reference returned by ''eif_access(object)'' when the C external returned. It tells the GC to keep artificially a reference to this Eiffel reference from C. It returns the new indirection pointer (say ''returned_value'') that must be used afterwards to access this direct Eiffel reference with ''eif_access (return_value)''. It is important to note that ''eif_adopt'' already takes an indirection pointer as unique argument. This is a temporary protection pointer: you can access the direct Eiffel reference with ''eif_access (object)'' only within the code of the C external. When the C external returns, ''eif_access (object)'' is NULL but ''eif_access (returned_value)'' remains valid until you release it with
+ c_foo (ptr: POINTER; obj: OBJECT): INTEGER
+ external
+ "C | %"your_file.h%""
+ alias
+ "foo"
+ end
+ c_display_and_release_obj
+ external
+ "C | %"your_file.h%""
+ alias
+ "display_and_release_obj"
+ end
+
+
+
+On the C side:
+
+
+EIF_OBJECT my_obj; /* Protection of the object of type OBJECT. */
+EIF_INTEGER foo (EIF_POINTER ptr, EIF_OBJECT obj)
+{
+ my_obj = eif_adopt (obj); /* Keeping a reference on it for
+ * for later use.
+ */
+ /* some code */
+}
+void display_and_release_obj (void)
+{
+ /* Display global object. */
+ EIF_PROCEDURE ep;
+ EIF_TYPE_ID tid;
+ tid = eif_type_id ("OBJECT");
+ ep = eif_procedure ("print", tid);
+ (ep) (eif_access(my_obj),eif_access(my_obj)); /* Print global object.*/
+ eif_wean (my_obj); /* Remove the protection on global object.*/
+}
+
+
+
+Between the call of `c_foo` and `c_display_obj`, the global object `(eif_access (my_obj))` may not be referenced from Eiffel any longer. To prevent the GC from collecting it before the call to `c_display_and_release_obj`, you must protect it with `eif_adopt` in the C function `foo`.
+
+==Other CECIL functions:==
+
+===Creating Eiffel objects from C: eif_create===
+''' # include "eif_cecil. h"'''
+
+
+EIF_OBJECT eif_create (EIF_TYPE_ID type_id)
+
+
+All CECIL calls are not completed using C externals. It is possible to create and manipulate Eiffel objects from a C program and still reap benefits from the garbage collector and design by contract methodology provided by Eiffel (see also [[Compiling an Eiffel system for CECIL|How to run a CECIL program]] ). This function does not call any creation procedure.
+
+The CECIL function ''eif_create'' takes a type identifier ''type_id'' as argument (generally returned by
+#include eif_setup.h" /* for EIF_INITIALIZE and EIF_DISPOSE_ALL */
+#include "eif_eiffel.h" /* for other exported routines from the Eiffel run-time */
+main (int argc,char **argv,char **envp)
+{
+ EIF_TYPE_ID tid;
+ EIF_OBJECT my_obj;
+ EIF_INITIALIZE(failure) /* Initialization of Eiffel run-time.
+ * This is to be done before any CECIL call.
+ */
+
+ tid = eif_type_id ("OBJECT");
+ if (tid == EIF_NO_TYPE)
+ eif_panic ("No type id.");
+ my_obj = eif_create (tid); /* Create eiffel object, returns an indirection. */
+ /* some code */
+ eif_wean (my_obj); /* We do not need it any more. */
+ EIF_DISPOSE_ALL /* Reclaim memory allocated by Eiffel run-time. */
+}
+
+
+
+{{note|`eif_create` does not call any creation procedure. It just allocates memory and initializes an object. }}
+
+===Protecting the objects returned by Eiffel functions.===
+
+'''# include "eif_hector. h"'''
+
+
+''' EIF_OBJECT eif_protect (EIF_REFERENCE object)'''
+
+
+This function is used to tell explicitly the GC that you want to keep a reference to an eiffel object from the C. It returns a static indirection pointer which is to be used afterwards to access the direct Eiffel reference object with eif_access (returned_value) where returned_value is the value returned by eif_protect . With this call, the GC artificially references object, so that it cannot collect it. It is unsafe to access directly (i.e without using eif_access) the Eiffel reference object, which may be obsolete after any collection cycle (the GC moves the objects). Ignore this rule, if you are sure that there is no Eiffel call after you pass the direct Eiffel reference to a C function and before you read it.
+
+To release this artificial reference, call eif_wean (returned_value)
+
+eif_protect is to be called on an EIF_REFERENCE returned by eif_attribute, eif_string, or the returned value of eif_reference_function.
+
+See also eif_adopt, eif_create, eif_wean, eif_access.
+
+'''Example:''' Assume that you want to access an attribute `tab` of type
+#include eif_setup.h"
+#include "eif_eiffel.h"
+main (int argc,char **argv,char **envp)
+{
+ EIF_TYPE_ID tid;
+ EIF_OBJECT my_obj;
+ EIF_PROCEDURE emake; /* Creation procedure of "OBJECT". */
+ EIF_REFERENCE tab; /* direct reference to `tab' from "OBJECT". */
+ EIF_OBJECT i_tab; /* Protected indirection to `tab'. */
+ EIF_INITIALIZE(failure)
+ tid = eif_type_id ("OBJECT");
+ if (tid == EIF_NO_TYPE)
+ eif_panic ("No type Id.");
+ my_obj = eif_create (tid);
+ emake = eif_procedure ("make", tid); /* On the eiffel side: make is do ... end.. */
+ (emake) (eif_access (my_obj)); /* Call `make' on `eif_access(my_obj)'.*/
+ tab = eif_attribute( eif_access (my_obj), "tab", EIF_REFERENCE, NULL);
+ /* Return the attribute `tab' of type EIF_REFERENCE
+ * of the object `eif_access (my_obj)'.
+ */
+ i_tab = eif_protect (tab); /* Here, protect `tab'. */
+ /* some code */
+ eif_wean (my_obj);
+ eif_wean (i_tab); /* We do not need it any more. */
+ EIF_DISPOSE_ALL /* Reclaim memory allocated by Eiffel run-time. */
+}
+
+
+
+{{note|Although you must protect Eiffel references returned by eif_attribute, you do not have to protect attributes of basic types - they are not Eiffel references and not supposed to move. }}
+
+===Getting the type id of an Eiffel type: eif_type_id===
+'''# include "eif_gen_conf. h"''' # include "eif_gen_conf. h"
+
+
+EIF_TYPE_ID eif_type_id (char *type_string)
+
+
+Return the type identifier corresponding to the type described in type_string. If the type does not exist, is not visible or an instance of it is not declared in the root class, it returns EIF_NO_TYPE.
+
+COMPATIBILITY:
+eif_type_id is equivalent to eif_type_by_name.
+'''Example:''' type_id of STD_FILES so as to call 'put_string'.
+
+
+EIF_PROCEDURE p_put_string; /* 'put_string' from STD_FILES. */
+EIF_TYPE_ID tid;
+EIF_REFERENCE_FUNCTION fn_io; /* once function `io' from ANY (and STD_FILES by inheritance). */
+EIF_REFERENCE o_io; /* Eiffel object `io' returned by once function*/
+EIF_REFERENCE o_str; /* Eiffel string */
+EIF_OBJECT i_io, i_str; /* safe indirection pointers to ``io' and Eiffel string. */
+tid = eif_type_id ("STD_FILES");
+if (tid == EIF_NO_TYPE)
+ eif_panic ("Type not in system.");
+fn_io = eif_reference_function ("io", tid);
+o_io = (fn_io) (root_obj); /* `root_obj' is the root object of the CECIL system
+ * automatically initialized in EIF_INITIALIZED
+ * if it does not exists */
+i_io = eif_protect (o_io); /* Protect `io' . */
+o_str = eif_string ("Hello World"); /* Create Eiffel string */
+i_str = eif_protect (o_str); /* Protect Eiffel string. */
+p_put_string = eif_procedure ("put_string", tid);
+if (p_put_string == (EIF_PROCEDURE) 0) /* No routine found. */
+ eif_panic ("put_string not visible"); /* Raised if "visible exception" disabled. */
+(p_put_string) (eif_access (i_io), eif_access (i_str));
+
+
+
+eif_type_id is also used for returning the type identifier of generic types but you need to specify the generic parameter, otherwise it returns EIF_NO_TYPE.
+
+'''Example:'''
+
+
+EIF_PROCEDURE p_make; /* 'make' from ARRAY [INTEGER] . */
+EIF_TYPE_ID tid;
+tid = eif_type_id ("ARRAY[INTEGER]");
+p_make = eif_procedure ("make", tid);
+
+
+
+===Getting the type id of a generic type : eif_generic_type.===
+Obsolete: see eif_type_id.
+===Raising an eiffel panic: eif_panic.===
+''' # include "eif_except. h"'''
+
+
+void eif_panic(char *msg)
+
+
+ foo : STRING
+ external
+ "C | %"a file.h%""
+ end
+
+
+In C:
+
+EIF_REFERENCE foo () {
+ EIF_REFERENCE str;
+ EIF_OBJECT i_str;
+ str = eif_string ("Hello world");
+ i_str = eif_protect(str);
+ /* Some operations on `i_str' */
+ return eif_wean (i_str); /* Returns direct reference to the Eiffel string.
+ * No need to keep an extra reference from the C. */
+}
+
+
+===Getting the attribute from an Eiffel object: eif_attribute===
+
+```
+# include "eif_cecil. h"
+
+EIFFEL_TYPE eif_attribute (EIF_REFERENCE object, char *name, EIFFEL_TYPE, int *status)
+```
+
+Return the attribute of an Eiffel object.
+
+The `eif_attribute` macro returns the attribute of object of name, which is of type EIFFEL_TYPE.
+
+EIFFEL_TYPE is the type of the Eiffel attribute. It can be: EIF_INTEGER, EIF_POINTER, EIF_CHARACTER, EIF_BOOLEAN, EIF_DOUBLE, EIF_REAL or EIF_REFERENCE.
+
+If status is NULL then no status is set. Otherwise the status of the function is put in *status:
+*status = EIF_NO_ATTRIBUTE => no attribute found.
+*status = EIF_CECIL_OK => attribute found.
+*status = EIF_CECIL_ERROR => an undefined error occurred, object may be invalid.
+
+If the visible exception is enabled, then a visible exception is raised upon failure (EIF_NO_ATTRIBUTE, EIF_CECIL_ERROR).
+
+RETURN VALUE:
+Upon failure, it returns (EIFFEL_TYPE) 0, otherwise, the attribute is returned. If the return value is not a basic type, you must protect it with eif_protect.
+
+COMPATIBILITY:
+`eif_attribute (object, name, type, NULL)` is equivalent to `eif_field (object, name, type)`.
+
+{{tip|You cannot access a constant attribute, or the result of a function (once or not) with eif_attribute. Use eif_procedure or eif_xx_function instead. }}
+
+int i;
+i = eif_attribute_type ("count", eif_type_id ("STRING");
+printf ("type is %d\n"); /* Should be EIF_INTEGER_TYPE since it returns an Eiffel Integer */
+
+
+
+{{tip|*(EIFFEL_TYPE *) eif_attribute_safe (EIF_REFERENCE object, char *name, int type_int, int *status) can be used for debugging or type checking. It returns the attribute reference of name from the object of type type_int. status contains the status of the function call: it can be EIF_CECIL_OK, EIF_CECIL_ERROR, EIF_NO_ATTRIBUTE or EIF_WRONG_TYPE (type_int does not match with real type of object). }}
+
+===Getting the class name corresponding to a type id: eif_name===
+```
+#include "eif_cecil. h"
+
+char *eif_name (EIF_TYPE_ID tid)
+```
+
+Return the corresponding name (C string) of the Eiffel class, given a type identifier type_id. If the type identifier is a generic type identifier, no generic parameter type is given. Return NULL if an invalid type identifier is given.
+
+'''Example:'''
+
+`printf ("the class name with type id 1 is %s\n", eif_name (1); /* Should print "ANY" on most compiler versions */`
+
+COMPATIBILITY:
+
+`eif_name` is equivalent to `eif_name_by_tid`.
+
+===Getting the type id of an Eiffel object: eif_type, eif_type_by_reference.===
+```
+#include "eif_cecil. h"
+
+
+EIF_TYPE_ID eif_type (EIF_OBJECT object)
+
+EIF_TYPE_ID eif_type_by_reference (EIF_REFERENCE reference)
+```
+
+`eif_type` returns the type identifier, given an indirection pointer to an Eiffel object.
+
+`eif_type_by_reference` returns the type identifier, given the direct reference to an Eiffel object reference.
+
+COMPATIBILITY:
+`eif_type` is equivalent to `eif_type_by_object.eif_type (object)` is equivalent to `eif_type_by_reference (eif_access (object))`.
+
+===Converting a C array into an Eiffel array: eif_make_from_c.===
+```
+eif_make_from_c(eif_array, c_array, int nelts, int type) /* Macro */
+```
+(since 4. 5)
+
+
+`eif_array` is an `EIF_REFERENCE`, `c_array` is a C array of type `(type *)`, `nelts is the number of elements in the array.
+
diff --git a/documentation/18.11/solutions/other-languages/cecil/cecil-reference/attribute-exists.wiki b/documentation/18.11/solutions/other-languages/cecil/cecil-reference/attribute-exists.wiki
new file mode 100644
index 00000000..5b5f78f0
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/cecil/cecil-reference/attribute-exists.wiki
@@ -0,0 +1,24 @@
+[[Property:title|attribute_exists]]
+[[Property:weight|-15]]
+[[Property:uuid|7cdf93a7-6f63-869a-5443-b8908a086d18]]
+==Overview==
+
+#include "eif_cecil.h"
+
+EIF_BOOLEAN attribute_exists (EIF_REFERENCE object, char * name);
+
+
+==Description==
+The attribute_exists() macro returns EIF_TRUE when the attribute of name name exists in the Eiffel object (reference) object.
+==Return value==
+EIF_TRUE or EIF_FALSE.
+==Conformance==
+ISE Eiffel 4.5 and later.
+
+
+{{SeeAlso|
+#include "eif_hector.h"
+
+EIF_REFERENCE eif_access (EIF_OBJECT obj);
+
+
+==Description==
+The eif_access macro accesses the Eiffel object obj.
+
+==Return value==
+The Eiffel reference (EIF_REFERENCE) protected by obj which can be passed to Eiffel routines.
+
+==Conformance==
+ISE Eiffel 4.1 and later.
+
+
+{{SeeAlso|
+#include "eif_hector.h"
+
+EIF_OBJECT eif_adopt (EIF_OBJECT obj);
+
+
+==Description==
+The eif_adopt function adopts obj. By adopting it, the user prevents obj from being unprotected automatically by the Eiffel run-time. The run-time protects automatically the Eiffel objects passed to a C external before entering the external and unprotects them after exiting the C external. To keep this protection later on, you must call eif_adopt.
+
+==Return value==
+An EIF_OBJECT. This return value can be used later to access the nested, protected Eiffel reference with [[eif_access]].
+
+==Conformance==
+ISE Eiffel 4.1 and later.
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+int eif_attribute_type (char *attr, EIF_TYPE_ID tid);
+
+
+==Description==
+The eif_attribute_type function returns the type of the attribute attr, from the Eiffel type, which type identifier is tid.
+
+==Return value==
+
+Sucessful: One of the following:
+# EIF_INTEGER_TYPE
+# EIF_CHARACTER_TYPE
+# EIF_BOOLEAN_TYPE
+# EIF_DOUBLE_TYPE
+# EIF_REAL_TYPE
+# EIF_REFERENCE_TYPE
+# EIF_EXPANDED_TYPE
+# EIF_BIT_TYPE
+
+Failing: EIF_NO_TYPE
+
+==Conformance==
+ISE Eiffel 4.5 and later.
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+EIFFEL_TYPE eif_attribute (EIF_REFERENCE object, char * name, EIFFEL_TYPE, int * status);
+
+
+==Description==
+The eif_attribute macro returns the attribute of name name, which is of type EIFFEL_TYPE.
+EIFFEL_TYPE is the type of the Eiffel attribute. It can be one of the following:
+# EIF_INTEGER
+# EIF_CHARACTER
+# EIF_BOOLEAN
+# EIF_DOUBLE
+# EIF_REAL
+# EIF_REFERENCE
+
+If status is NULL then no status is set. Otherwise the status of the call is put into *status. Its value is one of the following:
+# EIF_NO_ATTRIBUTE
+# EIF_CECIL_OK
+
+If the visible exception is enabled, then a visible exception is raised upon failure (EIF_NO_ATTRIBUTE, EIF_CECIL_ERROR).
+
+==Return value==
+
+Successful: the Eiffel attribute.
+
+Failing: (EIFFEL_TYPE) 0
+
+==Notes==
+
+If the return value is an EIF_REFERENCE, you must protect it with [[eif_protect]].
+
+You cannot access a constant attribute, or the result of a once function with eif_attribute.
+
+==Conformance==
+
+ISE Eiffel 4.5 and later.
+
+==Compatibility==
+
+eif_attribute (object, name, type, NULL)
+
+is equivalent to:
+
+eif_field (object, name, type)
+
+which is deprecated.
+
+
+{{SeeAlso|
+#include "eif_cecil. h"
+
+EIF_OBJECT eif_create (EIF_TYPE_ID tid);
+
+
+==Description==
+The eif_create function creates an Eiffel object, which type identifier is tid.
+==Return value==
+It returns an Eiffel object, which is already protected.
+==Notes==
+You cannot pass the return value to Eiffel routines as is: you must call [[eif_access]] to pass it to Eiffel routine.
+
+To release the protection of an Eiffel object created with eif_create, call [[eif_wean]]. It will be collected during the next collection.
+
+==Conformance==
+
+ISE Eiffel 4.1 and later.
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+void eif_enable_visible_exception ();
+void eif_disable_visible_exception ();
+
+
+==Description==
+The [[eif_enable_visible_exception]] routine enables the visible exception, while [[eif_disable_visible_exception]] disables it. These routines can be used for debugging purpose. A visible exception is raised when the user tries to access to an Eiffel attribute or a Eiffel routine address which is not visible.
+
+The visible exception is disabled by default.
+
+==Conformance==
+
+ISE Eiffel 4.5 and later.
+
+==Compatibility==
+
+In ISE Eiffel 4.3 and 4.4, the visible exception is enabled by default.
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+void eif_enable_visible_exception ();
+void eif_disable_visible_exception ();
+
+
+==Description==
+The [[eif_enable_visible_exception]] routine enables the visible exception, while [[eif_disable_visible_exception]] disables it. These routines can be used for debugging purpose. A visible exception is raised when the user tries to access to an Eiffel attribute or a Eiffel routine address which is not visible.
+
+The visible exception is disabled by default.
+
+==Conformance==
+
+ISE Eiffel 4.5 and later.
+
+==Compatibility==
+
+In ISE Eiffel 4.3 and 4.4, the visible exception is enabled by default.
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+EIF_REFERENCE_FUNCTION eif_reference_function (char * name, int * tid);
+
+EIF_INTEGER_FUNCTION eif_integer_function (char * name, int * tid);
+
+EIF_CHARACTER_FUNCTION eif_character_function (char * name, int * tid);
+
+EIF_REAL_FUNCTION eif_real_function (char * name, int * tid);
+
+EIF_DOUBLE_FUNCTION eif_double_function (char * name, int * tid);
+
+EIF_BOOLEAN_FUNCTION eif_boolean_function (char * name, int * tid);
+
+EIF_POINTER_FUNCTION eif_pointer_function (char * name, int * tid);
+
+EIF_BIT_FUNCTION eif_bit_function (char * name, int * tid);
+
+
+==Description==
+
+These functions return the address of the Eiffel function of name name from the class, which type identifier is tid.
+
+{| border="1"
+! Use this function !! For an Eiffel function returning
+|-
+| eif_reference_function
+| Eiffel reference
+|-
+| eif_integer_function
+| Eiffel integer
+|-
+| eif_character_function
+| Eiffel character
+|-
+| eif_real_function
+| Eiffel real
+|-
+| eif_double_function
+| Eiffel double
+|-
+| eif_boolean_function
+| Eiffel boolean
+|-
+| eif_pointer_function
+| Eiffel pointer
+|-
+| eif_bit_function
+| Eiffel bit
+|}
+
+
+If the visible exception is enabled, it raises an visible exception upon failure.
+
+==Return value==
+
+Successful: The address of the function.
+
+Failing: NULL (function does not exist or is not visible).
+
+==Notes==
+
+The Eiffel function cannot be a C external. In this case, you must directly call the C routine.
+
+The return value is an address: to use it as a routine, you must call it with arguments or at least with ().
+
+No argument type checking is done. You may cast the address of an Eiffel routine, obtained with these functions, when calling it with real arguments.
+
+If the function returns an Eiffel reference, you must protect it with [[eif_protect]].
+
+==Conformance==
+ISE Eiffel 4.4 and later.
+
+==Compatibility==
+
+Compatibility with deprecated functions is shown in this table.
+
+
+{| border="1"
+! Function name !! Equivalent deprecated function name
+|-
+| eif_reference_function
+| eif_fn_ref
+|-
+| eif_integer_function
+| eif_fn_int
+|-
+| eif_real_function
+| eif_fn_float
+|-
+| eif_double_function
+| eif_fn_double
+|-
+| eif_character_function
+| eif_fn_char
+|-
+| eif_bit_function
+| eif_fn_bit
+|-
+| eif_boolean_function
+| eif_fn_bool
+|-
+| eif_pointer_function
+| eif_fn_pointer
+|}
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+char *eif_name_by_tid (EIF_TYPE_ID tid);
+
+
+==Description==
+
+The eif_name_by_tid function returns the name of the class corresponding to tid.
+
+==Return value==
+
+A statically allocated C string which is the name of the class. If tid is invalid, it returns NULL.
+
+==Conformance==
+
+ISE Eiffel 4.4 and later.
+
+==Compatibility==
+
+[[eif_name_by_tid]] is equivalent to [[eif_name]].
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+char *eif_name (EIF_TYPE_ID tid);
+
+
+==Description==
+
+The eif_name function returns the name of the class corresponding to tid.
+
+==Return value==
+
+A statically allocated C string which is the name of the class. If tid is invalid, it returns NULL.
+
+==Conformance==
+
+ISE Eiffel 4.4 and later.
+
+==Compatibility==
+
+[[eif_name]] is equivalent to [[eif_name_by_tid]].
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+EIF_PROCEDURE eif_procedure (char * name, int * tid);
+
+
+==Description==
+
+The eif_procedure function returns the address of the Eiffel procedure of name name from the class, which type identifier is tid.
+
+If the visible exception is enabled, it raises an visible exception upon failure.
+
+==Return value==
+
+Successful: Address of the procedure.
+Failing: NULL. (The procedure does not exist or is not visible).
+
+Otherwise, the address of the procedure is returned.
+
+==Notes==
+
+The Eiffel procedure cannot be a C external. In this case, you must directly call the C routine.
+
+The return value is an address: to use it as a routine, you must call it with arguments or at least with ().
+
+No argument type checking is done. You may cast the address of an Eiffel routine obtained with eif_procedure when calling it with real arguments.
+
+==Conformance==
+
+ISE Eiffel 4.4 and later.
+
+==Compatibility==
+
+eif_procedure is equivalent to eif_proc, which is deprecated.
+
+
+{{SeeAlso|
+#include "eif_hector.h"
+
+EIF_OBJECT eif_protect (EIF_REFERENCE ref);
+
+
+==Description==
+
+The eif_protect function protects the Eiffel reference ref from the garbage collector. It keeps a reference on it so that the garbage collector does not collect it if it is not referenced from Eiffel any longer.
+
+==Return value==
+
+The eif_protect function returns an EIF_OBJECT. This EIF_OBJECT can be used later on to access ref with [[eif_access]].
+
+==Conformance==
+
+ISE Eiffel 4.4 and later.
+
+==Compatibility==
+
+eif_protect is equivalent to henter, which is deprecated.
+
+
+{{SeeAlso|
+#include "eif_plug.h"
+
+EIF_REFERENCE eif_string (char * string);
+
+
+==Description==
+
+The eif_string macro returns an Eiffel string corresponding to the C string string.
+
+The return value does not reference string.
+
+==Notes==
+
+This function return an Eiffel reference, which must be protected with [[eif_protect]].
+
+==Conformance==
+
+ISE Eiffel 4.5 and later.
+
+==Compatibility==
+
+eif_string is equivalent to RTMS, which is deprecated.
+
+
+{{SeeAlso|
+#include "eif_gen_conf.h"
+
+EIF_TYPE_ID eif_type_id (char * type);
+
+
+==Description==
+
+The eif_type_id function returns the type identifier corresponding to type, which is the name of the type.
+
+==Return value==
+
+The type identifier of type.
+
+==Notes==
+
+An error cannot be caught by a visible exception.
+
+The type is not necessary visible.
+
+==Conformance==
+
+ISE Eiffel 4.3 and later.
+
+==Compatibility==
+
+eif_type_id is equivalent to [[eif_type_by_name]].
+
+With ISE Eiffel 4.2 and earlier, use eif_generic_type for generic types.
+
+
+{{SeeAlso|
+#include "eif_gen_conf.h"
+
+EIF_TYPE_ID eif_type_by_name (char * type);
+
+
+==Description==
+
+The eif_type_by_name function returns the type identifier corresponding to type, which is the name of the type.
+
+==Return value==
+
+The eif_type_by_name function returns the type.
+
+==Notes==
+
+An error cannot be caught by a visible exception.
+
+The type is not necessary visible.
+
+==Conformance==
+
+ISE Eiffel 4.3 and later.
+
+==Compatibility==
+
+eif_type_by_name is equivalent to [[eif_type_id]].
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+EIF_TYPE_ID eif_type_by_reference (EIF_REFERENCE reference);
+
+
+==Description==
+
+The eif_type_by_reference function returns the type identifier corresponding to reference.
+
+==Return value==
+
+Type identifier of reference.
+
+The behavior is unpredictable if reference is not a valid Eiffel reference.
+
+==Conformance==
+
+ISE Eiffel 4.5 and later.
+
+
+{{SeeAlso|
+#include "eif_cecil.h"
+
+EIF_TYPE_ID eif_type (EIF_OBJECT object);
+
+
+==Description==
+
+The eif_type function returns the type identifier corresponding to object.
+
+==Return value==
+
+Type identifier of object. The behavior is unpredictable if object is not a valid Eiffel object.
+
+==Conformance==
+
+ISE Eiffel 4.3 and later.
+
+==Compatibility==
+
+eif_type(object) is equivalent to eif_type_by_reference(eif_access(object)).
+
+
+{{SeeAlso|
+#include "eif_hector.h"
+
+EIF_REFERENCE eif_wean (EIF_OBJECT obj);
+
+
+==Description==
+
+The eif_wean function releases the protection of the Eiffel reference, which is protected by the Eiffel object obj.
+
+==Return value==
+
+The Eiffel reference previously protected by obj.
+
+==Conformance==
+
+ISE Eiffel 4.1 and later.
+
+
+{{SeeAlso|
+$ cecil
+Do you want to enable the visible exception? (y-yes, n-no):n
+Disable visible exception
+
+====== In eiffel_call ======
+ Eiffel type id = 9
+ Eiffel procedure make 0x100546b4
+ Eiffel object = 0x30068030
+Testing linked_list...
+12345
+test_linked_list OK
+Testing memory...
+Give string length (enter a high number for raising an Eiffel exception)
+234
+Memory OK
+Testing if string void ...
+Enter a string: (press enter if you want to raise an Eiffel exception)
+wefsd
+wefsdTesting precondition...By default it is true
+
+====== Done ======
+
+====== In eiffel_call ======
+ Eiffel type id = 9
+ Eiffel procedure test_linked_list 0x10054ebc
+ Eiffel object = 0x30068030
+Testing linked_list...
+12345
+test_linked_list OK
+
+====== Done ======
+
+====== In eiffel_call_1_arg ======
+ Eiffel type id = 9
+ Eiffel procedure print 0x1004e0a8
+ Eiffel object = 0x30068030
+ Eiffel object = 0x30068030
+Execute the Eiffel code `print (linked_list)' from the C side:
+MAIN [0x30068030]
+ linked_list: LINKED_LIST [0x30068C40]
+
+====== Done ======
+
+====== In cecil_test ======
+ protected indirection of 30068c40 is 300311bc
+ Eiffel type id of STRING = 198
+ Eiffel type id of LINKED_LIST [STRING] = 224
+ Linked List forth: 10222fbc
+ Linked list object = 0x30068c40
+Do you want to test the visibility of an Eiffel routine? (y-yes, n-no):
+n
+Do you want raise a precondition violation? (y-yes, n-no):
+n
+
+====== Done ======
+
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-c-eiffel.wiki b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-c-eiffel.wiki
new file mode 100644
index 00000000..075b365a
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-c-eiffel.wiki
@@ -0,0 +1,46 @@
+[[Property:title|CECIL - C to Eiffel]]
+[[Property:weight|0]]
+[[Property:uuid|c3b64ef2-28b2-920e-44fb-4cff2320c099]]
+==array==
+This example shows how to create an Eiffel array from an existing C array. After you have done the appropriate steps to compile the example, you will get a `cecil.exe` on windows, or `cecil` on Unix. Launch the program and you will be prompted for 10 integers that will be inserted in a C array, it will then initialize the Eiffel array and calls display from the MY_ARRAY class. A typical output will be:
+
+$ ./cecil
+Enter 10 integers:
+Enter element 1: 1
+Enter element 2: 2
+Enter element 3: 3
+Enter element 4: 4
+Enter element 5: 5
+Enter element 6: 6
+Enter element 7: 7
+Enter element 8: 8
+Enter element 9: 9
+Enter element 10: 10
+
+Display an Eiffel Array:
+@1 = 1
+@2 = 2
+@3 = 3
+@4 = 4
+@5 = 5
+@6 = 6
+@7 = 7
+@8 = 8
+@9 = 9
+@10 = 10
+
+
+==string==
+This example shows how to create an Eiffel string from an existing C string. After you have done the appropriate steps to compile the example, you will get a `cecil.exe` on windows, or `cecil` on Unix. Launch the program and you will be prompted for a string, it will then initialize the Eiffel string and calls io. put_string from the STD_FILES class. A typical output will be:
+
+$ ./cecil
+Enter a string to convert in Eiffel string:
+Hello World!
+Now printing the Eiffel string from Eiffel
+
+Hello World!
+
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-eiffel-c.wiki b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-eiffel-c.wiki
new file mode 100644
index 00000000..6a310b95
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-eiffel-c.wiki
@@ -0,0 +1,96 @@
+[[Property:title|CECIL - Eiffel to C]]
+[[Property:weight|1]]
+[[Property:uuid|3d1df3fe-2ac8-1ba3-c846-8329ea8a3772]]
+==array==
+
+This example shows how to create a C array from an existing Eiffel array.
+
+After you have done the appropriate steps to compile the example, you will get a `cecil.exe` on windows, or `cecil` on Unix.
+
+Launch the program and you will be prompted for 10 integers that will be inserted in an Eiffel array, it will then initialize the C array and display it.
+
+A typical output will be:
+
+$ ./cecil
+This example create n array on the Eiffel side and print it on the C side
+Enter 10 integers:
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+
+Displaying from C
+@1 = 1
+@2 = 2
+@3 = 3
+@4 = 4
+@5 = 5
+@6 = 6
+@7 = 7
+@8 = 8
+@9 = 9
+@10 = 10
+
+
+==object==
+This example shows the Eiffel memory management and all issues when passing an Eiffel object reference to C. In the example, you can edit the file `root_class.e` to modify the example:
+
+--give_to_c (o1)
+give_to_c_by_pointer ($o1) -- Choose the way you pass it
+
+When you choose the first possibility (commented by default), give_to_c will use the CECIL API eif_adopt to keep a reference on the Eiffel object. When you choose the second possibility, give_to_c_by_pointer will use the CECIL API eif_protect to keep a reference on the Eiffel object. Until forget_from_c is called from the C side, the object o1 will not be collected since we have protected it through the call to give_to_c or give_to_c_by_pointer. At the end after the object o1 is collected, we try to perform an operation on it which will fail with a call on void target exception. A typical output will be:
+
+$ cecil
+Creating o1
+Object string is o1
+Give it to C
+Losing reference to initial o1 from Eiffel
+Collecting...
+Display new o1:
+Object string is o2
+Display o1 given to C:
+Object string is o1
+Losing reference from C
+Losing reference from Eiffel
+Collecting...
+An Eiffel object of type OBJECT is collected
+Old o1 forgot from both C and Eiffel:
+Raise a Void exception..
+
+cecil: system execution failed.
+Following is the set of recorded exceptions:
+-------------------------------------------------------------------------------
+Class / Object Routine Nature of exception Effect
+-------------------------------------------------------------------------------
+ROOT_CLASS make @26 display:
+<30068030> Feature call on void target. Fail
+-------------------------------------------------------------------------------
+ROOT_CLASS make @26
+<30068030> Routine failure. Fail
+-------------------------------------------------------------------------------
+ROOT_CLASS root's creation
+<30068030> Routine failure. Exit
+-------------------------------------------------------------------------------
+An Eiffel object of type OBJECT is collected
+
+
+==string==
+This example shows how to create a C string from an existing Eiffel string. After you have done the appropriate steps to compile the example, you will get a `cecil.exe` on windows, or `cecil` on Unix. Launch the program and you will be prompted for a string from Eiffel and a C string will be created and display. A typical output will be:
+
+$ cecil
+Enter a string to convert into a C string:
+Hello World!
+
+Here is the C string:
+Hello World!
+
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-how-compile-samples.wiki b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-how-compile-samples.wiki
new file mode 100644
index 00000000..95b18e96
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-how-compile-samples.wiki
@@ -0,0 +1,41 @@
+[[Property:title|CECIL - How to compile the samples?]]
+[[Property:weight|4]]
+[[Property:uuid|3548e1b4-9488-10d5-561e-f817c15d6ff0]]
+==Compiling for Windows==
+
+Depending on your C compiler different steps have to be done, but do not forget to do the following before starting the C compiler specific part in a DOS console:
+set ISE_EIFFEL=XXX
+
+where XXX is the EiffelStudio installation directory.
+
+===With Borland C++:===
+
+By default, Borland C++ is not in your path, so you will have to first set your path correctly by typing:
+set PATH=%ISE_EIFFEL%\BCC55\bin;%PATH%
+
+If the file `Makefile. win' is present, then you can launch the compilation with:
+make -f Makefile. win
+
+Otherwise launch the compilation with:
+make -f Makefile. bcb
+
+===With Microsoft Visual C++:===
+
+By default, the command line tools of Visual C++ should be available from the command line.
+
+If the file `Makefile. win' is present, then you can launch the compilation with:
+nmake -f Makefile. win
+
+Otherwise launch the compilation with:
+nmake -f Makefile. msc
+
+==Compiling for UNIX==
+
+Then, make sure that your path to the EiffelStudio executables are properly configured before launching the command below.
+
+To compile and execute from scratch type:
+finish_freezing -library
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-threads.wiki b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-threads.wiki
new file mode 100644
index 00000000..dd22abe7
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/cecil-threads.wiki
@@ -0,0 +1,70 @@
+[[Property:title|CECIL - Threads]]
+[[Property:weight|3]]
+[[Property:uuid|44f2ee31-8634-6e54-f45a-8b36f780f888]]
+==bank_account==
+
+After you have done the appropriate steps to compile the example, you will get a `bank_account.exe` on windows, or `bank_account` on Unix.
+
+This program launches two types of threads:
+* the spenders withdraw some money from a shared bank account
+* the savers make some deposits on it.
+
+The Eiffel Threads are launched from C. The synchronization is done from Eiffel. The shared bank account is a C structure, and is updated by the Eiffel Threads using some C externals.
+
+
+$ bank_account
+**** Bank account report:
+Thread 0x30036350 DEPOSIT 161
+Thread 0x30036350 DEPOSIT 614
+Thread 0x30036350 DEPOSIT 626
+Thread 0x30036350 DEPOSIT 880
+Thread 0x30036350 DEPOSIT 601
+Thread 0x30036350 DEPOSIT 480
+Thread 0x30036350 DEPOSIT 177
+Thread 0x30036350 DEPOSIT 451
+Thread 0x30036350 DEPOSIT 96
+Thread 0x30036350 DEPOSIT 219
+*** BALANCE: 5305
+Do you want to continue? (y/n)
+y
+**** Bank account report:
+Thread 0x3003fcf0 DEPOSIT 161
+Thread 0x3004f088 DEPOSIT 161
+Thread 0x300567a0 WITHDRAWAL 161
+Thread 0x3005e1f0 WITHDRAWAL 161
+Thread 0x30036350 DEPOSIT 531
+Thread 0x3003fcf0 DEPOSIT 614
+Thread 0x3004f088 DEPOSIT 614
+Thread 0x300567a0 WITHDRAWAL 614
+Thread 0x30036350 DEPOSIT 409
+Thread 0x3003fcf0 DEPOSIT 626
+*** BALANCE: 7485
+Do you want to continue? (y/n)
+y
+**** Bank account report:
+Thread 0x3004f088 DEPOSIT 626
+Thread 0x30036350 DEPOSIT 799
+Thread 0x300567a0 WITHDRAWAL 626
+Thread 0x3005e1f0 WITHDRAWAL 614
+Thread 0x3003fcf0 DEPOSIT 880
+Thread 0x30036350 DEPOSIT 860
+Thread 0x3004f088 DEPOSIT 880
+Thread 0x300567a0 WITHDRAWAL 880
+Thread 0x30036350 DEPOSIT 307
+Thread 0x3004f088 DEPOSIT 601
+*** BALANCE: 10318
+
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/cecil/cecil-samples/index.wiki b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/index.wiki
new file mode 100644
index 00000000..95353be7
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/cecil/cecil-samples/index.wiki
@@ -0,0 +1,14 @@
+[[Property:title|CECIL samples]]
+[[Property:weight|5]]
+[[Property:uuid|dab15073-3970-7e47-a2d8-c926faa50ade]]
+Before trying the examples, please take a moment and look at the [[CECIL - How to compile the samples?|description]] that will explain how to compile the CECIL samples.
+
+Available samples include:
+* [[CECIL - C to Eiffel|C to Eiffel]]
+* [[CECIL - Eiffel to C|Eiffel to C]]
+* [[CECIL - Basic sample|Basic CECIL sample]]
+* [[CECIL - Threads|Threads]]
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/cecil/compiling-eiffel-system-cecil.wiki b/documentation/18.11/solutions/other-languages/cecil/compiling-eiffel-system-cecil.wiki
new file mode 100644
index 00000000..a2bada7e
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/cecil/compiling-eiffel-system-cecil.wiki
@@ -0,0 +1,35 @@
+[[Property:title|Compiling an Eiffel system for CECIL]]
+[[Property:weight|1]]
+[[Property:uuid|94a549df-1919-9dcd-82b3-1cd82e064a03]]
+==Compiling your Eiffel system for CECIL==
+It is very simple to "Cecilize" your Eiffel system, that is to say make its features available from the outside through CECIL. You will compile it as you normally would - either freeze it or finalize it. The only supplementary precaution is to make the features and classes that will be used by CECIL [[Group Options|visible]].
+
+==Building a CECIL archive==
+The EiffelStudio compiler produces both C code and a "Makefile". The Makefile compiles and links that C code in a subdirectory one level below the EIFGENs directory of a project. For frozen/melted code, the Makefile is located in the W_code subdirectory. For finalized code, it is in the F_code subdirectory.
+To produce a CECIL library, you must: open a shell (unix) or the MS-DOS prompt (Windows), go to the subdirectory that contains the Makefile, and then type:
+
+
+ make cecil (on unix and on windows with Borland)
+ nmake cecil (on windows with VC++)
+
+This generates a CECIL archive whose name derived from the name system name of the Eiffel system, as follows:
+
+
+ lib.a (on unix)
+ lib.lib (on Windows)
+
+
+For example, the corresponding archive for an Eiffel system called "test", would be called either "libtest.a" (Unix) or "libtest.lib" (Windows).
+Note that through CECIL you can use an Eiffel system compiled in any of the Eiffel compilation modes:
+* Finalized C code.
+* Workbench (melted/frozen) code, usually for development purposes. In this case you must copy the ''ld -o [name of your CECIL executable] [your C object files and archives]lib.a -lm
+
+
+{{note|On Unix, linking with "-lm" is required since the Eiffel run-time uses the standard math libraries. You may need to link with other libraries (for example, on linux: with "-lbsd", in MT mode with "-lpthread" (posix threads) or "-lthread" (solaris)). }}
+
+
+on Windows, with MS VC++:
+
+
+link [your link flags] -OUT:[name of your cecil executable] [your C object files and archives] lib.lib [other Windows libraries]
+
+
+
+on Windows with Borland:
+
+
+ilink32 -ap -c -Tpe main.obj c0w32.obj, [name of your cecil executable],,EIFGENs\target_name\W_code\lib.lib CW32 IMPORT32 OLE2w32,,
+
+
+
+===Notes for compiling CECIL C files:===
+The CECIL library is built automatically, which is unfortunately not the case of the corresponding object files of the cecil program you wrote. gcc -c -O -I$ISE_EIFFEL/studio/spec/$PLATFORM/include -I -D your_file.c
+
+
+or , if you are on Windows using MS VC++:
+
+
+cl -c -nologo -Ox -I$ISE_EIFFEL\studio\spec\windows\include -I -D your_file.c
+
+
+or, if you are on Windows using Borland:
+
+
+bcc32 -c -I$ISE_EIFFEL\studio\spec\windows\include -I -D your_file.c
+
+
+{{note|if you want to use the multithreaded facilities of Eiffel, you should define the EIFFEL MT flags by adding "-DEIF_THREADS" to the command line and follow the instructions of your C compiler and platform to find out which additional flags you may need. For example, on Solaris you need to add "-DSOLARIS_THREADS -D_REENTRANT". }}
+
+
+You can specify a Makefile in your configuration file, so that your C files will be compiled automatically after the Eiffel compilation and before the final linking. See [[Externals Options|the manipulation of external]] in the project settings to add $PATH_TO_MAKEFILE/your_makefile.
+
+
+This makefile will be run from the $/EIFGENs/target_name/W_code or $/EIFGENs/target_name/F_code directory. You should not give the CECIL executable the same name as your system, because it will be replaced by the Eiffel executable when you run another compilation.
+
+
+==Initializing the Eiffel run-time==
+Even though the main thread of control resides in the "C side" of the program, the Eiffel run-time must be initialized correctly before it can use CECIL facilities to communicate with the Eiffel world.
+In the C file containing the "main" C function, you must add the following line to include the header file "eif_setup. h" provided with this example:
+
+
+
+#include "eif_setup.h" /* Macros EIF_INITIALIZE and EIF_DISPOSE_ALL */
+#include "eif_eiffel.h" /* Exported functions of the Eiffel run-time */
+
+
+Your "main" function must have the three standard arguments of the C "main" function: "argc", "argv" and "envp" and include the following macros that are defined in "eif_setup. h":
+
+
+
+int main(int argc, char **argv, char **envp)
+ /* Please respect this signature: 'argc', 'argv' and 'envp' are used * in EIF_INITIALIZE. */
+{
+ /* declarations of variables */
+ /* Initialize the Eiffel run-time. */
+ EIF_INITIALIZE(failure)
+
+/* body of your "main" function */
+
+ /* Reclaim the memory allocated by the Eiffel run-time. */
+EIF_DISPOSE_ALL
+}
+
+
+{{note|The above mentioned macros must imperatively be in the body of the "main" function for the Eiffel exception handling mechanism to work correctly. You also need to add the Eiffel run time directory to the list of directories in which the C compiler searches for include files. You can do so by using the "-I" option of your C compiler. You can only link one CECIL library into your C applications at a time. }}
+
+
+{{caution|Even though external object files and archives are correctly specified in the "object" clause of the configuration file, you will need to explicitly link them to your C application. }}
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/index.wiki b/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/index.wiki
new file mode 100644
index 00000000..88899949
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/index.wiki
@@ -0,0 +1,17 @@
+[[Property:title|Eiffel "external" mechanism]]
+[[Property:weight|0]]
+[[Property:uuid|b6ea568d-a9d3-3220-7957-d9c81620e885]]
+{{UnderConstruction}}
+
+
+The Eiffel mechanism for interfacing with other languages, as defined by the [[ECMA Standard 367|Eiffel standard (8.31)]] uses a syntax for '''external''' features, that is, features that are in languages or libraries external to Eiffel.
+
+Additionally, there is a notion of such external languages being either '''registered''' or '''unregistered'''. A language is registered if every Eiffel implementation must support the external interface to this language as defined by the standard. So the names of all registered languages appear in the Eiffel standard. And the details of the specific external mechanisms for those languages also appear in the standard. Registered languages included in the June 2006 edition of the standard are '''"C"''', '''"C++"''', and '''"dll"'''.
+
+The case of unregistered languages is simply that there is no guarantee that such a language is supported by any particular Eiffel compiler. So, a the name of an unregistered language might appear as '''"Cobol"''' or '''"Ada"'''. These names may be meaningful to particular Eiffel compilers, but from the standpoint of the standard they are arbitrary manifest strings.
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/interfacing-c-and-c.wiki b/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/interfacing-c-and-c.wiki
new file mode 100644
index 00000000..93383c7c
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/interfacing-c-and-c.wiki
@@ -0,0 +1,132 @@
+[[Property:modification_date|Mon, 03 Sep 2018 08:31:04 GMT]]
+[[Property:publication_date|Mon, 03 Sep 2018 08:28:15 GMT]]
+[[Property:title|Interfacing with C and C++]]
+[[Property:weight|0]]
+[[Property:uuid|dcc4e216-307b-46ec-1bc1-a15da8b99469]]
+{{UnderConstruction}}
+
+
+Interfacing with C and C++ are similar enough that both can be covered together. There are two basic mechanisms available. The first and simpler of the two uses an existing routine and is available only to C externals. Using this approach you simply specify the '''signature''' of an existing C function along with where the function can be found. The second mechanism allows you to write C or C++ code inline. The second option is always recognizable by the presence of the word "'''inline'''" in the external specification. Again, the '''inline''' option is the only one allowed for C++ externals.
+
+==Using an existing C function==
+
+Here is an example of an external targeting an existing C function. In this case it's the floor function from the C library.
+
+
+ floor (v: DOUBLE): DOUBLE
+ -- Floor of `v'
+ external
+ "C signature (double): double use "
+ end
+
+
+The Eiffel external function floor now gives Eiffel code access to the C library function of the same name.
+
+Here external is an Eiffel keyword that introduces the external specification that appears in the quoted string that follows. (The quoted string is actually an Eiffel [[ET: Other mechanisms|manifest string]], so it could actually be a simple quoted string or a [[ET: Other mechanisms|verbatim string]].) Within the quoted string we find first the registered language designator, in this case "C", followed by the function's signature, followed by the location in which the C function can be found. The terms "signature" and "use" within the quoted string are technically not Eiffel language keywords, but are keywords used in the specification of externals. There is one other similar keyword "inline" which can be used, but we will address it later.
+
+The "signature" consists of the types of the arguments to C function as well as the function's return type. The argument types are separated by commas in a list enclosed in parentheses. A colon precedes the function type. In cases in which the target function takes no arguments, it is not necessary to include a set of empty parentheses in the signature. However, for compatibility purposes, the empty parentheses are allowed.
+
+The "use" part denotes provides a file name or list of file names. File names can be either "user" file names or "system" file names. In the case of our example, a system file name "" is used. System files are those that should be found by the system with no additional information. System file names are enclosed in angle brackets. User file names are included in a quoted string. User file names will be passed as written to the operating system. Remember that when coding a user file name, that because it already occurs within a quoted string, you must use the percent sign to code the quotation marks inside a quoted string, for example:
+
+
+ "C signature (double): double use %"my_c_header.h%""
+
+
+Alternatively, you could code the external as a verbatim string. This would make the percent signs unnecessary.
+
+There's one more thing to note about using existing C functions. In the floor example above, the Eiffel function has the same name as the C function it targets. But that may not always be the case. It's possible that the C function name might conflict with a name already established in your class, or might conflict with Eiffel naming conventions. Suppose you wanted to call the Eiffel routine my_floor instead of floor. You could use the alias part of the external specification to state that the actual C function name differs from the Eiffel name, as shown below.
+
+
+ my_floor (v: DOUBLE): DOUBLE
+ -- Floor of `v'
+ external
+ "C signature (double): double use "
+ alias
+ "floor"
+ end
+
+
+
+==Inline externals==
+
+In addition to using an existing C function, you can, for both C and C++, create an '''inline''' external. The idea here is that you write the necessary C or C++ language within the definition of the external. In the case of inline externals the alias part is used to contain the inline code rather than a function name. Your inline C and C++ code can access the arguments of the external feature. Let's look at my_floor written as an inline external:
+
+
+ my_floor (v: DOUBLE): DOUBLE
+ -- Floor of `v'
+ external
+ "C inline use "
+ alias
+ "return floor($v)"
+ end
+
+
+In the alias part you see a line of C code calling the library function floor and returning the result. The argument to the call to floor needs to be the argument to the Eiffel function my_floor. To do this in the inline C code, the dollar sign ('$') precedes the argument name "v". So, the convention in inline externals is to use the dollar sign in C or C++ code to reference an argument of the Eiffel function.
+
+The example below is a C++ example that involves more complex processing in the alias part.
+
+
+ c_height (a_framework: POINTER): INTEGER
+ -- Get ribbon height
+ require
+ a_framework_exists: a_framework /= default_pointer
+ external
+ "C++ inline use "
+ alias
+ "{
+ UINT32 val;
+ HRESULT hr = S_OK;
+
+ IUIRibbon* pRibbon = NULL;
+ if (SUCCEEDED(((IUIFramework *) $a_framework)->GetView(0, IID_IUIRIBBON, (void **) &pRibbon))) {
+ hr = pRibbon->GetHeight(&val);
+ pRibbon->Release();
+ }
+ return (EIF_INTEGER) val;
+ }"
+ end
+
+
+
+==Rules for C and C++ externals==
+
+===C external validity===
+
+A C external is valid if it satisfies the following conditions:
+
+# It specifies either an external signature or an inline routine.
+# If it specifies an inline routine, then
+## The C text of the routine follows the alias keyword.
+## For any occurrence, within the C text, of an identifier following a dollar sign ('$'), the identifier must be the name of an argument of the external routine.
+
+
+===C++ external validity===
+
+A C++ external is valid if it satisfies the following conditions:
+
+# It specifies an inline routine with the C++ text of the routine occurring after the alias keyword.
+# For any occurrence, within the C++ text, of an identifier following a dollar sign ('$'), the identifier must be the name of an argument of the external routine.
+
+
+===External file name validity===
+
+An external file name appearing after the "use" is valid if it satisfies the following conditions:
+
+# It denotes a file when interpreted according to the conventions of the underlying operating system.
+# The file is accessible for reading.
+# The file contains content valid in the target language.
+
+The first condition means that user file names must conform to the path and file names of the target environment. Such file names will be passed on to the operating system as they appear. And for system file names, those enclosed in angle brackets, this means that they must be found where the operating system would expect such system files to reside.
+
+Some parts of the validity of external file names may not be able to be determined by an Eiffel compiler and thus ultimately depend upon the evaluation of an external compiler. For example, the Eiffel compiler might not be able to determine whether a particular C file contains valid content.
+
+
+==Related pages or articles==
+{{seealso|
+ my_cdecl_routine (a: INTEGER): POINTER
+ -- Encapsulation of a dll function with the `_cdecl' call mechanism.
+ external
+ "C [dll32 %"my_cdecl_dll.dll%"] (int): EIF_POINTER"
+ end
+
+ my_stdcall_routine (a: INTEGER): POINTER
+ -- Encapsulation of a dll function with the `_stdcall' call mechanism.
+ external
+ "C [dllwin32 %"my_stdcall_dll.dll%"] (int): EIF_POINTER"
+ end
+
+
+{{note|Most OS services provided by the Win32 API use the __stdcall calling convention.}}
+
+{{warning|Getting '''dll32''' and '''dllwin32''' reversed will cause your application's call stack to be corrupted. This will cause your application to malfunction, can cause it to crash, and can potentially crash your whole system. So getting this right is crucial to smooth implementation of external DLL calls. For more information please consult your C compiler documentation.}}
+
+
diff --git a/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/obsolete-external-interfaces/c-externals-0.wiki b/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/obsolete-external-interfaces/c-externals-0.wiki
new file mode 100644
index 00000000..456d7c9d
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/obsolete-external-interfaces/c-externals-0.wiki
@@ -0,0 +1,302 @@
+[[Property:title|C++ Externals]]
+[[Property:weight|2]]
+[[Property:uuid|e74e2661-5d7f-2f08-5279-1c24fd16a532]]
+==Introduction==
+
+Before making C++ calls in EiffelStudio, you may want to learn the basics of making [[C externals|C calls]] , since these basics are not repeated here but they might be useful for C++ users as well and are necessary to fully benefit from this document.
+
+==Overview==
+
+Eiffel software must interact with software written in other languages. In this document you will learn about how to incorporate C++ classes in your Eiffel software.
+
+The C++/Eiffel interface offers the following mechanisms:
+* You can create instances of C++ classes from Eiffel, using the C++ "constructor" of your choice.
+* You can apply to these objects all the corresponding operations from the C++ class: executing functions ("methods"), accessing data members, executing destructors.
+* On Windows, you can use the Legacy++ tool to produce an Eiffel "wrapper class" encapsulating all the features of a C++ class, so that the result will look to the rest of the Eiffel software as if it had been written in Eiffel.
+
+The discussion concentrates on using C++ software from Eiffel. In the other direction, you can use [[CECIL|the Cecil library (C-Eiffel Call-In Library)]] .
+
+==Syntax specification==
+
+In the following specification, the syntax for External and External_name is retained unchanged from ''Eiffel: The Language'', where Language_name is defined simply as Manifest_string; the rest covers the additional facilities.
+
+External == external Language_name [External_name]
+
+Language_name ==
+ '"'
+ Basic_language_name
+ [Special_external_declaration]
+ [Signature]
+ [Include_files]
+ '"'
+
+Basic_language_name == "C" | "C++"
+
+Special_external_declaration == "[" Special_feature "]"
+
+Special_feature == Special_C_feature | Special_C++_feature
+
+Special_C_feature == -- .... See appendix E of Eiffel: The Language...
+
+Special_C++_feature ==
+ Member_function_call|
+ Static_function_call |
+ Object_creation |
+ Object_deletion |
+ Data_member_access |
+
+Member_function_call == C++_Class
+
+C++_Class == Class_name File_name
+
+Class_name == Identifier
+
+Static_function_call == static C++_Class
+
+Object_creation == new C++_Class
+
+Object_deletion == delete C++_Class
+
+Data_member_access == data_member C++_Class
+
+ -- The remaining elements are repeated
+ -- from the C interface specification (page 291 in Eiffel: The Environment).
+
+File_name == User_file_name | System_file_name
+
+User_file_name == '%"' Manifest string '%"'
+
+System_file_name == "<" Manifest_string ">"
+
+Signature == "(" Type_list ")" [Result_type]
+
+Type_list == {Type "," ...}
+
+Result_type == ":" Type
+
+Include_files == "|" File_list
+
+File_list == {File_name "," ...}
+
+External_name == alias Manifest_string
+
+
+
+As with the C extensions of the previous appendix, the syntax description conventions are those of ''Eiffel: The Language''. == means "is defined as". The vertical bar | separates alternative choices, such as the three possibilities for Special_feature. The brackets [...] enclose optional components; for example a Language_name is made of required quotes, a required Basic_language_name and three further components, any or all of which may be absent. The notation {Element Separator ...} means: 0 or more occurrences ("specimens") of Element separated, if more than one, by Separator.
+
+Several of the symbols of the syntax notation, such as the brackets or the vertical bar, also appear in the language; to avoid any confusion they are given in double quotes. For example the specification for Include_files begins with "|" to indicate that an Include_files part starts with a vertical bar. Single quotes may be used instead of double quotes when one of the quoted characters is itself a double quote; for example '%"' appearing in the production for User_file_name denotes the percent character followed by the double quote character. Special words such as '''static''' in bold italics stand for themselves, unquoted.
+
+==Available possibilities==
+
+===Processing C++ features===
+
+A Special_C++_feature, if present, indicates one of the following, all illustrated by examples in the next sections:
+* If the special feature's declaration simply starts with a C++ class name, followed by the associated file name, it indicates that the Eiffel feature will call a C++ member function (also known as a "method") from that class. The name of the member function is by default the same as the name of the Eiffel feature; as usual, you can specify a different name through the alias clause of the external declaration.
+* If the declaration starts with static, it indicates a call to a C++ static function.
+* If the declaration starts with new, it indicates a call to one of the constructors in the C++ class, which will create a new instance of that class and apply to it the corresponding constructor function.
+* If the declaration starts with delete, it indicates a call to a destructor from the C++ class. In this case the Eiffel class may inherit [[ref:libraries/base/reference/memory_chart|MEMORY]] and redefine the dispose procedure to execute the destructor operations whenever the Eiffel objects are garbage-collected.
+* If the declaration starts with data_member, it indicates access to a data member (attribute in Eiffel terminology) from the C++ class.
+
+The rest of the possible components are the same as in the C interface: Signature to specify types for arguments and results; possible Include file.
+
+===Extra argument===
+
+For a non-static C++ member function or destructor, the corresponding Eiffel feature should include an extra argument of type POINTER, at the first position. This argument represents the C++ object to which the function will be applied.
+
+For example, a C++ function
+void add(int new_int);
+
+should have the Eiffel counterpart
+
+ cpp_add (obj: POINTER; new_int: INTEGER)
+ -- Encapsulation of member function add.
+ external
+ "C++ [IntArray %"intarray.h%"] (IntArray *, int)"
+ end
+
+This scheme, however, is often inconvenient because it forces the Eiffel side to work on objects in a non-object-oriented way. (The object-oriented way treats the current object, within a class, as implicit.) A better approach, used by Legacy++, is to make a feature such as cpp_add secret, and to export a feature whose signature corresponds to that of the original C++ function, with no extra object argument; that feature will use a secret attribute object_ptr to access the object. In the example this will give the feature
+
+ add (new_int: INTEGER)
+ -- Encapsulation of member function add.
+ do
+ cpp_add (object_ptr, new_int)
+ end
+
+
+where ''object_ptr'' is a secret attribute of type
+class IntArray {
+ public:
+ IntArray(int size);
+ ~IntArray();
+ void output();
+ void add(int new_int);
+ static char * type();
+
+ protected:
+ int *_integers;
+};
+
+
+Here is the result of applying Legacy++ to that class, which will serve as an illustration of both the C++ interface mechanisms and Legacy++:
+
+note
+ description: "Eiffel encapsulation of C++ class IntArray";
+ date: "$Date: 2006-10-12 03:18:50 +0200 (Thu, 12 Oct 2006) $";
+ revision: "$Revision: 64319 $"
+
+class
+ INTARRAY
+
+inherit
+ MEMORY
+ redefine
+ dispose
+ end
+
+create
+ make
+
+feature -- Initialization
+
+ make (size: INTEGER)
+ -- Create Eiffel and C++ objects.
+ do
+ object_ptr := cpp_new (size)
+ end
+
+feature-- Removal
+
+ dispose
+ -- Delete C++ object.
+ do
+ cpp_delete (object_ptr)
+ end
+
+feature
+
+ output
+ -- Call C++ counterpart.
+ do
+ cpp_output (object_ptr)
+ end
+
+ add (new_int: INTEGER)
+ -- Call C++ counterpart.
+ do
+ cpp_add (object_ptr, new_int)
+ end
+
+feature {INTARRAY}
+
+ underscore_integers: POINTER
+ -- Value of corresponding C++ data member.
+ do
+ Result := underscore_integers (object_ptr)
+ end
+
+feature {NONE} -- Externals
+
+ cpp_new (size: INTEGER): POINTER
+ -- Call single constructor of C++ class.
+ external
+ "C++ [new IntArray %"INTARRAY.H%"] (EIF_INTEGER)"
+ end
+
+ cpp_delete (cpp_obj: POINTER)
+ -- Call C++ destructor on C++ object.
+ external
+ "C++ [delete IntArray %"INTARRAY.H%"] ()"
+ end
+
+ cpp_output (cpp_obj: POINTER)
+ -- Call C++ member function.
+ external
+ "C++ [IntArray %"INTARRAY.H%"] ()"
+ alias
+ "output"
+ end
+
+ cpp_add (cpp_obj: POINTER; new_int: INTEGER)
+ -- Call C++ member function.
+ external
+ "C++ [IntArray %"INTARRAY.H%"] (EIF_INTEGER)"
+ alias
+ "add"
+ end
+
+ cpp_underscore_integers (cpp_obj: POINTER): POINTER
+ -- Value of C++ data member
+ external
+ "C++ [data_member IntArray %"INTARRAY.H%"]: EIF_POINTER"
+ alias
+ "_integers"
+ end
+
+feature {NONE} -- Implementation
+
+ object_ptr: POINTER
+
+end -- class INTARRAY
+
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/obsolete-external-interfaces/c-externals.wiki b/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/obsolete-external-interfaces/c-externals.wiki
new file mode 100644
index 00000000..43ed03ad
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/eiffel-external-mechanism/obsolete-external-interfaces/c-externals.wiki
@@ -0,0 +1,224 @@
+[[Property:title|C externals]]
+[[Property:weight|1]]
+[[Property:uuid|f6a5ce2d-882b-27a2-ad6e-2e4c36027528]]
+==General consideration==
+
+As Eiffel Software's technology relies heavily on the use of a C/C++ ANSI compiler, you have to be sure to always put the correct signature of an external C/C++ routine. If it was not the case, the C compilation of your system could fail. Most of the time a C compiler is more comprehensive than a C++ compiler and most type errors won't cause you any harm, but C++ compilers are not as lax as C compilers and they will mostly generate errors.
+
+The sections concerning [[#macros|Macros]] and [[#structs|Structs]] are also available for C++ if the macro or the struct is defined in a C++ header file.
+
+
+
+==C routines==
+
+You can encapsulate routines that are defined in a C header file. We will take some examples and will show you how to write wrappers in Eiffel.
+
+If in a header file called `my_header.h`, you have the following declaration:
+
+ /* Routine with no parameter */
+extern void no_param(void);
+
+ /* Routine with one parameter */
+extern void one_param(int j);
+
+ /* Routine returning a value with no parameter */
+extern size_t no_param_return(void);
+
+ /* Routine returning a value with one parameter */
+extern size_t one_param_return(FILE *f);
+
+
+Here is the corresponding Eiffel code:
+
+ c_no_param
+ -- Encapsulation of a C routine with no parameter.
+ external
+ "C | %"my_header.h%""
+ alias
+ "no_param"
+ end
+
+ c_one_param (i: INTEGER)
+ -- Encapsulation of a C routine with one parameter.
+ external
+ "C (int) | %"my_header.h%""
+ alias
+ "one_param"
+ end
+
+ c_no_param_return: INTEGER
+ -- Encapsulation of a C routine with no parameter
+ -- returning an INTEGER
+ external
+ "C (): EIF_INTEGER| %"my_header.h%""
+ alias
+ "no_param_return"
+ end
+
+ c_one_param_return (p: POINTER): INTEGER
+ -- Encapsulation of a C routine with one parameter
+ -- returning an INTEGER
+ external
+ "C (FILE *): EIF_INTEGER| %"my_header.h%""
+ alias
+ "one_param_return"
+ end
+
+
+
+==Macros==
+
+If in a header file called `my_header.h`, you have the following declaration:
+
+ /* Predefined constants */
+#define ID_MENU 128
+#define ID_MENU_CHARACTER 'c'
+
+ /* Access the 'i'-th element of 'a' where 'a' * is an array of EIF_INTEGER */
+#define i_th(a,i)((a) + (i)*sizeof(EIF_INTEGER))
+
+
+Then, the corresponding Eiffel code will look like:
+
+
+
+ menu_id: INTEGER
+ -- `ID_MENU' C encapsulation.
+ external
+ "C [macro %"my_header.h%"] : EIF_INTEGER"
+ alias
+ "ID_MENU"
+ end
+
+ menu_id_character: CHARACTER
+ -- `ID_MENU_CHARACTER' C encapsulation.
+ external
+ "C [macro %"my_header.h%"] : EIF_CHARACTER"
+ alias
+ "ID_MENU_CHARACTER"
+ end
+
+ i_th (p: POINTER; i: INTEGER): INTEGER
+ -- Access the `i'-th element of `p', array of C EIF_INTEGER.
+ external
+ "C [macro %"my_header.h%"] (EIF_INTEGER *, EIF_INTEGER): EIF_INTEGER"
+ alias
+ "i_th"
+ end
+
+
+
+==Structs==
+
+The struct encapsulation enables you to wrap C/C++ structures easily without having to write any additional code in a C header file as it was the case until Eiffel Software introduced this new keyword in the external specification with the 4.5 release of the Eiffel Software environment. With the struct encapsulation you can set and retrieve the value of a certain field of a struct.
+
+If in a header file called `my_header.h`, you have the following declaration of the `Point` structure whose `x` and `y` fields we want to access and set:
+
+
+
+ /* Definition of `Point' */
+typdef struct point {
+ int x;
+ int y;
+} Point;
+
+
+Then, the corresponding Eiffel code will look like:
+
+ x (p: POINTER): INTEGER
+ -- Access field x of struct pointed by `p'.
+ external
+ "C [struct %"my_header.h%"] (Point): EIF_INTEGER"
+ alias
+ "x"
+ end
+
+ y (p: POINTER): INTEGER
+ -- Access field y of struct pointed by `p'.
+ external
+ "C [struct %"my_header.h%"] (Point): EIF_INTEGER"
+ alias
+ "y"
+ end
+
+ set_x (p: POINTER; v: INTEGER)
+ -- Set field x of struct pointed by `p'.
+ external
+ "C [struct %"my_header.h%"] (Point, int)"
+ alias
+ "x"
+ end
+
+ set_y (p: POINTER: v: INTEGER)
+ -- Set field y of struct pointed by `p' with `v'.
+ external
+ "C [struct %"my_header.h%"] (Point, int)"
+ alias
+ "y"
+ end
+
+
+
+==Windows externals==
+
+===DLLs===
+
+With EiffelStudio you now have two different ways to call C routines exported in a DLL. Why two, because Windows provides two ways to call a C routine in a DLL:
+* _cdecl: referred to as the standard way
+* __stdcall referred to as the Pascal way
+
+Therefore if you want to call an external routine defined in a DLL supposed to be called using the `_cdecl` method, you have to use the '''dll32''' sub-language option. For `__stdcall` you need to use the '''dllwin32''' sub-language option. Here is an example:
+
+
+
+ my_cdecl_routine (a: INTEGER): POINTER
+ -- Encapsulation of a dll function with the `_cdecl' call mechanism.
+ external
+ "C [dll32 %"my_dll.dll%"] (int): EIF_POINTER"
+ end
+
+ my_stdcall_routine (a: INTEGER): POINTER
+ -- Encapsulation of a dll function with the `_stdcall' call mechanism.
+ external
+ "C [dllwin32 %"my_dll.dll%"] (int): EIF_POINTER"
+ end
+
+
+{{warning|Using '''dll32''' in cases calling for '''dllwin32''' and vice versa will cause your system to crash, because the C call stack will be corrupted. For more information please read your C compiler documentation. }}
+
+
+===Windows API===
+
+As described in the previous section concerning routines exported in a DLL, the Windows API is using the `__stdcall` convention. As a consequence, you cannot use the standard external mechanism to wrap them because it is using the `_cdecl` convention. However, you can easily wrap those function by using the '''macro''' sub-language.
+
+Here is an example that has been taken from WEL, the Windows Eiffel Library, to encapsulate the Windows `SendMessage` function:
+Windows defined SendMessage as:
+
+
+LRESULT SendMessage(
+ HWND hWnd, // handle to destination window
+ UINT Msg, // message
+ WPARAM wParam, // first message parameter
+ LPARAM lParam // second message parameter
+);
+
+
+In WEL, the encapsulation is written as:
+
+
+
+ cwin_send_message (hwnd: POINTER; msg, wparam, param: INTEGER)
+ -- SDK SendMessage (without the result)
+ external
+ "C [macro %"wel.h%"] (HWND, UINT, WPARAM, LPARAM)"
+ alias
+ "SendMessage"
+ end
+
+
+{{seealso|
+(Java Code)
+
+class test
+{
+ test ()
+ {
+ my_integer = 10;
+ }
+
+ public int my_integer;
+ public static int my_static_integer;
+ public void my_method (int arg_int, String arg_string)
+ {
+ my_static_integer = arg_int;
+ my_integer = arg_int;
+ }
+}
+
+
+In order to run properly you need to read [[Eiffel2Java|the library requirement]] .
+
+===Compiling the example===
+
+Since the example is using the `test.java` class, the first step is to compile the java class using the `javac` command line utility from the JDK. Once it is done, copy the `test.class` either into $ISE_EIFFEL\examples\Eiffel2Java\EIFGENs\classic\W_code or else into $ISE_EIFFEL\examples\Eiffel2Java\EIFGENs\classic\F_code, depending on your compilation mode (freezing vs. finalizing).
+
+===Running the example===
+
+Once the example is compiled, you can run it and here is the expected output:
+
+$ sample
+Creating instance of class `test'
+Value of `my_integer' is 10
+Value of `my_static_integer' is 0
+Calling `my_method' with (2, "String test")
+Value of `my_integer' after call to `my_method' is 2
+
+
+===Code description===
+(Eiffel Code)
+
+class
+ EIFFEL_TO_JAVA
+inherit
+ SHARED_JNI_ENVIRONMENT
+
+create
+ make
+
+feature -- Creation
+
+ make
+ local
+ class_test: JAVA_CLASS
+ instance_of_class_test: JAVA_OBJECT
+ fid: POINTER
+ value: INTEGER
+ j_args: JAVA_ARGS
+ do
+ --| Creation of the Java object
+ class_test := jni.find_class ("test")
+ create instance_of_class_test.create_instance (class_test, "()V", Void)
+
+ --| Access to a public attribute
+ fid := instance_of_class_test.field_id ("my_integer", "I")
+
+ -- 'fid' contains the id of the field 'my_integer'
+ -- 'value' contains the value of the field referenced
+ -- by 'fid'
+
+ value := instance_of_class_test.integer_attribute (fid)
+
+ --| Access to a static attribute using directly the JAVA_CLASS
+ fid := class_test.field_id ("my_static_integer", "I")
+ value := class_test.integer_attribute (fid)
+
+
+ --| Access to a static attribute using the attribute 'jclass'
+ fid := instance_of_class_test.jclass.field_id ("my_static_integer", "I")
+ value := instance_of_class_test.jclass.integer_attribute (fid)
+
+ --| Access to the method 'my_method'
+ -- Get the id of 'my_method'
+ fid := instance_of_class_test.method_id ("my_method", "(ILjava/lang/String;)V")
+
+ -- Create the set of arguments for 'my_method'
+ create j_args.make(2)
+ j_args.push_int (2)
+ j_args.push_string("String test")
+
+ -- Create the set of arguments for 'my_method'
+ -- Call to the void method referenced by 'fid'
+ instance_of_class_test.void_method (fid, j_args)
+ end -- make
+
+end -- class EIFFEL_TO_JAVA
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/eiffel2java/eiffel2java-tutorial.wiki b/documentation/18.11/solutions/other-languages/eiffel2java/eiffel2java-tutorial.wiki
new file mode 100644
index 00000000..fd54efea
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/eiffel2java/eiffel2java-tutorial.wiki
@@ -0,0 +1,159 @@
+[[Property:title|Eiffel2Java Tutorial]]
+[[Property:weight|0]]
+[[Property:uuid|2d0fc62b-90e9-650b-2896-d92db66899c9]]
+==Introduction==
+
+The Java interface allows you to call Java routines or attributes from your Eiffel code. It uses the Java Native Interface (JNI) provided by the Java Development Kit (JDK). You can get more information about the JNI at:
+
+[http://java.sun.com/j2se/1.5.0/docs/guide/jni/ http://java.sun.com/j2se/1.5.0/docs/guide/jni/]
+
+===Requirements===
+* JDK 1.1.8 or newer should be correctly set up (download it at [http://java.sun.com/javase/downloads/index.jsp http://java.sun.com/javase/downloads/index.jsp] )
+* The environment variable CLASSPATH should defined (check with the JDK documentation on how to do so) and that it contains the Java classes you want to access.
+* The environment variables should be setup correctly. See $ISE_EIFFEL\library\Eiffel2Java\README.txt for information how to do this.
+
+===Limitations===
+* In this version, you can only use one JNI environment.
+* Only one thread can interact with the Java Virtual Machine (JVM).
+* It is not possible to call Eiffel features from Java program.
+* The Eiffel feature `destroy_vm` of `JAVA_VM` calls a C function of the Java NativeInterface that is not fully implemented in jdk 1.1.8. This function, called DestroyJavaVM, always returns -1 in jdk 1.1.8. For further information, go on the JNI pages at the address above.
+
+==Interface classes==
+
+===JNI_ENVIRONMENT===
+
+Holds information about JNI environment. Potentially many JNI environments can exists at once, but more than one was never tested. This class provide the facilities to interact with the JVM:
+* creation of instances of Java Classes
+* exceptions mechanism
+* destruction of the JVM
+
+===SHARED_JNI_ENVIRONMENT===
+
+Shared JNI environment. Since one JNI is needed per thread we limit Eiffel to having one thread that deals with Java. The class that calls Java routines or attributes must inherit from this class.
+
+===JAVA_VM===
+
+This class is used to initially load the JVM into the running program. This is the Eiffel representation of the JVM.
+
+===JAVA_CLASS===
+
+Access to Java classes. Static methods and attributes are accessed via this class.This is the Eiffel representation of a Java Class.
+
+===JAVA_OBJECT===
+
+This class gives Eiffel access to Java objects. You can use it directly or inherit from to and create a more convenient Eiffel class that makes the Java object look like an Eiffel object. The Eiffel representation of a Java Object.
+
+{{warning|to access the static fields or routines of a Java Class, you have to use the features of a JAVA_CLASS instance!! }}
+
+===JAVA_EXTERNALS===
+
+JNI external declarations. Don't use this class directly.
+
+===JAVA_***_ARRAY===
+
+Access to Java array of "***". "***" can be all the usual types of Java (byte, short, int, float, double, char, boolean) or object if it is an array of Java Object (a String is considered as an object)
+
+===JAVA_ARGS===
+
+Class representing the arguments that can be passed to a Java method. See below about the signature of the methods
+
+===JAVA_OBJECT_TABLE===
+
+This class provides a mapping between Java and Eiffel objects
+
+'''Mapping the Eiffel classes and the Java types:'''
+The following table describes the mapping of Java primitive types and classes to Eiffel classes.
+{|
+|-
+| '''Java type/class'''
+| '''Eiffel class'''
+|-
+| boolean
+| BOOLEAN
+|-
+| char, byte
+| CHARACTER
+|-
+| short, int
+| INTEGER
+|-
+| long
+| INTEGER_64
+|-
+| float
+| REAL
+|-
+| double
+| DOUBLE
+|-
+| String
+| STRING
+|-
+| void
+| Void
+|}
+
+The interface does the mapping automatically. For example, if you call a Java method that returns a 'float', by using float_method you will get a REAL.
+
+'''The signature of Java methods and attributes:'''
+
+When you want to call a Java method or access a field, you need to specify its signature.The Eiffel to Java interface follows the JNI specifications. The table below summarizes the encoding for the Java type signatures:
+{|
+|-
+| '''Signature'''
+| '''Java Type'''
+|-
+| Z
+| boolean
+|-
+| B
+| byte
+|-
+| C
+| char
+|-
+| S
+| short
+|-
+| I
+| int
+|-
+| J
+| long
+|-
+| F
+| float
+|-
+| D
+| double
+|-
+| V
+| void
+|-
+| [type
+| type []
+|}
+
+The signature for a Java class has the following form:
+
+L fully-qualified-class;
+
+For example, class String:
+
+Ljava/lang/String;
+
+
+The signature for a method has the following form:
+
+(arguments-types) returned-types
+
+For example, the signature of a method that takes as arguments an integer and a string and return void is:
+
+(ILjava/lang/String;)V
+
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/other-languages/eiffel2java/index.wiki b/documentation/18.11/solutions/other-languages/eiffel2java/index.wiki
new file mode 100644
index 00000000..0e38347f
--- /dev/null
+++ b/documentation/18.11/solutions/other-languages/eiffel2java/index.wiki
@@ -0,0 +1,8 @@
+[[Property:title|Eiffel2Java]]
+[[Property:weight|4]]
+[[Property:uuid|009ed581-1141-7db0-74bb-a9cbca15b904]]
+==The Eiffel2Java Library==
+
+Type: Library
+ make_from_other (other: ECOM_INTERFACE)
+
+which queries a COM component internally. Every interface proxy class inherits from [[ref:libraries/com/reference/ecom_queriable_chart|ECOM_QUERIABLE]]. An important difference between this mechanism and using an object test is that if the creation routine fails to initialize a new [[ref:libraries/com/reference/ecom_queriable_chart|ECOM_QUERIABLE]] object, an exception will be raised, whereas, the False result in the case in which no object of the desired type is available.
+
+==ECOM_STUB==
+
+[[ref:libraries/com/reference/ecom_stub_chart|ECOM_STUB]] inherits from [[ref:libraries/com/reference/ecom_interface_chart|ECOM_INTERFACE]], and exposes the feature [[ref:libraries/com/reference/ecom_stub_chart|create_item]] which allows creating the underlying COM object.
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-library/eiffelcom-interface-content/structures.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-library/eiffelcom-interface-content/structures.wiki
new file mode 100644
index 00000000..be49ad26
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-library/eiffelcom-interface-content/structures.wiki
@@ -0,0 +1,116 @@
+[[Property:title|Structures]]
+[[Property:weight|1]]
+[[Property:uuid|fc2071f0-213c-cc88-4914-833b598ceb83]]
+The [[ref:libraries/com/reference/index|Structures]] cluster includes wrappers for data structures useful when using the COM technology.
+
+==ECOM_ARRAY==
+
+ECOM_ARRAY is a multidimensional, resizable array. It is converted to SAFEARRAY at the COM runtime level. Most languages only support SAFEARRAYs of OLE automation types.
+
+==ECOM_EXCEPTION==
+
+ECOM_EXCEPTION provides support for triggering and catching exceptions. According to the COM specification, every feature of a COM interface should return a status code of type HRESULT. HRESULT is a 32 bit integer. The COM specification defines possible exception codes and corresponding human-readable descriptions.
+
+The status code is mapped by the EiffelCOM runtime to Eiffel exceptions. To raise COM-specific exceptions, the class ECOM_EXCEPTION provides the feature
+ trigger (code: INTEGER)
+ -- Raise exception with code `code'.
+ -- See class ECOM_EXCEPTION_CODES for possible values.
+
+
+The class also has several features that help analyzing exceptions and error codes received from the COM runtime.
+
+ hresult: INTEGER
+ -- Original HRESULT.
+ require
+ applicable: is_developer_exception
+
+ hresult_code: INTEGER
+ -- Status code.
+ require
+ applicable: is_developer_exception
+
+ hresult_facility: INTEGER
+ -- Facility code.
+ require
+ applicable: is_developer_exception
+
+ hresult_message: STRING
+ -- Error message.
+ require
+ applicable: is_developer_exception
+
+
+Every call to COM should be wrapped into a rescue clause as follows:
+
+ some_feature
+ local
+ retried: BOOLEAN
+ ...
+ do
+ if not retried then
+ -- Call to COM.
+ end
+ rescue
+ if is_developer_exception then
+ -- Compare `hresult' to some predefined value
+ -- and handle various cases,
+ -- or display a dialog box with an error message
+ -- `hresult_message'.
+ end
+ retried := True
+ retry
+ end
+
+
+==ECOM_STRUCTURE==
+
+ECOM_STRUCTURE is a deferred class which inherits from WEL_STRUCTURE. All wrappers of COM structures inherit from ECOM_STRUCTURE.
+
+==ECOM_VARIANT==
+
+ECOM_VARIANT is a wrapper of the VARIANT structure. VARIANT is the Visual Basic equivalent to Eiffel's
+ variable_type: INTEGER
+ -- Variable type. See class ECOM_VAR_TYPE for possible values.
+
+
+which specifies the actual type of the variant. The class has multiple features for typed access and setting of variables.
+
+==ECOM_VARIANT_ACCESS==
+
+
+ missing: ECOM_VARIANT
+ -- Value representing the default value of a COM optional argument.
+ -- Equivalent to an omitted VB argument, or C++ vtMissing, or .NET System.Reflection.Missing.
+
+
+Many COM Automation servers have routines that take arguments with default values. This is very common, for example, in Microsoft Office applications such as Excel and Word. In Visual Basic, such arguments are optional and, when omitted, the server uses the default value. In languages that cannot omit arguments, a special VARIANT value representing the omitted argument must be passed. EiffelCOM applications can pass missing for this purpose.
+
+For example, the following adds a new workbook to Excel. The default argument tells Excel to decide for itself how many worksheets to put in the new workbook:
+
+class
+ MY_EXCEL_APPLICATION
+
+inherit
+ APPLICATION_PROXY
+
+
+ ECOM_VARIANT_ACCESS
+
+feature
+
+ add_workbook
+ local
+ workbook: WORKBOOK_PROXY
+ do
+ workbook := workbooks.add (missing, 0)
+ end
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-library/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-library/index.wiki
new file mode 100644
index 00000000..5c84bfb0
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-library/index.wiki
@@ -0,0 +1,15 @@
+[[Property:title|EiffelCOM Library]]
+[[Property:weight|8]]
+[[Property:uuid|b5c66d71-515f-3c73-9c67-c50e4a8d6685]]
+Type: Library precomp.lib .
+
+Now you are ready to continue with the Guided Tour.
+
+
+==First Look at the Generated Code==
+At the end of the processing the '''EiffelStudio''' button becomes enabled. Click on it. This will automatically start EiffelStudio with the generated project so you can more easily navigate through the created Eiffel classes.
+
+{{note|When accessing a COM component the EiffelCOM Wizard will generate a precompiled library which includes all the generated classes. This allows for easy browsing of the generated classes, however a precompilation project is read-only, so you need to start another EiffelStudio to reuse the generated classes. The interesting classes are all related to the coclass proxy replace_substring ]] feature is wrong and erroneous calls can be made. Quick melt the changes and run the client. Enter some invalid numbers in the fields used to call this feature. After you click '''Replace''' you will see an error message box warning you that a precondition was violated on the server side. This demonstrates contracts `over the wire'. The precondition was violated in the server; this exception was caught by the EiffelCOM runtime and sent back to the client.
+{{seealso|
+system_name.exe -Regserver
+where ''system_name'' is the name of the component executable file. Register an in-process component using the ''regsvr32'' utility using the following syntax:
+
+regsvr32 system_name.dll
+where ''system_name'' is the name of the dll (e.g. string_manipulator). So to register the
+cd $ISE_EIFFEL\examples\com\wizard\string_manipulator\generated\component\server\EIFGENs\default\W_code
+regsvr32 string_manipulator_idl.dll
+Once registered, follow the steps described in [[Accessing a COM Component|Accessing a COM Component]] to build the component's client.
+
+
+{{seealso|
+ main_window: WEL_FRAME_WINDOW
+
+This feature is a once function that can return the class corresponding to the component window. By default, this window is displayed only if COM does not start the component. When COM loads an out-of-process component, it appends the command line parameter "-embedding" to the executable. The generated registration class looks for this option and if it is part of the process argument list then it sets the default window appearance to hidden. Of course this default implementation may be modified if needed.
+
+
+==Exceptions==
+
+The COM standard specifies that each COM routine should return a status code to the client. The status code is encoded in a
+note
+ description: "Eiffel coclass server example"
+class
+ ECOM_SERVER_COCLASS_IMP
+
+inherit
+ ECOM_SERVER_COCLASS -- Generated by the wizard
+
+ ECOM_EXCEPTION
+ export
+ {NONE} all
+ end
+
+feature -- Basic Operations
+
+ coclass_feature (an_argument: ARGUMENT_TYPE)
+ -- Example of a coclass feature
+ do
+ if not is_valid (an_argument) then
+ trigger (E_invalidargument)
+ else
+ -- Normal processing
+ end
+ end
+
+feature {NONE} -- Implementation
+
+ is_valid (an_argument: ARGUMENT_TYPE): BOOLEAN
+ -- Is an_argument a valid argument?
+ do
+ -- Test of validity of an_argument
+ end
+
+end -- class ECOM_SERVER_COCLASS_IMP
+
+
+This class inherits from the generated Eiffel coclass and from $ISE_EIFFEL\wizards\com. The executable file com_wizard_launcher.exe will launch the GUI version of the wizard. The executable file com_wizard.exe is a command line version of the wizard described [[Wizards: Command Line Options|here]].
+
+The EiffelCOM Wizard facilitates the creation of Eiffel projects implementing or reusing COM components.
+
+* [[How the EiffelCOM Wizard works|How the EiffelCOM Wizard works]] describes the steps followed by the wizard when creating the Eiffel project.
+* [[Generated Files|Generated Files]] describes the list of generated files and their usage.
+* [[Class Hierarchy|Class Hierarchy]] describes the class hierarchy of the generated Eiffel project.
+* [[Eiffel Project Processing|Eiffel Project Processing]] covers how to add a COM interface to an existing EiffelStudio project.
+* [[Reusing a COM Component|Accessing a COM Component]] describes how to reuse an existing COM component.
+* [[Building a COM Component|Building a COM Component]] describes how to build a new COM component.
+* [[Wizards: Command Line Options|Command Line Options]] describes using the wizard from the command line.
+
+{{seealso|
+HRESULT Function ([in] int a, [out, retval] MyStruct * b)
+
+The wizard generates the following feature:
+
+function (a: INTEGER): MY_STRUCT_RECORD
+
+where
+HRESULT Function ([in] ISomething * pInterface)
+
+The wizard generates the following Eiffel feature:
+
+function (p_interface: ISOMETHING_INTERFACE)
+
+where null C pointers for wrappers. There might be a need for additional assertions. Invariants and postconditions can be added in an heir of the generated Eiffel coclass proxy. Preconditions, however, cannot be strengthened. A workaround provided by the wizard consists of generating a precondition function for each feature in the interface. The default implementation of these functions always returns
+ function (a: INTEGER): MY_STRUCT
+ -- Example of a generated Eiffel coclass feature
+ require
+ function_user_precondition: function_user_precondition
+ do
+ ...
+ ensure
+ non_void_my_struct: Result /= Void
+ end
+
+So the complete class hierarchy for an Eiffel client coclass is the following:
+[[Image:client-inheritance]]
+
+
+==Exceptions==
+
+The COM standard requires that any interface function returns a status value (known as a rescue clause. The processing done in this clause might depend on the nature of the exception. All the standard COM exceptions can be found in the library class
+note
+ description: "Eiffel coclass client example"
+
+class
+ COCLASS_CLIENT
+
+inherit
+ ECOM_EXCEPTION
+ export
+ {NONE} all
+ end
+
+feature -- Basic Operations
+
+ coclass_feature_client
+ -- Example of a coclass feature caller
+ local
+ retried: BOOLEAN
+ coclass: EIFFEL_COCLASS_PROXY
+ do
+ if not retried then
+ create coclass.make
+ coclass.coclass_feature -- Actual call
+ end
+ rescue
+ if hresult = E_notimpl then
+ -- Process non implemented function error.
+ retried := True
+ retry
+ elseif hresult = E_invalidarg then
+ -- Process invalid argument error.
+ retried := True
+ retry
+ else
+ -- Forward exception to caller.
+ end
+ end
+
+end -- class COCLASS_CLIENT
+
+{{seealso|[[How the EiffelCOM Wizard works|How the EiffelCOM Wizard Works]] , [[Generated Files|Generated Files]] , [[Class Hierarchy|Class Hierarchy]] , [[Eiffel Project Processing|Adding a COM Interface to an Eiffel Project]] , [[Building a COM Component|Reusing a COM Component]] , [[Wizards: Command Line Options|Command Line Options]] }}
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-wizard/eiffelcom-wizard-reference/wizards-command-line-options.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-wizard/eiffelcom-wizard-reference/wizards-command-line-options.wiki
new file mode 100644
index 00000000..9887fc3d
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-wizard/eiffelcom-wizard-reference/wizards-command-line-options.wiki
@@ -0,0 +1,34 @@
+[[Property:title|Wizards: Command Line Options]]
+[[Property:weight|6]]
+[[Property:uuid|ca417e46-ad46-2d3f-e13e-a88366dc06b3]]
+The EiffelCOM Wizard can be used from the command line for example in batch scripts. The command line utility is com_wizard.exe and is located in $ISE_EIFFEL\wizards\com. Each command line option has both a long and a short name. The long names are all prefixed with -- while the short names are all prefixed with -. Options that take an argument should have the argument directly following the option with a space or a = sign in between the option name and the argument as in:
+
+--ace="mysystem.ecf"
+this option is equivalent to:
+
+-a "mysystem.ecf"
+
+The list of options is the following:
+* '''--client, -c''' '--eiffel'.
+* '''--facade, -f''' '--eiffel'.
+* '''--cluster, -u''' '--eiffel'.
+* '''--outofprocess, -o''': Access or build out of process component. By default access or build in-process component (DLL).
+* '''--compilec, -i''': Compile generated C code.
+* '''--compileeiffel, -l''': Compile generated Eiffel code. Implies '--compilec'.
+* '''--marshaller, -m''': Build marshaller DLL, can only be used with '--server' and if definition file is an IDL file.
+* '''--destination, -d''' '--backup'.
+* '''--backup, -b''': Backup overriden files by adding extension '.bac'. This option cannot be used together with '--cleanup'.
+* '''--graphical, -g''': Launch GUI, all other options are ignored.
+* '''--nologo, -n''': Do not display copyright information.
+* '''--version, -v''': Print version information.
+* '''--help, -h''': Display help on how to use the EiffelCOM Wizard command line utility.
+
+{{seealso|[[How the EiffelCOM Wizard works|How the EiffelCOM Wizard Works]] , [[Generated Files|Generated Files]] , [[Class Hierarchy|Class Hierarchy]] , [[Eiffel Project Processing|Adding a COM Interface to an Eiffel Project]] , [[Reusing a COM Component|Accessing a COM Component]] , [[Building a COM Component|Building a COM Component]] }}
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-wizard/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-wizard/index.wiki
new file mode 100644
index 00000000..9c318e6f
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/com/eiffelcom-wizard/index.wiki
@@ -0,0 +1,12 @@
+[[Property:title|EiffelCOM Wizard]]
+[[Property:weight|4]]
+[[Property:uuid|49d5c1b9-14f8-5bea-6641-50e9cf6715cf]]
+Type: Wizard File -> New Project... ) and choose a location for your EiffelRibbon project.
+* Configure the ribbon by adding elements, name the elements, and choose icons for buttons.
+* Save the project.
+* Generate the code.
+* Use EiffelStudio to compile the generated code.
+
+==Size definitions and scaling policies==
+
+An important aspect of Microsoft's ribbon technology is called '''[http://msdn.microsoft.com/en-us/library/windows/desktop/dd316927(v=vs.85).aspx adaptive layout]'''. When the ribbon is resized by a user at runtime, the adaptive layout makes corresponding changes to the size, format, organization and scale of the ribbon controls within each group based on size definition templates and scaling policies associated with the group. Size definitions are patterns for the use of a certain number of ribbon controls such as buttons. For a particular group of controls in an instance of ribbon, you can associate a size definition which will control the layout of the controls. At runtime, when the window hosting the ribbon is resized, a scaling policy, also associated with the group, will control how the controls in the group are reorganized in response to the resizing. When a group is selected in the EiffelRibbon tool, the group's size definition and scaling policy can be selected.
+
+{{note|Not all size definitions support all scaling policy choices. So it is important to know which scaling policies are supported by a size definition that you wish to associate with a group before you set the scaling policy for the group.}}
+
+===Size definitions===
+
+The ribbon framework provides a significant number of size definition templates (simply called '''size definitions'''), as shown in Figure 2 below. Size definitions are usually assigned names based on the number and type of controls included in the group. For example, the size definition ''"ThreeButtonsAndOneCheckBox"'' is a size definition for three buttons plus one checkbox.
+
+
+[[Image:EiffelRibbon Choose Size Definition]]
+
+Figure 2. Choosing a size definition for a ribbon control group.
+
+
+In addition to using the size definitions provided, it is possible to create your own custom size definitions. You do this with the '''Size Definition Editor'''. At the lower left of Figure 1 above you can see the tab representing the Size Definition Editor. When you expand the tab, the editor becomes visible, as in Figure 3, below.
+
+
+[[Image:EiffelRibbon size definition editor|Size Definition Editor]]
+
+Figure 3. EiffelRibbon tool with the Size Definition Editor pinned open.
+
+
+Use the Size Definition Editor to create custom size definitions for your ribbon designs. The '''Add button''' button will add a new button placeholder to a custom size definition. A selected button placeholder can be altered to show or hide its label and use its small or large size.
+
+
+[[Image:Size Definition Editor 02|Button placeholders]]
+
+Figure 4. Three button placeholders in a custom size definition (highlighted in red rectangle); one is large, and two are small. The text is visible in all cases. (This is the arrangement used for the "medium" configuration (highlighted in green rectangle) for the ''ThreeButtonCustom'' size definition used in the scaling policy figures in the next section. Screenshots of specifying arrangements used for "large" "small" configurations for ThreeButtonCustom are not shown.)
+
+
+Once a custom size definition has been designed, it can be named, saved, and used in a ribbon design.
+
+
+[[Image:Size Definition Editor 03|Name field and Save button]]
+
+Figure 5. The Size Definition Editor naming field and '''Save''' button.
+
+
+When you generate code which uses a custom size definition, the EiffelRibbon Design Tool generates the (XML) representation for your size definition and then invoke the Microsoft Ribbon Framework's User Interface Command Compiler (UICC.exe) to validate the generated size definition code. This process can result in [http://msdn.microsoft.com/en-us/library/windows/desktop/dd316918(v=VS.85).aspx certain types of errors].
+
+User Interface Command Compiler errors will appear in the Output pane of the EiffelRibbon Design Tool.
+
+
+===Scaling policy===
+
+The notion of adaptive layout includes the ability to specify preferred sizes for elements of a group and a scaling policy that can influence how the group reacts to resizing. More detail on size definition and scaling policy is available in Microsoft's [http://msdn.microsoft.com/en-us/library/windows/desktop/dd316927(v=vs.85).aspx ribbon documentation].
+
+The EiffelRibbon tool allows you to specify ideal sizes and scale policy for a groups elements through the '''Ideal sizes''' radio buttons and the '''Scale''' checkboxes, as shown in Figure 6 below.
+
+
+[[Image:EiffelRibbon design tool 02|Scaling policy elements: "Ideal sizes" and "Scale"]]
+
+Figure 6. A group definition showing it's size definition and the scaling policy elements "Ideal sizes" and "Scale".
+
+
+In Figure 6, none of the Scale checkboxes is checked. This means that no scaling policy is in effect for the group ''group_context_popups''. So in a running application, a window with this ribbon might be rendered as shown in Figure 7:
+
+
+[[Image:EiffelRibbon scaling policy 01]]
+
+Figure 7. A ribbon with no scaling policy, but with enough room to display all groups.
+
+
+If the user resized the window to a narrower form, the buttons in the ''group_context_popups'' group would become occluded because scaling is not in effect. This is shown in Figure 8.
+
+
+[[Image:EiffelRibbon scaling policy 01a]]
+
+Figure 8. After resizing, some buttons of the group are no longer visible.
+
+
+If all of the ''Scale'' checkboxes that are supported by the size definition are checked in the EiffelRibbon tool for the group ''group_context_popups'' as shown in Figure 9, then scaling is enabled.
+
+
+[[Image:EiffelRibbon scaling policy 02|Scale checkboxes enable scaling policy.]]
+
+Figure 9. All supported scales are enabled for ''group_context_popups''.
+
+
+In the running application again, the initial rendering looks the same as in Figure 7 (its ''Large'' configuration). But if the window is resized to a narrower form with scaling policy enabled, it will go through the various configurations supported by the size definition: ''Medium'', ''Small'', then ''Popup''. The different configurations for this particular ribbon and size definition are shown in Figures 10 through 12.
+
+
+[[Image:EiffelRibbon scaling policy 03|Medium configuration]]
+
+Figure 10. Scaling policy at medium configuration (see Figure 4 above).
+
+
+
+[[Image:EiffelRibbon scaling policy 04|Small configuration]]
+
+Figure 11. Scaling policy at small configuration.
+
+
+
+[[Image:EiffelRibbon scaling policy 05|Popup configuration]]
+
+Figure 12. Scaling policy at popup configuration.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/eiffelribbon/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/eiffelribbon/index.wiki
new file mode 100644
index 00000000..73860cc8
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/eiffelribbon/index.wiki
@@ -0,0 +1,78 @@
+[[Property:title|EiffelRibbon]]
+[[Property:weight|2]]
+[[Property:uuid|2f24957c-7fdc-f918-8c0d-37a9ef525508]]
+=Introduction=
+
+EiffelRibbon is a library of classes with an associated [[EiffelRibbon Design Tool|tool]] which allows the integration of the Microsoft Windows "Ribbon" into graphical user interfaces programmed with [[EiffelVision 2]] and targeted to Microsoft Windows. The ribbon is part of a [http://msdn.microsoft.com/en-us/library/aa338198.aspx#office2007uifordevelopers_detaileddesignofthenewuisystem revamped user interface approach] introduced by Microsoft with the 2007 release of the Microsoft Office applications. So you've experienced the ribbon if you've used Microsoft Word, PowerPoint, or Excel from 2007 or later.
+
+
+{{note|''Although EiffelRibbon classes work with EiffelVision 2 which is multi-platform, systems using EiffelRibbon can be targeted only to the Microsoft Windows platform.''}}
+
+
+[[Image:EiffelRibbon window 01|A ribbon on a window]]
+
+Figure 1: A ribbon at the top of a window.
+
+
+The EiffelRibbon library contains the classes that are used to implement the ribbon facilities. The classes in the EiffelRibbon library all have class names beginning "EV_", the default prefix for EiffelVision 2 classes. So the EiffelRibbon classes can be seen as an extension to the EiffelVision 2 library. If you've used EiffelVision 2 to create applications with graphical user interfaces, then the EiffelRibbon class won't look unfamiliar to you. However, unlike other EiffelVision 2 classes, the EiffelRibbon classes only work in applications targeted to Microsoft Windows.
+
+To gain a detailed understanding of the goals of Microsoft's Ribbon technology including some guidelines on designing effective ribbons, see [http://msdn.microsoft.com/en-us/library/cc872782.aspx the '''Ribbons''' page] on Microsoft's MSDN site.
+
+The [[EiffelRibbon Design Tool|EiffelRibbon design tool]] helps you configure a ribbon in much the same way that [[EiffelBuild|EiffelBuild]] (ES Builder) helps you layout a GUI application.
+
+
+=The EiffelRibbon Library=
+
+The EiffelRibbon library contains the classes necessary to add ribbons to EiffelVision 2 applications. As stated above, you won't really need to use the library directly. Rather, you use the EiffelRibbon tool to build an application that uses the library classes.
+
+Still you may find it interesting to browse the classes in the library. You'll see that as in the EiffelVision 2 library, many of the classes are there to provide support for the various elements that can be used in an application. Most of the class names for EiffelRibbon-specific elements begin with the prefix "EV_RIBBON". Some examples are: EV_RIBBON_BUTTON, EV_RIBBON_DROP_DOWN_GALLERY, and EV_RIBBON_COMBO_BOX_ITEM. Again, similar to EiffelVision 2, the class EV_RIBBON_COMBO_BOX_ITEM models an item for a EV_RIBBON_COMBO_BOX.
+
+So, here again, if you are familiar with EiffelVision 2, then EiffelRibbon should not seem very foreign to you.
+
+
+=EiffelRibbon Applications=
+
+When you build an application with the [[EiffelRibbon Design Tool|EiffelRibbon tool]], it generates classes for you. These classes are often clients or heirs to classes in the EiffelRibbon library. The classes generated for the objects on your ribbon should look familiar to you as well. For example, as with EiffelBuild, for each ribbon object, say a button, there will be a class ending with the suffix "_IMP" which will get regenerated each time you request the EiffelRibbon tool to generate classes. Also generated is an heir to that class with a name that does not include the suffix. This class you are free to edit, as it will not be regenerated. It is in these editable classes that you provide the action sequences for your ribbon objects' behaviors.
+
+The class shown in the Edit pane of EiffelStudio in Figure 2 is a portion of a generated class BUTTON_CHANGE_SMALL_IMAGE, representing a ribbon button, from one of the EiffelRibbon examples. BUTTON_CHANGE_SMALL_IMAGE is a heir to BUTTON_CHANGE_SMALL_IMAGE_IMP. You can see that in the redefined version of create_interface_objects code has been added to add an agent to the select_actions for the ribbon button. In this case, it's an inline agent that will toggle the associated image back and forth between two different images.
+
+
+[[Image:EiffelRibbon application 01|An EiffelRibbon application in EiffelStudio.]]
+
+Figure 2.
+
+==Project '''modes'''==
+
+EiffelRibbon projects can be built in one of two different '''project modes'''. The project mode is selected from the '''Project''' menu of the EiffelRibbon design tool.
+
+The default mode, called '''DLL mode''', is the most all encompassing project mode. It has the advantage that the full capabilities of EiffelRibbon are accessible. In DLL mode, a separate DLL is created to contain the generated code for each ribbon created for the project.
+
+The alternative to DLL mode is '''Application mode'''. Application mode allows almost all the capabilities of DLL mode, but includes all ribbon code in the project's executable image (.exe). For this reason, it is necessary to re-freeze the project after changes when using Application mode. Re-freezing is not necessary in DLL mode.
+
+Both modes allow multiple ribbons to be created for multiple windows. However certain restrictions apply in Application mode that do not apply in DLL mode. In DLL mode, different DLL's are created for each ribbon. These DLL's are separate and do not share data. However, in Application mode, a number of ribbon facilities, including the help button, the quick access toolbar, and the mini toolbar, are shared among all the ribbons defined. In DLL mode, these facilities are not shared and as such can be different for each ribbon.
+
+=Usage notes=
+
+==System requirements==
+
+To use the EiffelRibbon library and tools you must have:
+
+# Windows 7
+# The Microsoft C compiler provided with either:
+## Windows SDK 7.0 or greater
+## Visual Studio 2008 or greater
+
+
+==Current state of development==
+
+Initial distribution:
+* The EiffelRibbon library is not usable directly. The EiffelRibbon design tool allows you to design a ribbon and will generate code that relies on the EiffelRibbon library.
+* A class EV_RIBBON_TITLED_WINDOW is provided with the library. EV_RIBBON_TITLED_WINDOW is a descendant of the standard EiffelVision 2 class EV_TITLED_WINDOW. The ribbon classes generated by EiffelRibbon tool can be added only to instances of EV_RIBBON_TITLED_WINDOW.
+
+==Known issues and limitations==
+
+Initial distribution:
+* Resizing policy is not yet supported.
+* When working in Application Mode, it is necessary to freeze the target system each time the EiffelRibbon code is regenerated. This is not necessary in DLL Mode.
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/index.wiki
new file mode 100644
index 00000000..bdd6c6de
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/index.wiki
@@ -0,0 +1,7 @@
+[[Property:title|Microsoft Windows]]
+[[Property:weight|1]]
+[[Property:uuid|b6513eee-a12c-1f9f-4257-b08d2e18cef4]]
+== Eiffel with Microsoft Windows ==
+
+The primary source for Eiffel platform specific support for Microsoft Windows.
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/building-net-application.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/building-net-application.wiki
new file mode 100644
index 00000000..88a90a65
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/building-net-application.wiki
@@ -0,0 +1,14 @@
+[[Property:title|Building a .NET application]]
+[[Property:weight|1]]
+[[Property:uuid|a44736cf-41df-1679-9c6d-7b56f31d5f9a]]
+Eiffel for .NET has some specific functionality meant to leverage necessary aspects of the .NET Framework.
+
+For that reason, the [[EiffelStudio: Project settings window|project settings]] for Eiffel for .NET introduces new options. These options include:
+* Specifying whether the generated assembly should be an EXE or a DLL.
+* Choosing between generating verifiable or non verifiable IL code. Non verifiable IL code executes faster but requires high trust settings.
+
+The Eiffel for .NET compiler generates a single assembly whose name is the name of the system as given in the [[System Options|system options of the project settings]] .
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/eiffel-codedom-provider-manager.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/eiffel-codedom-provider-manager.wiki
new file mode 100644
index 00000000..d03a9064
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/eiffel-codedom-provider-manager.wiki
@@ -0,0 +1,45 @@
+[[Property:title|Eiffel CodeDom Provider Manager]]
+[[Property:weight|-1]]
+[[Property:uuid|089e658f-4bd8-df8f-5647-0c176c00359b]]
+The Eiffel Codedom Provider Manager allows graphical configuration of the Eiffel CodeDom Provider. There can be multiple configurations, each of them being associated with at least one application.
+
+{{note|The Eiffel for ASP.NET installation program will add a shortcut in the start menu to the Eiffel CodeDom Provider Manager. }}
+
+The main dialog of the Eiffel CodeDom Provider Manager is divided into two vertical panes. The left pane contains a list of available configurations while the right pane contains the settings corresponding to the currently selected configuration. Initially the only available configuration is the '''default''' configuration which applies to all applications. The configurable settings are listed below.
+==General Settings==
+* '''Fail on error''': Checking this box will force the Eiffel Codedom Provider to fail when an error occurs. By default the provider rescues the failure and logs an error but it might be easier for debugging to have the Eiffel CodeDom Provider stop and raise an exception.
+* '''Log server''': Server where events should be logged. By default events are logged on the machine running the CodeDom Provider, the corresponding value is a dot ("."). Consult the [[Logging|Logging]] section for additional information on logging.
+* '''Log level''': By default only errors are written to the log. It might be useful for debugging purposes to log additional information and/or warnings. This setting also allows to disable logging in case it is not required. Consult the [[Logging|Logging]] section for additional information on logging.
+
+==Compiler Settings==
+* '''Default root class''': In the event where the CodeDom tree does not define an entry point, there still needs to be a root class for the Eiffel system to compile properly. If there is an entry point defined in the Codedom tree then this setting is ignored.
+* '''Precompile ace file''': This setting, if set, gives the path to the ACE file of the precompile that the CodeDom compiler should use when compiling systems with this configuration. The CodeDom compiler will first check whether the precompile for that ACE file already exists in the precompile cache (See Precompile cache below). If it finds one then it will check whether the ACE file was modified since the precompile was created. If there isn't a corresponding precompile or if the ACE file was modified then the CodeDom compiler will create a new precompile in the precompile cache using the specified ace file. It will then compile the system using the precompile in the cache corresponding to the specified ACE file.
+
+{{note|If for any reason the precompilation fails then the CodeDom compiler will still compile the system but without using any precompile. }}
+
+* '''Metadata cache''': Both the Eiffel CodeDom Provider and the Eiffel compiler require reading from and writing to an Eiffel Metadata Cache. These caches contain information about mapping the .NET types and members names to valid Eiffel identifiers. Because read and write access are required, the application that uses the CodeDom Provider must have write access rights to the Eiffel Metadata Cache folder.
+{{note|The Eiffel for ASP.NET installation program will grant write access rights to the Eiffel Metadata Cache folder to the ASPNET user and IIS_WPG group if they exist. ASPNET is the default user account used by the ASP.NET process (aspnet_wp.exe) under Windows XP while IIS_WPG is the default user account used by the ASP.NET process (w3wp.exe) under Windows 2003 Server. }}
+
+{{warning|Changing the Eiffel Metadata Cache folder path will force the Eiffel CodeDom Provider to regenerate the cache content during the next code generation or compilation. This process can take a long time and in particular can take more time than the default timeout for an ASP.NET page. If the Eiffel CodeDom Provider is used together with ASP.NET and if the Eiffel Metadata Cache path has been modified, it is recommended to change the default timeout for the first ASP.NET page containing Eiffel code to be loaded (this can be done by setting the ''HttpServerUtility.ScriptTimeout'' property). }}
+
+* '''Compiler metadata cache''': This cache is used by the Eiffel Codedom Provider Compiler to map .NET types and members names to valid Eiffel identifiers. Please consult '''Metadata cache''' for additional information (the same note and warning apply).
+* '''Precompile cache''': If the configuration defines a precompile ace file then the Eiffel CodeDom Provider will create the precompile in the directory specified in this setting. Changing this value will force the Eiffel CodeDom Provider compiler to recreate the precompile in the new directory.
+
+==Assembly Prefixes==
+This list associates .NET assemblies with the prefix that will be used for Eiffel class names corresponding to .NET types belonging to the assembly. For example the prefix for the assembly ''System.Xml.dll'' is ''XML_'', this means that the Eiffel class names of all the types in the assembly ''System.Xml.dll'' will all begin with ''XML_''. This is necessary because Eiffel doesn't have a notion of namespace. The default assembly prefixes cannot be modified but new assembly/prefix pairs can be added if necessary.
+==Applications==
+This last setting will only appear for configurations other than the default configuration. It lists the applications that will use the configuration when they load the Eiffel CodeDom Provider assembly. If an application is not listed in any configuration then it will use the default configuration.
+
+{{note|For a change in an existing configuration to take effect, the process that uses the modified configuration must be restarted. }}
+
+==New Configuration==
+New configurations may be created by clicking the ''New'' button or the ''New'' entry in the ''File'' menu. The New Configuration dialog box asks for the name and the path of the configuration. It will create a file with the extension '''.ecd''' ('''E'''iffel '''C'''ode'''D'''om) with the specified name in the directory located at the specified path. Whenever one of the applications listed at the bottom of the New Configuration dialog loads the Eiffel CodeDom Provider, it will use this new configuration.
+==Configuration Properties==
+Double clicking on the configuration name in the configurations list, clicking the ''Properties'' button or choosing the ''Properties'' menu entry in the ''File'' menu will open the Configuration Properties dialog. This dialog gives the dates of creation and last modification of the configuration as well as the list of applications that use it if it's not the default configuration.
+
+
+{{seealso|[[Configuration|Configuration]], [[Logging|Logging]] }}
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/esplitter.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/esplitter.wiki
new file mode 100644
index 00000000..42a3e08f
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/esplitter.wiki
@@ -0,0 +1,45 @@
+[[Property:title|eSplitter]]
+[[Property:weight|0]]
+[[Property:uuid|2cf7249c-fd1e-b8e0-08ab-c2995b2b8227]]
+This tool comes in two flavors: a command line only utility ''esplit.exe'' and a graphical tool ''esplitter.exe''. Both applications achieve the same goal: to produce standard Eiffel source files ('''.e''' files) from Eiffel CodeDom Provider generated source files ('''.es''' files).
+==Command Line Utility (esplit.exe)==
+This utility is located in the ''Codedom\bin'' subfolder of the Eiffel for ASP.NET directory. The command line syntax is:
+
+Usage: esplit -f=FOLDER [-s -d=DESTINATION -v -h -m=REGEXP -n]
+ -d, --destination=DESTINATION
+ Folder where generated Eiffel class files should be created.
+ If not specified, creates Eiffel class files in same folder as
+ corresponding Eiffel multi-class file.
+ -f, --folder=FOLDER
+ Folder containing Eiffel multi-class files.
+ -h, --help
+ Help on using this program.
+ -m, --match=REGEXP
+ Regular expression that file name must match to be processed, by default matches all files with extension '.es'.
+ -n, --nologo
+ Do not display copyright notice.
+ -s, --subfolders
+ Also process files in subfolders.
+ -v, --version
+ Version information.
+So running:
+
+esplit -f .
+will generate Eiffel source files from all the files with extension '.es' in the current folder and running:
+
+esplit -f "source" -m "C.*\.es" -d "destination" -s
+will generate Eiffel source files from all the files with extension '.es' and whose filename starts with a 'C' located in the 'source' folder and all its subfolders. The Eiffel source files will be generated in the 'destination' folder.
+==Graphical Utility (esplitter.exe)==
+The graphical utility includes two panes. The first pane allows setting different parameters:
+* '''Folder containing Eiffel multi-class file(s)''': this field gives the path to the folder which contains the files to be processed. The button to the right of the field allows to browse for the folder. This field corresponds to the '-f' parameter of the command line utility.
+* '''Only process files whose filename matches the following regular expression''': this field corresponds to the '-m' parameter of the command line utility.
+* '''Also process files in subfolder''': if this check box is checked then the utility will search for files whose filenames match the regular expression in the destination folder as well as in its subfolders. This check box corresponds to the '-s' switch of the command line utility.
+* '''Generate Eiffel class files in the same folder as the Eiffel multi-class files''': checking this radio button is equivalent to not providing a '-d' parameter to the command line utility.
+* '''Generate Eiffel class files in the following folder''': The content of the field below this radio button corresponds to the '-d' parameter of the command line utility.
+Clicking on the '''Generate''' button switches to the output pane and starts the Eiffel class file generation. The output pane contains the text output resulting from the execution of the tool. It also contains two buttons:
+* '''Open Folder''': clicking on this button will open Windows Explorer in the folder where the Eiffel source files were generated.
+* '''Exit''': clicking this button will close the application.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/index.wiki
new file mode 100644
index 00000000..bc8615ec
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/index.wiki
@@ -0,0 +1,11 @@
+[[Property:title|Eiffel for ASP.NET Tools and Administration]]
+[[Property:weight|2]]
+[[Property:uuid|960d3d4b-33d0-327f-343d-ad9d5591f07a]]
+The Eiffel for ASP.NET delivery comes together with several tools:
+* [[Eiffel CodeDom Provider Manager|Eiffel CodeDom Provider Manager]] allows administering the Eiffel CodeDom Provider.
+* [[eSplitter|ESplitter]] allows generating standard Eiffel source files ('''.e''' files) from Eiffel CodeDom Provider generated files ('''.es''') files.
+* [[Name Mapper|Name Mapper]] allows retrieving the Eiffel identifier corresponding to a .NET type or type member.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/name-mapper.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/name-mapper.wiki
new file mode 100644
index 00000000..0113e3c5
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-aspnet-tools-and-administration/name-mapper.wiki
@@ -0,0 +1,15 @@
+[[Property:title|Name Mapper]]
+[[Property:weight|2]]
+[[Property:uuid|82691c82-50a5-ed7f-b138-90946d094dae]]
+The Name Mapper utility allows retrieving the Eiffel identifier corresponding to a .NET type name or a .NET member name. There are only two input fields in the interface: the .NET type name should be entered in the first one while the .NET member name should be entered in the second one. Once a valid .NET type name is entered in the type name input field, the tool starts searching for the corresponding Eiffel identifier. When the Name Mapper finds the corresponding Eiffel identifier, it automatically fills the .NET member name input combo box with all the member names of the corresponding type. This means that the .NET member type name can be chosen from the combo box entries or typed in (if it's typed in then the tool will autocomplete the member name).
+The assemblies the tool will look into for the .NET type whose name was given in the .NET type name input field are listed below the input fields. It is possible to add new assemblies to the list by clicking the ''Add'' button. Assemblies that were added this way can be removed by clicking the ''Remove'' button after selecting the assembly from the list.
+{{note|Assemblies that are listed by default cannot be removed. }}
+
+{{note|When adding an assembly and if the assembly has not been consumed (i.e. the XML names mapping files have not been generated in the Eiffel Metadata Cache) then the Name Mapper will consume the assembly, this may take a while. }}
+
+
+{{seealso|[[Names Mappings|Names Mapping]] }}
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/about-code-document-object-model-codedom.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/about-code-document-object-model-codedom.wiki
new file mode 100644
index 00000000..42b50945
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/about-code-document-object-model-codedom.wiki
@@ -0,0 +1,10 @@
+[[Property:title|About the Code Document Object Model (CodeDom)]]
+[[Property:weight|0]]
+[[Property:uuid|46136373-34bb-94b7-1f7b-934d584cf637]]
+CodeDom stands for the '''Code Document Object Model'''. CodeDom allows for representing source code in an abstract data structure. Such a representation is called a '''CodeDom tree''' as the underlying data structure uses a tree paradigm. This abstract representation can then be generated into different programming languages. Each language vendor provides its implementation of the CodeDom interfaces, this implementation is called a '''CodeDom Provider'''. Programmers can then build tools that can work with many different languages without having to know about each one, instead they just delegate code generation to each CodeDom Provider.
+The CodeDom interfaces also expose types and methods that allow for parsing source code and creating the corresponding CodeDom. The current implementation of the Eiffel CodeDom Provider does not support parsing. Code generation is a much more popular useage of the CodeDom and the current version focuses on this aspect of the technology.
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/common-scenarios.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/common-scenarios.wiki
new file mode 100644
index 00000000..e52b2ba8
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/common-scenarios.wiki
@@ -0,0 +1,19 @@
+[[Property:title|Common Scenarios]]
+[[Property:weight|7]]
+[[Property:uuid|15334d95-2ef5-6e1b-1754-051342bb7290]]
+==ASP.NET==
+Probably the most common use of the CodeDom technology is via Internet Information Services (IIS) and ASP.NET. The installation of the Eiffel for ASP.NET will configure the machine so ASP.NET pages can be written in Eiffel. Consult the [[Eiffel for ASP.NET Installation|Eiffel for ASP.NET documentation]] for details on how to write ASP.NET Eiffel pages.
+==WSDL==
+Another use of the CodeDom technology is via the WSDL utility. This utility is part of the .NET Framework SDK and is a common line application that can be used to automatically generate stub source code for any Web Service described by a Web Service Description Language (WSDL) file. It is possible to tell the utility which CodeDom Provider to use via the command line as follows:
+
+Wsdl /language:"EiffelSoftware.CodeDom.CodeDomProvider, EiffelSoftware.CodeDom, Version=2.0.1.1402, Culture=neutral, PublicKeyToken=def26f296efef469"
+http://api.google.com/GoogleSearch.wsdl
+
+{{note|The version number used above might differ depending on the version of the Eiffel CodeDom Provider dll installed on your system. }}
+
+{{note|The example above uses the Google web service, the corresponding URL is correct at the time of writing but there is no guarentee it won't change (or be removed) in the future. }}
+
+This will generate a file with the extension '''.es''' which contains multiple Eiffel class definitions. Compiling this file will require using the CodeDom compiler (programmatically via the CodeDom ICodeCompiler interface) or using the [[eSplitter|eSplitter]] tool to generate standard Eiffel source files ('''.e''' files) that can then be compiled by the standard Eiffel compiler.
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/configuration.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/configuration.wiki
new file mode 100644
index 00000000..22fcf22a
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/configuration.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Configuration]]
+[[Property:weight|3]]
+[[Property:uuid|2d885f05-adcc-d8da-6515-4568fc76bcf6]]
+The Eiffel Codedom Provider uses XML configuration files that define additional settings specific to Eiffel. Such settings include whether to fail on error, what events to log, where to log them etc... Each application can define its own configuration to be used when it loads the Eiffel CodeDom Provider. If an application is not associated with a configuration file then a default configuration is used.
+The association between applications and configurations as well as the actual settings the configuration defines can be set in the [[Eiffel CodeDom Provider Manager|Eiffel CodeDom Provider Manager]] . Run ''ecdpman.exe'' to start the manager.
+
+{{note|The Eiffel for ASP.NET installation program will add a shortcut in the start menu to the Eiffel CodeDom Provider Manager. }}
+
+{{seealso|[[Eiffel CodeDom Provider Manager|Eiffel CodeDom Provider Manager]] , [[Logging|Logging]] , [[Required Permissions|Required permissions]] }}
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/eiffel-implementation.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/eiffel-implementation.wiki
new file mode 100644
index 00000000..eaa5bdd3
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/eiffel-implementation.wiki
@@ -0,0 +1,32 @@
+[[Property:title|Eiffel Implementation]]
+[[Property:weight|7]]
+[[Property:uuid|3f945c36-521e-cd71-fc7b-d549a6c05a04]]
+There are a few topics specific to the implementation of the Eiffel CodeDom Provider that are worth mentioning.
+==Multiple Classes File==
+The Eiffel compiler expects that there is only one class per source file (file with extension '''.e'''), however the CodeDom interface specification requires multiple classes to be generated in the same file (actually in the same ''stream''). The Eiffel CodeDom Provider code generator generates files with the extension '''.es''' which may contain multiple class definitions. Each class definition is separated with a special marker that the Eiffel CodeDom Provider compiler will parse to create multiple '''.e''' files - each containing a single class definition - prior to calling the command line Eiffel compiler.
+
+
+{{note|Only the Eiffel CodeDom Provider compiler knows how to handle '''.es''' files. The standard Eiffel compilers can only parse '''.e''' files. }}
+
+Eiffel for ASP.NET includes the [[eSplitter|eSplitter]] utility which can 'split' Eiffel multi-class files ('''.es''' files) into single class files ('''.e''' files).
+==Inheritance Snippet==
+Any type defined in a CodeDom tree to be consumed by the Eiffel CodeDom Provider may include one (and only one) snippet member that includes an inheritance clause declaration. This ''inheritance snippet'' must start with the keyword '''inherit''' and follows the Eiffel syntax for inheritance clauses. All the feature adaptations available in the Eiffel programming language may be used in such a snippet ('''rename''', '''export''', '''undefine''', '''redefine''', '''select''').
+
+
+{{note|The CodeDom tree itself might define additional inheritance clauses in which case the Eiffel CodeDom Provider will merge the snippet and the implicit clauses in the generated source file. }}
+
+==Indexing Snippet and Precompiled Libraries==
+Another interesting snippet member is the ''indexing clause snippet'' which must start with the '''indexing''' keyword and follows the Eiffel syntax for indexing clauses. This snippet may include the indexing clause '''precompile_definition_file''' which can be used to specify the path to the precompiled library ACE file to be used by the Eiffel CodeDom Compiler. This is specially useful in ASP.NET pages where each page can specify which precompiled ACE file to use when compiling it. This path will be used instead of the path defined in the [[Configuration|configuration file]].
+
+
+{{note|Only one class per compile unit should define a path to the precompiled library ACE file. If more than one class contain a '''precompile_definition_file''' indexing clause then there is no guarentee on which one the Eiffel CodeDom Compiler will use. }}
+
+==Eiffel Configuration==
+There are several Eiffel specific settings that can be set in the Eiffel CodeDom Provider which will affect the generated code as well as the CodeDom compiler behavior. These settings are covered in the [[Configuration|Configuration]] section.
+
+
+{{seealso|[[eSplitter|eSplitter]], [[Configuration|Configuration]] }}
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/index.wiki
new file mode 100644
index 00000000..76857f95
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/index.wiki
@@ -0,0 +1,5 @@
+[[Property:title|The Eiffel CodeDom Provider]]
+[[Property:weight|0]]
+[[Property:uuid|0b45f31f-83ea-6301-9017-7b78c6827772]]
+The Eiffel CodeDom Provider provides an implementation of the CodeDom Provider generation and compilation interfaces defined in the System.CodeDom namespace of the .NET Framework. This documentation includes the following sections:
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/installation.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/installation.wiki
new file mode 100644
index 00000000..44d43397
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/installation.wiki
@@ -0,0 +1,19 @@
+[[Property:title|Installation]]
+[[Property:weight|1]]
+[[Property:uuid|b6197932-4bcb-c79b-afe2-1a8f36dbbd7c]]
+For certain tools (including ASP.NET) to detect the availability of a CodeDom Provider, the corresponding assembly name must be listed in the .NET machine wide configuration file typically located in:
+
+%SYSTEM_DRIVE%\Windows\Microsoft.NET\Framework\vx.x.xxxx\CONFIG\machine.config
+(where vx.x.xxxx corresponds to the .NET Framework version number). The available CodeDom Providers are listed under the ''
+InstallUtil EiffelSoftware.Codedom.dll
+Conversely, should the Eiffel Codedom Provider not be required anymore, running the following command line will remove it from the ''machine.config'' file:
+
+InstallUtil /u EiffelSoftware.Codedom.dll
+
+{{note|The '''Eiffel for ASP.NET''' installation program will take care of registering and unregistering the Eiffel CodeDom Provider properly. }}
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/limitations.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/limitations.wiki
new file mode 100644
index 00000000..af6647b5
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/limitations.wiki
@@ -0,0 +1,10 @@
+[[Property:title|Limitations]]
+[[Property:weight|8]]
+[[Property:uuid|6d8ab90d-f051-5010-55df-218a020d9cb5]]
+==Generation Only==
+The current implementation of the Eiffel CodeDom Provider does not support parsing Eiffel source code to produce a CodeDom tree. Only code generation and compilation are supported in the current release.
+==Managed Code Only==
+Only managed code can be generated or compiled by the Eiffel CodeDom Provider. This means that the CodeDom tree being compiled cannot include snippet members which use or define Eiffel external clauses. If the system requires access to external methods, they should be defined in a precompiled library (see [[Configuration|Configuration]] ).
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/logging.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/logging.wiki
new file mode 100644
index 00000000..78736ac1
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/logging.wiki
@@ -0,0 +1,21 @@
+[[Property:title|Logging]]
+[[Property:weight|4]]
+[[Property:uuid|d425684b-687c-aee6-25fa-650e5885e014]]
+The Eiffel CodeDom Provider may be configured (via the [[Eiffel CodeDom Provider Manager|Eiffel Codedom Provider Manager]] ) to log information, warnings and/or errors in the Windows Event Log. Logging may be useful for a number of reasons, some of them are:
+* To detect which CodeDom interface method is called and when it's called. This is particularly useful when the source code for the CodeDom consumer (e.g. ASP.NET) is not available.
+* To locate the source of a problem when the code generated by the Eiffel CodeDom Provider is incomplete or incorrect. This may happen if the CodeDom tree given to the Eiffel CodeDom Provider uses one of the unsupported constructs as listed in the topic [[Supported Constructs|Supported Constructs]] .
+* To detect a problem in a CodeDom tree. The logs will help in locating the location of the problem as they include contextual information on the node where the error occurred.
+
+==Log Details==
+There are three types of events that can be logged: information events, warnings and errors:
+* Information events include calls to CodeDom interface methods and other events that will not affect the execution of the Eiffel CodeDom Provider
+* Warnings include events that will not prevent the CodeDom Provider from running but that may affect the results. For example if a CodeDom tree element references a .NET entity that the Eiffel CodeDom Provider cannot find then it will generate a default Eiffel name by running the default formatting algorithm. This may produce code that does not compile if the Eiffel name of the entity does not correspond to the formatted .NET name (for example if the entity is a type and the type's assembly has a non-empty prefix).
+* Errors include events that will force the execution of the Eiffel CodeDom Provider to stop. By default the Eiffel CodeDom Provider simply stops and returns an error, it is possible however to configure it so that an exception is raised.
+
+==Log Location==
+All the Eiffel CodeDom Provider events are logged into the Windows '''System''' Log. This log can be viewed via the Windows administrative tool ''Event Viewer''. The source for the events raised by the Eiffel CodeDom Provider is ''Eiffel CodeDom Provider''. By default all the events are logged on the machine running the Eiffel CodeDom Provider but it is possible to change its configuration so that the events are logged on a different machine (see [[Required Permissions|Required permissions]] ).
+{{seealso|[[Eiffel CodeDom Provider Manager|Eiffel CodeDom Provider Manager]] , [[Supported Constructs|Supported constructs]] , [[Required Permissions|Required permissions]] }}
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/required-permissions.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/required-permissions.wiki
new file mode 100644
index 00000000..7649965a
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/required-permissions.wiki
@@ -0,0 +1,26 @@
+[[Property:title|Required Permissions]]
+[[Property:weight|6]]
+[[Property:uuid|f55af6a0-b896-12b7-fe4a-ebb1787731e5]]
+The account running the Eiffel CodeDom Provider might have restricted permissions such as when used through ASP.NET. This section aims at defining the security permissions required for the execution of the Eiffel CodeDom Provider.
+==Eiffel Metadata Cache==
+Both when generating and compiling source code, the Eiffel CodeDom Provider needs to read and write from and to the Eiffel Metadata Cache. This repository stores the mapping information between .NET and Eiffel names for both types and their members. By default the Eiffel Metadata Cache is located in the ''Assemblies'' subfolder of the Eiffel CodeDom Provider directory.
+{{note|The Eiffel for ASP.NET installation program will grant read and write access to the Eiffel Metadata Cache folder for the ''ASPNET'' (default ASP.NET worker process account on Windows XP Professional) and the ''IIS_WPG'' (default ASP.NET worker process account on Windows Server 2003) accounts. }}
+The path to the Eiffel Metadata Cache folder might be changed via the [[Eiffel CodeDom Provider Manager|Eiffel CodeDom Provider Manager]] , make sure the new folder can be read from and written to by the account running the process that uses the Eiffel CodeDom Provider.
+==Precompile Cache==
+The same requirements apply to the Precompile Cache folder. By default the Precompile Cache folder is located in the ''Precompile'' subfolder of the Eiffel CodeDom directory.
+{{note|The Eiffel for ASP.NET installation program will grant read and write access to the Precompile Cache folder for the ''ASPNET'' (default ASP.NET worker process account on Windows XP Professional) and the ''IIS_WPG'' (default ASP.NET worker process account on Windows Server 2003) accounts. }}
+As with the Eiffel Metadata Cache folder, it is possible to change the location of the Precompile Cache folder but the process running the Eiffel CodeDom Provider must always have read and write access to the folder.
+==Logging==
+Logging requires registry read access as well as event log write access. By default, the ASP.NET worker process does not have these permissions. The easiest way to grant the required permissions to the ASP.NET worker process is by using ASP.NET impersonation. This mechanism allows the ASP.NET worker process to run under a different account. This is done by providing a ''web.config'' file in the root folder of the ASP.NET application. The content of the configuration file needs to include the following declaration:
+
+
+
+
+
+
+where Username is the name of an account which has all the required permissions and Password the corresponding password. Refer to the .NET Framework SDK documentation for additional information on ASP.NET impersonation.
+The solution described above might not be acceptable on a production web server. However, it is possible to configure the Eiffel CodeDom Provider to log events on a different machine (see [[Eiffel CodeDom Provider Manager|Eiffel CodeDom Provider Manager]] ). The log machine should grant the appropriate permissions to the impersonated account for logging and could only be accessible through the web server. This setting would avoid having to grant additional permissions to the ASP.NET worker process account on the web server while still enabling logging.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/supported-constructs.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/supported-constructs.wiki
new file mode 100644
index 00000000..ac9b927d
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/eiffel-codedom-provider/supported-constructs.wiki
@@ -0,0 +1,37 @@
+[[Property:title|Supported Constructs]]
+[[Property:weight|2]]
+[[Property:uuid|99e15890-75a9-8b76-d0b6-b9be419be5ce]]
+Since not every language might support all the constructs CodeDom can represent, there needs to be a way for the CodeDom Provider to specify which constructs are supported and which ones are not. This is done through the System.Codedom.Compiler.ICodeGenerator interface using method Supports.System.Xml.NameTable -> NameTable
+
+# Underscores are introduced in between words (prior to upper case letters other than the first character):
+NameTable -> Name_Table
+
+# Eiffel class names are always upper case:
+Name_Table -> NAME_TABLE
+
+# If the assembly containing the type is associated with a prefix in the Eiffel system then the prefix gets prepended to the name:
+NAME_TABLE -> XML_NAME_TABLE
+
+The steps to follow to retrieve the Eiffel identifier corresponding to a .NET member are simpler:
+# For property getters, the "get_" prefix is removed:
+get_MaxOccursString -> MaxOccursString
+
+# Underscores are introduced in between words (prior to upper case letters other than the first character):
+MaxOccursString -> Max_Occurs_String
+
+# Eiffel feature names are always lower case:
+Max_Occurs_String -> max_occurs_string
+
+Although these simplified steps will work in most cases there are certain .NET identifiers that require additional manipulation to be translated into Eiffel. The [[Name Mapper|Name Mapper]] utility should be used when such cases arise.
+{{seealso|[[Name Mapper|Name Mapper]] }}
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/writing-aspnet-pages-eiffel/using-eiffel-write-aspnet-pages.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/writing-aspnet-pages-eiffel/using-eiffel-write-aspnet-pages.wiki
new file mode 100644
index 00000000..6ce435c5
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-aspnet-documentation/writing-aspnet-pages-eiffel/using-eiffel-write-aspnet-pages.wiki
@@ -0,0 +1,21 @@
+[[Property:title|Using Eiffel (to write ASP.NET pages)]]
+[[Property:weight|3]]
+[[Property:uuid|c8e2ffa7-cfa8-0b4c-4b5e-e1f386b7ab11]]
+==Inheritance==
+Eiffel handles inheritance in a different way than most languages. In C# or VB.NET the behavior of a newly introduced member in a class hierarchy is defined as part of the member declaration itself (for example C# will precede the member declaration with the keyword ''override'' to accomplish the same result as an Eiffel ''redefine'' clause). In Eiffel, classes are equipped with an inheritance clause which centralizes all the feature adaptations.
+As a result, Eiffel for ASP.NET introduces '''inheritance snippets'''. Each Eiffel ASP.NET page may include at most one inheritance snippet. Such a snippet must start with the '''inherit''' keyword and may then list any valid Eiffel feature adaptation.
+
+==String and Array Manifest Constants==
+The Eiffel programming language supports using '''manifest constants''' in source code. The type of these constants is inferred by the Eiffel compiler. There are two manifest constant types that require special attention on .NET: string and array. Because the Eiffel and the .NET types differ, writing code using string or array manifest constants requires additional care.
+* '''Strings''': Eiffel strings cannot be mapped directly to .NET strings because Eiffel strings are ''mutable'': an Eiffel string can be resized while the size of a .NET string is set for the lifetime of the object. However, the Eiffel class make"). What makes them creation procedures is the fact that their names are listed as creation procedures in the class text.
+
+In Eiffel, a creation procedure can be applied to an instance at any time (not just at object creation). This is done sometimes to reinitialize existing instances.
+
+==Constructors in .NET==
+
+Like creation procedures in Eiffel, .NET constructors are used to initialize new instances of types. Constructors manifest themselves differently depending upon which .NET language you use. In C#, constructors always appear as a method having the same name as the class on which they are implemented. In Visual Basic .NET, they always appear as a Sub with the name New. Once compiled into an assembly, the metadata labels constructors as . ctor.
+
+Constructors can have multiple versions by overloading. That is, each version would have a different set of argument types.
+
+Constructors can only be applied when a new instance is created.
+
+===Constructors as Eiffel Creation Procedures===
+
+When types from .NET assemblies are made available to Eiffel systems, the constructors are presented as creation procedures. Just as constructors show up in the C# and VB.NET environments with names appropriate to those languages, so it is with Eiffel for .NET. Always, constructors will have feature names which begin with the word "make", the convention for creation procedure naming in Eiffel.
+
+If there is only one version of the constructor, that version will be mapped to a single feature named make. However, if there are overloaded versions of the constructor, then these versions given names starting with "make_from_" and then followed with the argument names from the assembly metadata separated with the conjunction "_and_". Let's look at an example.
+
+The .NET type System.Drawing.Sizehas an overloaded constructor with two versions. In the System.Drawing assembly metadata, these two constructor versions look like this:
+
+void .ctor(int32 width, int32 height)
+void .ctor(System.Drawing.Point pt)
+
+
+So the argument names for the first version are width and height. For the second version there is only one argument named pt. The constructor versions as presented to Eiffel programmers as creation procedures look like this:
+
+make_from_width_and_height (width: INTEGER; height: INTEGER)
+make_from_pt (pt: DRAWING_POINT)
+
+
+Presenting the names in this format handles the conflicts of overloading and provides reasonably intuitive names that comply with Eiffel naming conventions.
+
+===Eiffel Creation Procedures as Constructors?===
+
+Eiffel creation procedures do not map to constructors when Eiffel classes are compiled into assemblies. Rather, they are actually manifested as functions on a factory class in the namespace Create in the assembly. These functions return an initialized instance. In the section Type Organization there is more information about the organization of the types in assemblies built with Eiffel for .NET, along with an example of using types from such an assembly.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/eiffel-class-and-feature-names.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/eiffel-class-and-feature-names.wiki
new file mode 100644
index 00000000..11ad8675
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/eiffel-class-and-feature-names.wiki
@@ -0,0 +1,218 @@
+[[Property:title|Eiffel Class and Feature Names]]
+[[Property:weight|2]]
+[[Property:uuid|16e4a231-7aae-4b37-52fd-67876cc222ad]]
+Certain naming conventions are respected by Eiffel programmers. Although Eiffel is not case-sensitive, convention dictates the use of upper and lower case in particular situations. When you program in Eiffel for .NET, you create new Eiffel classes, but you also use types from .NET assemblies. These .NET types are presented to you in a view that is consistent with Eiffel conventions.
+
+==Eiffel Class Names==
+
+Convention dictates that Eiffel class names are always all upper case characters with words separated by the underscore ("_") character. Eiffel classes are not qualified by "namespace" as in some other languages. This means that Eiffel class names must be unique with in a system. It also means that any types from existing .NET assemblies will have their names mapped to conventional Eiffel class names in order to be used by Eiffel classes in EiffelEnvision
+
+Here are some class names and their descriptions from the Eiffel Base Library. These class names comply with the Eiffel class naming convention.
+
+STRING
+
+ Sequences of characters, accessible through integer indices in a contiguous range.
+
+RANDOM
+
+ Pseudo-random number sequence, linear congruential method.
+
+ARRAYED_LIST
+
+ Lists implemented by resizable arrays.
+
+LINKED_QUEUE
+
+ Unbounded queues implemented as linked lists.
+
+
+
+Now here are some type names from the .NET mscorlib as they appear as conventional Eiffel class names (i.e. , in the form in which they become available to Eiffel for .NET programmers), followed by their full .NET type and their Summary from the .NET library. names.
+
+SYSTEM_STRING
+
+System.String
+
+ Represents an immutable series of characters.
+
+SYSTEM_RANDOM
+
+System.Random
+
+ Represents a pseudo-random number generator, a device that produces a sequence of numbers that meet certain statistical requirements for randomness.
+
+ARRAY_LIST
+
+System.Collections.ArrayList
+
+ Implements the System.Collections.IListinterface using an array whose size is dynamically increased as required.
+
+SYSTEM_QUEUE
+
+System.Collections.Queue
+
+ Represents a first-in, first-out collection of objects.
+
+
+
+In summary, Eiffel class names and type names from .NET assemblies made available to Eiffel programmers will be all upper case, with words separated by the underscore character.
+
+===Eiffel Names for .NET Types===
+
+How Eiffel compliant names are derived from .NET type names is fairly simple in most cases. The "simple" class name, that is, the word following the rightmost dot in the full class name, is converted to an Eiffel compliant name by making it upper case and separating in embedded words by underscore. In the example above, System.Collection.ArrayList becomes ARRAY_LIST.
+
+The other cases in the example are not quite so simple. If the basic derivation produces a name which conflicts with a classname in the Eiffel Base Library, then it will be disambiguated. The simple derivation of STRING is a different class from the .NET type System.String, which Eiffel programmers see represented as Eiffel class SYSTEM_STRING. There is more on this subject in [[Similar Types Occurring in Both Libraries|Similar Types Occurring in Both Libraries]] .
+
+==Eiffel Feature Names==
+
+By convention, feature names in Eiffel use all lower case characters, and like class names, words are separated by underscore. Also as with class names, the names of members from .NET assemblies will be represented in a form that complies with the Eiffel convention.
+
+Let's look at some simple examples. First some feature names from the Eiffel Base Library.
+
+to_upper
+
+ From class STRING: Converts to upper case.
+
+item_double
+
+ From class RANDOM: The current random number as a double between 0 and 1
+
+
+
+Now check out these member names from the .NET "mscorlib" type library. These have been made available to Eiffel for .NET programmers in the Eiffel convention. Following the Eiffel name, you see their .NET member name and type name.
+
+to_upper
+
+ Member ToUpper from typeSystem.String
+
+ Returns a new System.String with the same content as the target, except all upper case.
+
+next_double
+
+ Member NextDouble from type System.Random
+
+ A double-precision floating point number greater than or equal to 0.0, and less than 1.0.
+
+
+
+So, Eiffel feature names, and the names of .NET members made available to Eiffel for .NET programmers, are all lower case with words separated by underscores.
+
+==Overloaded .NET Member Names==
+
+The .NET object model allows overloading of function names. This means that a .NET type can support multiple functions with the same name, that vary only by the types of the arguments they accept. For example, the .NET type System. Text. StringBuilder supports nineteen overloaded versions of the Append function. Here are a couple of examples, in their .NET forms:
+
+.NET function signature: Append(System.String)
+
+Member of type System.Text.StringBuilder
+
+ Appends a copy of the specified string to the end of this instance.
+
+.NET function signature: Append(System.Char)
+
+Member of type System.Text.StringBuilder
+
+ Appends the string representation of a specified Unicode character to the end of this instance.
+
+
+
+The Eiffel programming language does not allow overloading routine names. That means that you cannot code multiple routines with the same name in a single class. That in itself is not a problem. But it also means that to work in the .NET environment, where overloading is allowed some compromise has to be made. So, what happens is this: if you are programming in Eiffel for .NET and you are using types from a .NET assembly, those types will be presented to you as if they are Eiffel classes. We have already seen that the type and feature names will be shown in the Eiffel naming convention. With overloaded feature names, the presentation will use name augmentation to disambiguate the overloaded versions. What you see is a distinct feature name for each overloaded version. The basic feature name is augmented by adding the types of its respective arguments, separated by underscore.
+
+Let's look again at the two Append functions from System.Text.StringBuilder.
+
+.NET function signature: Append(System.String)
+
+Known to Eiffel as: append_string (value: SYSTEM_STRING)
+
+Member of type System.Text.StringBuilder, known to Eiffel as STRING_BUILDER
+
+ Appends a copy of the specified string to the end of this instance.
+
+.NET function signature: Append(System.Char)
+
+Known to Eiffel as: append_character (value: CHARACTER)
+
+Member of type System.Text.StringBuilder, known to Eiffel as STRING_BUILDER
+
+ Appends the string representation of a specified Unicode character to the end of this instance.
+
+
+
+The overloading story does not end quite yet. The .NET object model allows the overloading of constructors. This issue will be discussed in the section Constructors and Creation Procedures.
+
+==.NET Properties as Eiffel Features==
+
+Properties in .NET provide:
+* the opportunity to '''strengthen encapsulation,''' because values cannot be receive assignment without executing the property's "set" code
+* '''uniform access ''' queries because properties are queries, but unlike previous C-style OO languages in which properties did not exist, if a property is used in programming a client class, the programmer does not need to know whether the data provided by the property was done so from memory or through computation. This leaves the producer of the class with the property the latitude to change the implementation without breaking existing clients.
+
+In Eiffel, the same goals are fulfilled, but a little differently. Simple attributes are well-encapsulated, because the Eiffel programming language does not allow direct assignment to them from outside the control of their class. So any assignment of the form x. f := y is not valid in Eiffel. To allow client to set values of the attribute f, the producer of the class of which x is an instance would have built a command (a "set_" procedure) to do so. Then the code in a client to set f would look like this: x.set_f (y).
+
+Uniform access is achieved in Eiffel through the way in which clientssee features which are queries. The code " print ( x.count)" applies the query count to the object attached to x and prints the result. You cannot tell by looking at this code whether count is an attribute or a function, that is, whether the count is returned from memory or through computation. In fact, it could be either, but that is a matter for its producer to deal with. As reuse consumers the implementation of countis not important to us ...but the fact that the producer can change the implementation without causing our code to need modification is very important to us.
+
+Because Eiffel does not support properties directly, the propertiesof typeswhich Eiffel for .NET programmers usefrom .NET assemblies have to be mapped to Eiffel features.
+
+In order to ask for the property's current value (technically, receiving the result of the property's get routine), a query feature is generated for the property. The query will be namedthe Eiffel name of the property.
+
+As noted above, setting the value of a property cannot be done in Eiffel as it is done in C# and VB.NET because Eiffel disallows assignments of the form x.f := y. So, for each writable property, an Eiffel command feature is available to set the value of the property. The name for this command will be "set_" followed by the Eiffel name for the property.
+
+As a result, the code for using a .NET property looks very much like the code to use an Eiffel attribute. In the following code fragment, an instance of the type System.Windows.Forms.Form which is available in Eiffel for .NET as WINFORMS_FORM is used by an Eiffel client. System.Windows.Forms.Form has a property Text which is of type System.String. Here the Text property is being set using the set_text feature, and then being recalled by using the query text.
+
+ local
+ my_window: WINFORMS_FORM
+ my_string: SYSTEM_STRING
+ do
+ create my_window.make
+ my_window.set_text (my_window_title) -- Set Text property
+ my_string := my_window.text -- Query Text property
+ .
+ .
+ end
+
+
+==Static Features in .NET==
+
+In the .NET object model it is possible for certain members of a type to be "static". When these members are used, they are used without an instance of the class as a target. In essence, they are called on the class itself.
+
+In Eiffel for .NET, these staticmembers will made available with feature names derivedusing the same conventions as ordinary features, but applying them will be a bit different.
+
+There is not a concept analogous to static members in Eiffel. The model for object-oriented computation in Eiffel specifies that whenever feature application takes place, there must be an object, i.e. an instance of some class, that serves as a target.
+
+In order to use .NET types that include static members, a special syntax has been added into Eiffel for .NET. The following example uses this syntax to call a static function:
+
+ local
+ my_window: WINFORMS_FORM
+ do
+ create my_window.make
+ my_window.set_text (my_window_title)
+ .
+ .
+ feature {WINFORMS_APPLICATION}.run_form (my_window)
+ end
+
+
+
+The type System.Windows.Forms.Application is used here. It is available to Eiffel under the name WINFORMS_APPLICATION. The static member being used is Run, in particular the overloaded version of Run which takes an argument of type System.Windows.Forms.Form. That version is available in Eiffel under the name run_form.
+
+The important thing to see here is that when you need to apply a static member, you introduce the call with the keyword feature. Then enclose the type name in braces and apply the feature as if it were targeted to an object. This isfairly close to the way that the call would be made in C#, where the feature name would be applied to the type name, versus a target object:
+
+{
+ Form my_window;
+ my_window = new Form();
+ my_window.Text = "Hello World!";
+ .
+ .
+ Application.Run(my_window); // This is C#
+}
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/eiffel-net-terminology.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/eiffel-net-terminology.wiki
new file mode 100644
index 00000000..a61f0b2c
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/eiffel-net-terminology.wiki
@@ -0,0 +1,172 @@
+[[Property:title|Eiffel for .NET Terminology]]
+[[Property:weight|1]]
+[[Property:uuid|ab1ac480-e2d3-df5d-5f06-963899f1072d]]
+==Eiffel Terminology Defined for C# and VB.NET Programmers==
+
+Eiffel programmers feel that it is important to have a set of precise terms with which to communicate about our method of software development. Like everything else in Eiffel, the use of certain terms is not accidental. They were chosen carefully to impart particular meaning. Many of the Terms that Eiffel programmers use are different from those used by developers using other object-oriented languages. But that does not mean that their meanings will be foreign to you. If you have some understanding of object-oriented technology, you will find that in many cases the Eiffel terms describe concepts with which you were already familiar, just under different names, and possibly with slightly different meanings.
+
+The intention of this glossary is to give you a list of these terms with extended definitions that will relate the Eiffel terms to language with which you may be more familiar. Also, you will find an occasional term which comes from other programming cultures but is not used in Eiffel.
+{|
+|-
+| Term
+| Definition
+|-
+| Ancestors
+| The set of Classes from which a particular Class Inherits, including the Class itself. Somewhat analogous to Bases and Interfaces in C# and VB.NET (see Proper Ancestors).
+|-
+| Argument
+| An object which is passed to a routine. Called a Parameter in C# and VB.NET.
+|-
+| Assertion
+| A declaritive expression that evaluates to true or false. Assertions in Eiffel are of different types and are used primarily for expressing software specification to potential Reuse Consumers and ensuring that executing software complies with specification. Any violation of an assertion causes an exception, and is generally indicative of a defect in the software system.
+|-
+| Attribute
+| A Feature which represents storage used in every instance of a class. Used like a Field member in C#.
+|-
+| Class
+| Software text which is the static definition of a Type (or the pattern for a Type in the case of a Generic Class). Used in very nearly the same way as in C#. In C# Classes are used for reference types and Structures for value types. In Eiffel, Classes are used for both, but see Expanded Class.
+|-
+| Class invariant
+| An Assertion on a Class which defines the valid or stable state for objects which are instances of the Class. All instances of the Class must comply with the Class Invariant at any time that they are accessible to Clients.
+|-
+| Client
+| A Class whose role is that of Client in a Client/Supplier Relationship with another Class.
+|-
+| Client/Supplier relationship
+| One of the two Relationships that can exist between Classes. Client/Supplier is characterized by a situation in which one Class, called the Client, has or uses, instances of the other Class, called the Supplier. For example, if class "X" declares an entity "y" of type STRING, then Class X becomes a Client to Class STRING as a result. At the same time, Class STRING becomes a Supplier to class X.
+|-
+| Cluster
+| A group of classes (or recursively, clusters) which share some criteria which justifies their being grouped together. Classes are usually clustered together because they model similar entities or have similar functionality. For example, in the Eiffel Base Library, there is a cluster called "structures" which contains clusters for data structures. One cluster is "list" which contains classes like LINKED_LIST and TWO_WAY_LIST. Another "structures" cluster is "dispensers" which contains classes like "ARRAYED_STACK" and "PRIORITY_QUEUE". When .NET assemblies are made available to Eiffel programmers, each assembly is viewed as a cluster.
+|-
+| Command
+| A Class Feature which can change the state of the instance to which it is applied, and does not return a result. It is the Reuse Consumer's view of a Procedure.
+|-
+| Contract
+| Like a contract between human parties, a software Contract is a formal agreement between software components, Classes in the case of Eiffel. The contract is written in the Assertions of a Supplier Class and specifies in precise terms those conditions with which potential Clients may interact with the Supplier. The contract for a particular Class is composed of the contracts for each Exported Routine of the Class as well as the Class Invariant.
+|-
+| Creation Procedure
+| A Procedure which can be used to initialize and instance of a Class. Similar to a Constructor in C# or VB.NET, but slightly different. A Creation Procedure can be applied when an object is being created, but can also be applied later to reinitialize an existing object (such is not the case with Constructors). Also, Creation Procedures are responsible for ensuring that newly created objects comply with their Class Invariants.
+|-
+| Deferred Class
+| A class which has at least one Deferred Feature. The term "Deferred" is used in the Eiffel culture like the term "Abstract" in .NET. Like an abstract class in C# or VB.NET, it is not possible to make direct runtime instances of a Deferred Class.
+|-
+| Deferred feature
+| A Class Feature which has not implementation. Like a virtual method in C#. Can apply to Commands or Queries.
+|-
+| Descendents
+| The set of all Classes which Inherit from a particular Class, including the Class itself. Somewhat analogous to subclasses in C# and VB.NET (see Proper Descendants).
+|-
+| Design by contract
+| A method of developing software in which a System is composed of a set of interacting Classes which cooperate based upon precisely defined Contracts.
+|-
+| Direct instance
+| A runtime Object of some type, based directly on the definition from a specific Effective Class. See Instance for more information. Usually used in conjunction with the class name, e.g. "an instance of class POLYGON".
+|-
+| Effective class
+| A Class which has no Deferred Features. Only if a Class is Effective can it have direct runtime instances. Effective classes are called Concrete Classes in some programming cultures.
+|-
+| Eiffel Metadata Consumer
+| Applicable to Eiffel for .NET only, this is a mechanism that works behind the scenes to make Types from .NET assemblies available to Eiffel programmers. The Metadata Consumer reconciles the differences between the naming conventions of Eiffel and .NET by providing an Eiffel compliant view of the Types in .NET assemblies.
+|-
+| Expanded Class
+| Like a value type in C#, but with some restrictions. .NET value types are viewed to Eiffel programmers as Expanded Classes. For reference types, an object field holds a reference to a runtime object (or is Void). For value types, the object field holds the fields of the runtime object. A Type based on an Expanded Class is an Expanded Type.
+|-
+| Exported feature
+| A Feature which is available to Client Classes. Analogous to "public" in C# and VB.NET. However, Exporting in Eiffel has fine granularity. It is possible to make certain Features available to Clients of all types or only to Clients which conform to certain named Classes (vs Public, Protected, Private)
+|-
+| Feature
+| Any of a Class's Attributes or Routines. Used similarly to the term Member as in C#. In Eiffel class features can be only Attributes or Routines.
+|-
+| Feature Application
+| The process of using the Class Features on instances of the Class. The model for Feature Application is "x.f(a,...)" where "x" is an entity which will be attached to some object at runtime, "f" is some Feature of the Class on which x is based, and "a,..." is an optional list of arguments which may be appropriate for some Routines. Feature "f" is "applied" to the object attached to "x". Feature Application may involve calling Routines, or may only involve returning the value of an Attribute from memory. Feature application is sometimes called "feature call".
+|-
+| Function
+| A Routine that returns a result. In C# function results can be typed as "void", meaning that there is no result returned. Eiffel functions cannot be typed "void" (see Procedure). All Functions must specify a result type. Of course, if the result type is a reference type, there could be cases in which the reference resulting from some specific call might be Void.
+|-
+| Generic Class
+| A Class which is written using parameters to represent other Classes or Types to enhance its reusability. For example, the Class LINKED_LIST [G] is a generic class in which "G" represents some other Class. So, LINKED_LIST is written independent of the items an instance of the list will hold. We cannot declare a LINKED_LIST without specifiying a Class to substitute for "G". If we want a list of cats we can declare one by using the Type: LINKED_LIST [CAT]. Generic Classes are not currently implemented in .NET, so there's no corresponding concept in C#.
+|-
+| Inheritance
+| One of the two Relationships that can exist between Classes. If Class B inherits from Class A, then every feature in Class A is potentially available to instances of Class B. Also, when ever an instance of Class A is required, an instance of Class B will suffice. Inheritance is used in Eiffel much the same as in C#. The Eiffel model allows full, controlled multiple inheritance, though. Eiffel Classes may inherit from multiple Concrete Classes and name clashes are handled through a process called Feature Adaptation.
+|-
+| Heir
+| The adjacent Proper Descendants of a Class. If class C inherits from class B and class B inherits from class A, then class A's Proper Descendants include B and C, but A's Heirs only include B.
+|-
+| Instance
+| A runtime Object of some type, based on the definition from a Class. Usually used in conjunction with the class name, e.g. "an instance of class POLYGON". In contrast with Direct Instance, an Instance of class POLYGON is a Direct Instance of POLYGON or any Proper Descendant of POLYGON such, perhaps, as RECTANGLE. So it its possible to have Objects which are Instances of Deferred Classes, but it is impossible to have Objects which are Direct Instances of Deferred Classes.
+|-
+| Interface
+| Not supported as such in Eiffel. Used in C# and VB.NET, Interfaces provide sets of specific Class Features which must be effected by any Concrete Class that "implements" the Interface. There is no concept of Interface in Eiffel that is separate from the concept of Class. So, Interfaces from .NET appear to Eiffel programmers to be completely Deferred (abstract) Classes.
+|-
+| Manifest string
+| A quoted string used in source code, for example the "Hello World!" in: .ctor". But, if you're in C# and look at the same constructor in the Visual Studio .NET Object Browser, the constructor will have the same name as the type ...it's a C# convention. Likewise, the same constructor viewed in Visual Basic .NET will have the name New ...that's the Visual Basic .NET convention. So, when you use EiffelEnvision, you see things as presented using Eiffel Conventions.
+
+Consider what happens when you look at .NET types using EiffelEnvision. When you look, for example at the type System.EventArgs, you will see it represented as an Eiffel class called EVENT_ARGS. The members of the .NET type will show up as features of the Eiffel class. Of course, you can also see the corresponding .NET names as they exist in the assembly metadata.
+
+The documents in this section tell you what you need to know in order to use .NET types in Eiffel, and vice versa.
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/similar-types-occurring-both-libraries.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/similar-types-occurring-both-libraries.wiki
new file mode 100644
index 00000000..ed26a85a
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/similar-types-occurring-both-libraries.wiki
@@ -0,0 +1,77 @@
+[[Property:title|Similar Types Occurring in Both Libraries]]
+[[Property:weight|5]]
+[[Property:uuid|4c9f6ad8-107b-af69-3eb3-3f076f2c936c]]
+==Whose String is it anyway?==
+
+Over the last 15 years or so, the Eiffel class libraries have been a source for reusable software components for developers.
+
+The Eiffel Base library contains classes for commonly used objects like different kinds of numbers, strings, files, and data structures.
+
+But there are also libaries of Eiffel classes for sophisticated purposes like lexical analysis and parsing, data access, and graphical user interface development.
+
+Likewise .NET is delivered with assemblies containing thousands of powerful types with similar purposes.
+
+===Working in Both Worlds===
+
+When we build software that has access to both the rich Eiffel libraries and the many useful .NET types, we inevitably run into types from both worlds that have similar names and purposes, but are still different types with different semantics.
+
+===The Case of Strings===
+
+The example of these similar types which will almost certainly get in your face is the string types. You may remember that we looked briefly at the case of the string types in Naming Conventions and Name Handling.
+
+The Eiffel Base Library contains class STRING; the .NET assembly contains type System.String, which Eiffel for .NETusers see as SYSTEM_STRING. At an abstract level both of these model sequences of characters. But they are not the same type. In fact, they are different in some important ways. For example, instances of System.String are immutable. So you cannot append to an instance of System.String. If you want to build a string by appending, you should use an instance of System.Text.StringBuilder to do the appending, then extract the instance of System.String from it. With STRING it is permissible to append, so you don't need a helper like the System.Text.StringBuilder type.
+
+So the two types are similar at an abstract level, but different semantically. There are reasonable arguments for the design of each.
+
+Many types in the delivered assemblies have properties which are strings or methods which return or take strings as arguments. In all these cases, the strings in question are instances of System.String.
+
+Many classes in the delivered Eiffel libraries have features involving strings, that is attributes which are strings or routines which return or take strings as arguments. In all these cases, the strings are instances of STRING (except for those designed for .NET compliance).
+
+In C# and VB.NET, if you specify a quoted string like "Hello World!" in your code, that string will conform to type System.String. If you do the same in Eiffel, then "Hello World!" will be an instance of STRING. In Eiffel terminology, "Hello World!" appearing in source code is a manifest string.
+
+What all this means to you is that you cannot use an instance of System.String when an instance of STRING is called for, and vice versa. Three out of four of the executable lines in the following code sample are invalid:
+
+ local
+ my_string: STRING
+ my_system_string: SYSTEM_STRING
+ do
+ my_system_string := "Hello World!" -- Invalid
+ my_string := "Hello World!" -- Valid
+ my_string := my_system_string -- Invalid
+ my_system_string := my_string -- Invalid
+ .
+ .
+ end
+
+
+To handle this issue, the Eiffel for .NET class STRING has two features which can be used when a string of the other type is needed.
+
+The first of these features is a query to_cil which returns an object of type System.String which has a sequence of characters equivalent to that of the STRING to which to_cil is applied. The to_cil can be applied to manifest strings by enclosing the manifest string in parentheses.
+
+The other feature is a creation procedure named make_from_cil which takes as an argument an instance of System.String and initializes its target STRING with a sequence of characters equivalent to that of the argument.
+
+In the following sample, we use these features of STRING to make all the lines from the previous sample valid.
+
+ local
+ my_string: STRING
+ my_system_string: SYSTEM_STRING
+ do
+ my_system_string := ("Hello World!").to_cil -- Valid
+ my_string := "Hello World!" -- Valid
+ my_string.make_from_cil (my_system_string) -- Valid
+ my_system_string := my_string.to_cil -- Valid
+ .
+ .
+ end
+
+
+{{note|As shown in the above example, it is necessary to apply to_cil to a manifest string if you are assigning it to a System.String or passing it as an argument where a System.String is called for. to_cil to manifest strings. Instead, whether a STRING or System.String is needed will be determined by the context in which the manifest string is being used, and the proper type of object will be generated. }}
+
+===Other Similar Types===
+
+There are many other cases of types available from the .NET assemblies which have similar purpose and semantics to those found in the Eiffel libraries. Fortunately, there is none that you will have to deal with as often as strings.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/type-organization.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/type-organization.wiki
new file mode 100644
index 00000000..8aa4f7f3
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/conventions/type-organization.wiki
@@ -0,0 +1,56 @@
+[[Property:title|Type Organization]]
+[[Property:weight|3]]
+[[Property:uuid|1837e091-695b-339c-f04f-cbfaea791a6c]]
+In any comprehensive object-oriented system, the act of programming results in creation of new data types. There must be a way of organizing these types and/or their static representation as classes. This section tells you how classes are organized in Eiffel and in .NET, and how these organization methods are used together.
+
+==Eiffel Clusters==
+
+Eiffel classes are grouped in clusters. These clusters of classes ordinarily share some commonality of functionality or purpose. In other words,the classes in a particular cluster may provide the same sorts of capabilities or relate to a single software model. In the Eiffel Base Library there is a cluster called list which contains classes which implement different types of lists, for example, ARRAYED_LIST, LINKED_LIST, SORTED_TWO_WAY_LIST, TWO_WAY_CIRCULAR. At an abstract level all these classes are related to the software model of the notion of "list".
+
+The cluster list is actually a subcluster of the cluster structures which contains clusters other than list related to data structures other than lists. Eiffel convention dictates that a cluster should either contain classes or subclusters, but not both.
+
+So clusters serve both to categorize and locate classes. So, class LINKED_LIST can be described as a basic library class implementing a data structure, more particularly a list. As such, it can be found in the Base Library, in cluster structures in subcluster list.
+
+==.NET Namespaces and Assemblies==
+
+In .NET, types (the language independent, compiled form of classes) are stored in "assemblies". So, we locate a type we want to use by referencing the assembly in which it resides.
+As .NET programmers, we think of types as being categorized by namespace. For example, we view the type System.Windows.Forms.TextBox as the TextBox type in the context of the windows forms namespace ( System.Windows.Forms). Particularly, this is in contrast to type System.Web.UI.TextBox which is a TextBox for web forms. As it relates to making .NET types usable by Eiffel, the important thing to understand is that the real .NET type name is the fully qualified type name, including the namespace. Namespaces are simply a bit of "syntactic sugar" that keeps us from having to repeat the entire type name every time we use it in source code.
+===.NET Assemblies Available to Eiffel===
+When types from .NET assemblies are made available to Eiffel programmers, each assembly is mapped to a cluster. So all the types in an assembly appear as if they were Eiffel classes in a cluster which corresponds to the .NET assembly.
+To summarize, as you learned in Naming Conventions and Name Handling, unambiguous Eiffel-style names are made available for the.NET types in an assembly. The assembly is represented to Eiffel for .NET programmers as a cluster of classes. The process of name derivation is based upon a portion of the .NET type name, possibly augmented with a prefix to ensure uniqueness.
+
+===Assemblies Built with Eiffel===
+
+The object model for which Eiffel was designed differs in some ways from the .NET object model. Importantly, Eiffel supports the facilties of full, controllable multiple inheritance, and genericity, among other things, that the inherent .NET object model does not. That does not mean that these things cannot work in .NET. Indeed they can, and they make Eiffel for .NET very powerful. But, they do make things look a little different.
+
+When you compile Eiffel for .NET, the result is a .NET assembly; either an executable system, or a library of potentially reusable data types. Because the object model for Eiffel is different from that of .NET, the assembly resulting from a compile is different in some ways.
+
+First an assembly built using Eiffel for .NET will likely contain lots of types and interfaces. This is because as you use a class from the Eiffel libraries, say class STRING, all the classes upon which STRING depends ( STRING's suppliers and ancestors) must also be included in the assembly. That's because the Eiffel libraries, unlike the Microsoft .NET libraries like mscorlib and System.Data, are not distributed as shared type libraries.
+
+Another thing you may notice is that each Eiffel class you produce is represented by three entities in the assembly ... two classes and an interface. So, if you produce a class called GUARD_DOG, then in the assembly you'd see an interface called GuardDog, a class called Impl.GuardDog, and a class called Create.GuardDog. Again, this is done for reasons that concern the differences in the object models between Eiffel and .NET.
+
+The GuardDog interface is what you use when you declare an entity or variable of that type. The objects attached to that entity at runtime will be of the type Impl.GuardDog. You create an instance of Impl.GuardDog and attach it to an entity of type GuardDog by calling a routine in the factory class Create.GuardDog. The factory routines will almost always have names that begin with the word " Make", and represent the creation routines of Eiffel the classes. So in the case of using an instance of GuardDog from a C# class, the code would like this:
+
+{
+ GuardDog aGuardDog = Create.GuardDog.Make(); //Create an instance
+ aGuardDog.RollOver(); // Apply a feature
+}
+
+
+This object creation model accounts for some of the differences between constructors in .NET and creation procedures in Eiffel. These differences will be discussed in more detail in Constructors and Creation Procedures.
+
+Another advantage is that it provides a syntax that is similar to that used to create objects in Eiffel. An Eiffel for .NET client to the class GUARD_DOG might use the following code to create and use an instance.
+
+ local
+ a_guard_dog: GUARD_DOG -- Declare an entity of the type
+ do
+ create a_guard_dog.make -- Create an instance and attach to entity
+ a_guard_dog.roll_over -- Apply a feature
+ end
+
+
+You may have noticed in these examples that even though the type GuardDog was compiled from an Eiffel class, when the C# client uses GuardDog, it uses what would be considered the .NET naming convention for the type GuardDog (vs. GUARD_DOG) and the method name RollOver (vs roll_over). What happens here is that when assemblies are produced from Eiffel classes, by default .NET naming standards are used in the assembly.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net-integration.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net-integration.wiki
new file mode 100644
index 00000000..71c963ef
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net-integration.wiki
@@ -0,0 +1,76 @@
+[[Property:title|Eiffel for .NET Integration]]
+[[Property:weight|3]]
+[[Property:uuid|fe8a6a7d-4590-0db2-d59a-307082b18ecc]]
+==Differences between Eiffel and Eiffel for .NET==
+
+===Limitation of Eiffel for .NET in version 5. 5===
+
+Most of the Eiffel mechanisms are supported in 5. 5. All missing features listed below are planned for addition in future releases:
+* No creation of Eiffel expanded class support
+* Partial implementation of generic conformance (same as what was supported up to and including the 4.2 release of the Eiffel development environment).
+
+Eiffel for .NET supports:
+* Multiple Inheritance
+* Design By Contract
+* Exception handling
+* Genericity
+* Covariance
+* Compilation of any existing Eiffel libraries as long as it does not include C externals that call into the Eiffel Software C runtime
+
+===Added to Eiffel and Eiffel for .NET===
+
+The following syntax can be used to declare .NET custom attributes on Eiffel entities (features and classes):
+
+ empty: BOOLEAN
+ note
+ description: "Is Current empty?"
+ metadata: create {OBSOLETE_ATTRIBUTE}.make_obsoleteattribute_1 ("Use `is_empty' instead") end
+ obsolete
+ "Use is_empty instead"
+ do
+ Result := is_empty
+ end
+
+
+The previous example shows the declaration of the obsolete feature empty . The custom attribute defined by OBSOLETE_ATTRIBUTE is used to ensure that any consumer of the resulting assembly will see the feature as being obsolete. The custom attribute is defined in the note clause metadata. The definition consists of a creation expression that creates the custom attribute with the right parameters.
+
+Using the metadata tag is the most general way of applying a custom attribute. There are however some variations that are explained below:
+*metada: most general way, it applies a custom attribute to both the class and interface generated by the Eiffel compiler.
+*class_metadata: applies only to the class generated by the Eiffel compiler (mostly for advanced users).
+*interface_metadata: applies only to the interface generated by the Eiffel compiler (mostly for advanced users).
+*property_metadata: applies a custom attribute to the associated property generated by the Eiffel compiler for a query.
+*assembly_metadata: applies a custom attribute for the current assembly. It only works when present in the Eiffel system root class note clause.
+
+==Differences between Eiffel for .NET and .NET==
+
+===Covariance===
+
+The CLR (Common Language Runtime) does not support [[ET: Inheritance#Covariance and anchored declarations|covariance]] due to a type safety issue that full covariance implies (known as a polymorphic [[ET: Inheritance#Catcalls|catcall]] in Eiffel). Although very rare, catcalls are not suitable to .NET where safety is one of the primary goals.
+
+Eiffel for .NET implements a safe variant of covariance that will always perform a check on the types to avoid a catcall. So when a catcall is going to be performed a `Invalid Cast Exception` will be raised by the CLR instead of an unexpected behavior as is the default behavior in classic Eiffel (i.e., the behavior without catcall detection explicitly enabled).
+
+Another advantage of Eiffel for .NET's implementation of covariance is that it can be easily understood by CLS compliant consumer tools. These tools will actually benefit from the Eiffel for .NET covariance.
+
+===Genericity===
+
+The CLR does not support generics at all, so that the following Eiffel for .NET classes:
+* LIST [ANY]
+* LIST [INTEGER]
+
+will actually be generated as:
+* LIST_ANY
+* LIST_Int32
+
+Meaning that if one wants to reuse an Eiffel generic class from another language than Eiffel for .NET, one has to use either LIST_ANY or LIST_Int32.
+
+===Enum types===
+
+Eiffel for .NET supports .NET enum types implicitly. From the point of view of Eiffel, they are just considered as expanded classes. The only difference is in the code generation. Eiffel for .NET cannot declare new enum types yet.
+
+===ByRef===
+
+Eiffel does not have the notion of `byref` argument passing. At the moment, Eiffel for .NET cannot call nor can it redefine a feature that has a byref argument.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/adding-class-features.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/adding-class-features.wiki
new file mode 100644
index 00000000..7fbb3869
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/adding-class-features.wiki
@@ -0,0 +1,535 @@
+[[Property:title|Adding Class Features]]
+[[Property:weight|2]]
+[[Property:uuid|04261c22-b28f-b045-a5d7-2c85efe992b9]]
+The features of a class make it useful. They are the things that objects which are instances of the class have and can do.
+
+It is during the process of adding class features that we relate a class we are producing to other classes via the client/supplier relationship.
+
+It is when we add features to a class that we can build the executable code that makes things happen.
+
+==Categorizing Features==
+
+In Eiffel, we have several ways of thinking abstractly about features and categorizing them. As you saw in [[Eiffel Classes|Eiffel Classes]] the feature clause gives us a way to group features in the software text. We have ways to group features more generally, too. Here are some.
+
+===Source===
+
+You remember the example class from [[Eiffel Classes|Eiffel Classes]] :
+
+note
+ description: Objects that model lists
+ revision: $Revision: 1.5 $
+
+class
+ OLD_FASHIONED_LIST [G]
+
+obsolete "This class is obsolete, use LINKED_LIST [G] instead"
+
+inherit
+ DYNAMIC_LIST [G]
+
+create
+ make
+
+feature -- Initialization
+
+ make
+ -- Create an empty list.
+ do
+ before := True
+ ensure
+ is_before: before
+ end
+
+feature -- Access
+
+ item: G
+ -- Current item
+ do
+ Result := active.item
+ end
+
+ first: like item
+ -- Item at first position
+ do
+ Result := first_element.item
+ end
+
+ ... other features omitted ...
+
+invariant
+ before_constraint: before implies (active = first_element)
+ after_constraint: after implies (active = last_element)
+end
+
+
+
+The example shows three of the features ( make, item, and first) coded directly in the class. These features (and the ones omitted from the example in the interest of brevity) may not be the only features of the class OLD_FASHIONED_LIST. In fact we can just about guarantee that there are other features of this class. Remember the inheritance part of the class:
+
+ inherit
+ DYNAMIC_LIST [G]
+
+
+This means that every feature in DYNAMIC_LIST will be a feature of OLD_FASHIONED_LIST. So one way we can think of features is by their source.
+* Immediate features are those that are introduced by a class itself.
+* Inherited features are those that come to the class from its proper ancestors.
+
+We will see more about this in [[Inheritance|Inheritance]] .
+
+===Implementation Type===
+
+Whenever we are building a class in Eiffel, we are potential reuse producers. As such, we can categorize the features of a class based on the three types of feature implementation:
+* Attribute
+* Function
+* Procedure
+
+Attributes are those features which occupy storage in an instance. When you code an attribute in a class that you are producing, that class becomes a client to the class of the attribute. This is the most common way to establish a client/supplier relationship between the classses. Client/supplier is one of the two relationships that can exist between classes.
+
+Functions and procedures are the computation features, that is they are features that involve executable code. Functions and procedures together are themselves categorized as routines.
+
+Also, from the producer standpoint we may view features as whether they work from memory or through computation:
+* Memory
+** Attribute
+
+* Computation
+** Function
+** Procedure
+
+
+This view can be valuable when a producer is considering performance issues. For example, if there is some class function called count, a producer might investigate whether it is better to leave count as a function, computing it each time the feature is applied, or to change it to an attribute and compute it less often.
+
+===Usage===
+
+A times we find it appropriate to categorize features by how we use them. Specifically, as:
+* Query
+** Attribute
+** Function
+
+* Command
+** Procedure
+
+
+Queries are features that, when applied to an instance, provide a value in response. Commands instruct an intance to take some action, but do not return a value. Seeing features as either queries or commands is of primary interest to reuse consumers. But as producers there are important reasons for ensuring that when we implement a feature, we implement it as a query or as a command, but not both. We will see more about this in [[Design by Contract and Assertions|Design by Contract and Assertions]] .
+
+==General Syntax of Features==
+
+===More Sample Features===
+
+Here is another example class. Again this class contrived, so it does not do anyhing worthwhile except show you what different types of features look like. This class has an attribute and a constant attribute, and functions and procedures both with and without arguments.
+
+class
+ SOME_CLASS
+
+create
+ make,
+ make_with_arguments
+
+feature -- Initialization
+
+ make
+ -- Creation procedure
+ do
+ an_attribute := 5
+ end
+
+ make_with_arguments (hour: INTEGER; minute: INTEGER; second: INTEGER)
+ -- Another creation procedure
+ do
+ an_attribute := second + (minute * 60) + (hour * 3600)
+ end
+
+feature -- Access
+
+ an_attribute: INTEGER
+ -- An attribute of type INTEGER
+
+ another_attribute: INTEGER = 46
+ -- A constant attribute
+
+ a_function: STRING is
+ -- A function without arguments
+ do
+ Result := an_attribute.out
+ end
+
+ another_function (an_int: INTEGER): INTEGER
+ -- A function with arguments
+ do
+ Result := an_attribute + an_int
+ end
+
+feature -- Basic Operations
+
+ a_procedure
+ -- A procedure with no arguments
+ do
+ an_attribute := an_attribute + 5
+ end
+
+ another_procedure (an_int: INTEGER; another_int: INTEGER)
+ -- A procedure with arguments
+ do
+ an_attribute := an_attribute + an_int + another_int
+ end
+
+end -- Class SOME_CLASS
+
+
+===Feature Declaration===
+
+When you write a feature in a class, you typically will include some of the following:
+* The feature's name
+{{note|In Eiffel every feature of a class must have a name that is unique within that class. }}
+
+* The feature's type (in the case of an attribute or a function)
+* The feature's formal argument list (in the case of a function or procedure that has arguments)
+* The actual value of the feature (in the case of a constant attribute)
+* The implementation code (in the case of a function or procedure)
+
+Let's dissect one feature and identify its parts:
+
+ another_function (an_int: INTEGER): INTEGER
+ -- A function with arguments
+ do
+ Result := an_attribute + an_int
+ end
+
+
+In this feature:
+* "another_function" is the feature's name.
+* "(an_int: INTEGER)" is the argument list.
+** "an_int" is the name of the first argument
+** "INTEGER" is the type "an_int"
+
+* "INTEGER" (after the argument list) is the feature's type.
+* "do " introduces the implementation code.
+* "Result := an_attribute + an_int" is an instruction.
+
+{{note|This feature is a function. As a consequence the computation uses the keyword "
+ insert_text_header_item (a_label: STRING;
+ a_width, a_format: INTEGER; insert_after_item_no: INTEGER)
+ -- Insert a text item to the header control
+ -- after the `insert_item_item_no' item.
+ require
+ exists: exists
+ label_not_void: a_label /= Void
+ insert_after_item_no_positive: insert_after_item_no >= 0
+ local
+ hd_item: WEL_HD_ITEM
+ do
+ create hd_item.make
+ hd_item.set_text (a_label)
+ hd_item.set_width (a_width)
+ hd_item.set_format (a_format)
+ insert_header_item (hd_item, insert_after_item_no)
+ ensure
+ item_count_increased: item_count = old item_count + 1
+ end
+
+
+Using this example, let's identify and discuss the different sections.
+
+===Header Comment===
+
+ -- Insert a text item to the header control
+ -- after the `insert_item_item_no' item.
+
+
+Although the feature's header comment is optional, most Eiffel programmers and their technical managers feel that it should never be omitted. Header comments are included by some language processing tools in specialized views of classes. Header comments are almost always short, usually no more than a few lines. Header comments serve to provide a natural language description of what the feature will do (in the case of features that are commands) or what information it provides (in the case of queries).
+
+===Obsolete===
+
+The feature insert_text_header_item is not obsolete ... but if it were it would include an obsolete clause. This works much like the obsolete part for classes that we saw in [[Eiffel Classes|Eiffel Classes]] : the keyword "obsolete" followed by a manifest string which bears a message to potential reuse consumers:
+
+===Precondition===
+
+ require
+ exists: exists
+ label_not_void: a_label /= Void
+ insert_after_item_no_positive: insert_after_item_no >= 0
+
+
+The precondition part of a feature is introduced by the keyword "require". It contains a set of assertions which define the state necessary for the correct execution of a routine. We will see more about assertions in [[Design by Contract and Assertions|Design by Contract and Assertions]] .
+
+===Local Declarations===
+
+ local
+ hd_item: WEL_HD_ITEM
+
+
+This part contains the declarations for any "local entities" used by the feature. Sometimes the computation accomplished in a feature requires the use of entities which are only temporary. It would not be appropriate to make these attributes of the class. So, instead we can use local entities, which have scope only within the feature in which they are declared. In the example, hd_item is available as type WEL_HD_ITEM during the computation of feature insert_text_header_item.
+
+{{note|A local entity name must not be the same as any feature of the class in which its feature occurs or the same as any argument name of the feature in which it occurs. }}
+
+===Routine Body===
+
+ do
+ create hd_item.make
+ hd_item.set_text (a_label)
+ hd_item.set_width (a_width)
+ hd_item.set_format (a_format)
+ insert_header_item (hd_item, insert_after_item_no)
+
+
+This is the routine body for a fairly typical effective, internal routine. It contains the instructions that get the job done for the feature. You may notice that experienced Eiffel programmers rarely write routine bodies that are more than a few lines long. The reason for this is more that just intuitive. This phenomenon will be explained in the section [[Design by Contract and Assertions|Design by Contract and Assertions]] .
+
+There are other forms that a routine body can take. Here are some examples of some others:
+
+====External Routines====
+
+ cwin_tooltips_class: POINTER
+ external
+ "C [macro ] : EIF_POINTER"
+ alias
+ "TOOLTIPS_CLASS"
+ end
+
+
+The routine body above is for an "external" routine. External routines are used to represent within Eiffel classes, routines that are written in other languages.
+
+{{tip|Because of the high degree of language interaction provided by Microsoft.NET, it is not necessary in Eiffel for.NET to use externals to use software components from.NET assemblies. Instead, these components are presented to the Eiffel programmer as if they were Eiffel classes. Read more about this in [[Conventions|Conventions]] . }}
+
+====Once Routines====
+
+ once
+ Result := some_computation
+
+
+This is the routine body of a "once" routine, specifically a "once function". A once routine is introduced by the keyword "once" rather than do. It contains an computational body that executes only the first time it is called. Upon subsequent calls it has no effect.
+
+Once procedures are useful for doing things that for some reason should not be done multiple times.
+
+If the once routine is a function (as the example above), it computes the resulting object on the first call, then on subsequent calls, it returns the object it originally created without executing the computation. Once functions facilitate shared objects which helps us in avoiding global entities. A class containing a once function can be inherited by many other classes. The first object to apply the once function causes the resulting object to be created and initialized. Subsequent applications by any other object accesses the originally created instance.
+
+====Deferred Routines====
+
+ deferred
+
+
+The body for a deferred routine is simply the keyword "deferred". Below is the deferred routine body in the context of an entire feature.
+
+ set_position (new_position: INTEGER)
+ -- Set `position' with `new_position'
+ require
+ exists: exists
+ valid_minimum: new_position >= minimum
+ valid_maximum: new_position <= maximum
+ deferred
+ ensure
+ position_set: position = new_position
+ end
+
+
+As we learned in [[Eiffel Classes|Eiffel Classes]] a deferred routine has specification, but no implementation. We will investigate deferred classes and features further in [[Inheritance|Inheritance]] .
+
+===Postcondition===
+
+ ensure
+ item_count_increased: item_count = old item_count + 1
+
+
+The postcondition part of a routine is introduced by the keyword "ensure". The postcondition is a group of assertions which describe the state that must be satisfied upon the successful completion of the routine. We will see more about assertions in [[Design by Contract and Assertions|Design by Contract and Assertions]] .
+
+===Rescue===
+
+Our example feature does not have an explicitly coded rescue part. The rescue, introduced by the keyword "rescue", provides a routine with a chance to do additional processing in the case that it incurs an exeption during normal processing. We will learn about the rescue clause in the section [[Exception Mechanism|Exception Mechanism]] . Until then, you can see what a rescue part looks like in the feature below.
+
+ bind
+ -- Bind socket to local address in `address'.
+ require
+ socket_exists: exists
+ valid_local_address: address /= Void
+ local
+ ext: ANY
+ retried: BOOLEAN
+ do
+ if not retried then
+ ext := address.socket_address
+ c_bind (descriptor, $ext, address.count)
+ is_open_read := True
+ end
+ rescue
+ if not assertion_violation then
+ is_open_read := False
+ retried := True
+ retry
+ end
+ end
+
+
+==Making Features Available to Clients==
+
+Remember that when we build classes in Eiffel, we keep in mind the possibility that these classes may eventually become valued, reusable software components. As a result we have a responsibility to make sure that our classes allow clients to use them in a safe and productive fashion. We make available those features that it is appropriate for clients to use, and we hide the rest. In Eiffel we say that a feature that is available to clients is "exported".
+
+Control of the export of features inherited from ancestors is done by using the "export" keyword. Export of inherited features will be discussed in Inheritance.
+
+Control of the export of immediate features (those features introduced in the text of a class) is done with the "feature" clause. We have encountered the feature clause already:
+
+feature -- Access
+
+ an_attribute: INTEGER
+ -- An attribute of type INTEGER
+
+ another_attribute: INTEGER = 46
+ -- A constant attribute
+
+ a_function: STRING
+ -- A function without arguments
+ do
+ Result := an_attribute.out
+ end
+
+ another_function (an_int: INTEGER): INTEGER
+ -- A function with arguments
+ do
+ Result := an_attribute + an_int
+ end
+
+feature -- Basic Operations
+
+ a_procedure
+ -- A procedure with no arguments
+ do
+ an_attribute := an_attribute + 5
+ end
+
+ another_procedure (an_int: INTEGER; another_int: INTEGER)
+ -- A procedure with arguments
+ do
+ an_attribute := an_attribute + an_int + another_int
+ end
+
+
+A feature clause like the ones in the example above means that all the features that follow, until the next feature clause are exported to clients based on any class. Technically, this
+
+feature -- Basic Operations
+
+
+is equivalent to
+
+feature {ANY} -- Basic Operations
+
+
+which means that the following features are available to clients which conform to class ANY. And in Eiffel, ANY is the class from which all other classes inherit. As a consequence all classes conform to ANY.
+
+Inside the braces is a list of classes which are eligible as clients.
+
+feature {STRING_HANDLER} -- Implementation
+
+
+Features following this example from class STRING will be available to client class STRING_HANDLER and all its proper descendants.
+
+As stated above, you can put a list of class names in the braces:
+
+feature {CLASS_A, CLASS_B, CLASS_C} -- Semi-private features
+
+
+Often features which are solely for implementation should not be seen or used by clients of any type. You can ensure this by exporting to class NONE, the class from which no other class can inherit:
+
+feature {NONE} -- Implementation
+
+
+==Eiffel Instructions and Control Structures==
+
+When you begin to write routines in Eiffel, you will need to understand how to write instructions. Fortunately, the set of instruction types you can code is fairly small. Here we will look the most common of these. You will see some more in other topics.
+
+===Creation===
+
+ create hd_item.make
+
+
+We discussed creation procedures and the process of bringing new objects into being in [[Eiffel Classes|Eiffel Classes]] . A creation instruction starts with the keyword "create". It creates a new object, initialize its fields, may apply a creation procedure, and attaches the object to an entity.
+
+===Procedure Call===
+
+ hd_item.set_text (a_label)
+
+
+The application of a feature to an object constitutes an instruction if the feature is a procedure.
+
+===Assignment===
+
+In Eiffel, assignment syntax is simple. But depending upon the types involved, what actually happens may need some explanation. Assume here that is_open_read is an attribute declared as type BOOLEAN:
+
+ is_open_read := False
+
+
+In this instruction, an attribute of type BOOLEAN named is_open_read is being assigned the value of the manifest boolean "False". The attribute is_open_read is based on an expanded class BOOLEAN, so that means that the value for False is held in the field for is_open_read. This is in contrast to what happens with reference types.
+
+ my_string := some_other_string
+
+
+In this assignment, we will assume that both entities are type STRING. Because STRING is a reference type, the field for my_string will hold either a reference to an instance of STRING, or it will be Void. When the assignment above executes, then whatever was in the field for my_string is replaced with a reference to the same object that some_other_string refers to.
+
+In summary, for objects based on expanded classes, assignment means assignment of value. For objects based on reference classes, assignment means assignment of reference.
+
+====Conformance====
+
+There is an important rule about assignment in Eiffel. The rule exists to ensure type safety. Consider the following assignment which we would read as "x receives y" or "x gets y".
+
+ x := y
+
+
+then the rule says that this assignment is valid only if the type of y conforms to the type of x.
+
+The rule is clear enough ... if you know what "conform" means. In the presence of mechanisms like expanded types, inheritance, and genericity, a precise definition of conformance is lengthy.
+
+But we can get by for a while with much less. For now let us be satisfied with this:
+
+Consider the classes in the declarations for x and y.
+
+You might be tempted to say that to achieve "conformance", the classes would have to be the same. And for the case in which the declarations for x and y are expanded classes, you'd be correct. They conform only if they are the same class.
+
+But for reference types, that constraint is unnecessarily restrictive. So, for reference types, the class of y conforms to that x if it is the same class or a proper descendant of that class. This facilitates a powerful idea known as polymorphic attachment that we will see more closely in the section on [[Inheritance|Inheritance]] .
+
+===Conditional===
+
+ if l_c.is_digit then
+ l_state := 2
+ elseif l_c = '-' or l_c = '+' then
+ l_state := 1
+ else
+ l_state := 3
+ end
+
+
+Conditionals in Eiffel use at a minimum the keywords "if", "then", and "end". Optionally, they may use the keywords "elseif" and "else".
+
+===Loop===
+
+ from
+ i := lower
+ until
+ i > upper
+ loop
+ if item (i) /= Void and then v.is_equal (item (i)) then
+ Result := Result + 1
+ end
+ i := i + 1
+ end
+
+
+There is only one structure for loops in Eiffel. In its typical form it uses the four keywords "from", "until", "loop", and "end". The instructions following the from keyword do any initialization necessary for the loop. After until is a boolean expression which is the exit condition. The loop body after loop is a list of instructions that are executed for every iteration. As you can imagine, something in the loop body should most likely cause the exit condition eventually to become true.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/design-contract-and-assertions.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/design-contract-and-assertions.wiki
new file mode 100644
index 00000000..84d0a195
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/design-contract-and-assertions.wiki
@@ -0,0 +1,322 @@
+[[Property:title|Design by Contract and Assertions]]
+[[Property:weight|5]]
+[[Property:uuid|41172f82-227a-96b1-2dad-624f04374ee0]]
+==Motivation: Concerning Correctness==
+
+When you produce an element of software, how do you know that what you produced is correct?
+
+This is a difficult question for anyone to answer. Informally speaking, correct software is software that does what it is supposed to do. That is what makes answering the question so tricky. Before you can have any idea whether the software is correct, you must be able to express what it is supposed to do ... and that proves to be quite difficult itself.
+
+In conventional software engineering, a document called a software specification is written in order to describe what it is that a piece of software is supposed to do. Writers of software specifications tend to pursue one of two approaches: the informal or the formal.
+
+Informal specifications attempt to describe software behavior in the natural languages with which humans communicate on a daily basis. There are problems with this approach. Natural language is not precise. Informal specifications are subject to interpretation and affected by the ambiguities, noise, and contradiction inherent in natural language.
+
+In order to avoid these problems, proponents of formal methods of specification turn to the most precise language they know: mathematics. It may be no exaggeration that the study of formal methods has produced more PhD's in Computer Science than it has well-specified software systems. Still the idea that the precision of mathematics can be brought to bear on the problem of specifying software is quite appealing. But, problems lurk here as well. Formal specifications are difficult and time-consuming to construct and verify against themselves, and most software engineers do not have a working knowledge of the mathematics required to work with formal specifications.
+
+There is one more significant problem with both of these approaches. Even if you have a very precise specification, expressed in elegant text and graphics, and placed carefully in an expensive ring binder, how do you know that the software product actually reflects that specification and vice versa? If either is changed, the other must be as well. This is the document synchronization problem.
+
+===Design by Contract to the Rescue===
+
+Design by Contract (DbC) begins as an implementation of some of the ideas from formal methods and matures into a powerful way of thinking about software. And it does it in a way that is easy for programmers and managers to understand. DbC also puts the software specification into the software document itself which makes it checkable at runtime and eliminates the document synchronization problem.
+
+==Model for Software Correctness==
+
+Design by Contract is built around a model for software correctness that is really pretty simple.
+
+Suppose there is software routine called s. If we were going to test s, we would probably devise some test inputs or test values to be in place when s starts and then observe what things look like after s completes. If they look the way we think they should then that leads us to believe that S is working correctly for those test inputs.
+
+We can generalize and formalize that process a bit, taking it back from testing an into design. If indeed we know what it means for s to be correct, then we should be able to make a statement of any conditions that must be true prior to executing s. That is, we will state the conditions required for it to be possible for s to run correctly. We call this statement of preconditions for success s's precondition.
+
+Likewise we should be able to make a statement of the conditions that will be true always if s works correctly. This we call s's postcondition.
+
+As an example, suppose s accepted an argument of type REAL and returned another REAL which was the square root of the argument. The precondition for s would be that the argument could not be less that zero, as there is no real square root for negative numbers. s's postcondition would be that the result multiplied by itself would yield the value of the original argument (give or take a little to allow for floating point error).
+
+==Assertions in Eiffel==
+
+Each Eiffel feature which is a routine, i.e. a function or procedure, can support one assertion for a precondition and one for a postcondition. We saw where precondition and postcondition fit into the structure of the routine in [[Adding Class Features|Adding Class Features]] . An assertion is expressed as one or more assertion clauses which are logically and-ed together to produce the assertion. Assertions clauses are boolean expressions that evaluate to true or false.
+
+Let's look at another example. Assume you need to produce a class to model a time of day. Each instance of TIME_OF_DAY would hold some particular time of day accurate to the second between 00:00:00 and 23:59:59 inclusive.
+
+As a producer, you would be faced with a decision concerning how to maintain the time internally in each instance. For the purpose of our example, let us consider two alternatives:
+# Keep three instance of INTEGER. One each for hour, minute, and second.
+# Keep one instance of INTEGER representing the time of day as the number of seconds since 00:00:00.
+
+This would be an implementation issue for the producer, because it would not affect the services that TIME_OF_DAY could offer clients. If we have a query called minute the first alternative allows us simply to provide the value from storage. Whereas the second alternative will likely cause us to compute minute each time it is requested. But the service looks and works the same for the client in either alternative.
+
+For now let us assume that we are using the first design alternative. In that case we would code class features for hour, minute, and second.
+
+feature -- Access
+
+ hour: INTEGER
+ -- Hour expressed as 24-hour value
+
+ minute: INTEGER
+ -- Minutes past the hour
+
+ second: INTEGER
+ -- Seconds past the minute
+
+
+Below is the code for a procedure set_second which receives an argument of type INTEGER and sets the value of the second feature to the argurment.
+
+ set_second (s: INTEGER)
+ -- Set the second from `s'.
+ do
+ second := s
+ end
+
+
+The routine is simple enough, but there is a problem with it. Suppose a client calls set_second with an argument whose value is invalid, say 3574. Our routine would just stuff this value into second and we would end up with an instance of TIME_OF_DAY which is invalid. In the days before Design by Contract, as soon as we recognized that this problem exists, we would go into "defensive programming" mode and code some "if" statements inside the routine to validate the argument, before acting.
+
+Consider though what we can do with Design by Contract. We will add a precondition assertion to set_second that expresses the need for valid arguments.
+
+ set_second (s: INTEGER)
+ -- Set the second from `s'.
+ require
+ valid_argument_for_second: 0 <= s and s <= 59
+ do
+ second := s
+ end
+
+
+The precondition is introduced by the keyword "require". The text "valid_argument_for_second" is the label for the assertion clause. The boolean expression "0 <= s and s <= 59" says that a good value for s will be between 0 and 59 inclusive.
+
+Remember that the precondition specifies those things that must be true if set_second has a chance of working correctly. As such, upon execution, the body of this routine will never be executed if an attempt is made to call it in a state that does not meet its precondition. Instead, the caller will incur a precondition violation exception. We will investigate more about what exceptions mean further in [[Exception Mechanism|Exception Mechanism]] .
+
+So, what about a postcondition? We noted earlier that a postcondition should make a statement of what will be true in the case that the routine does its work correctly. For set_second this means that after it finishes, the query second should have the same value as the argument that was received from the caller. Below is the feature with the postcondition added.
+
+ set_second (s: INTEGER)
+ -- Set the second from `s'.
+ require
+ valid_argument_for_second: 0 <= s and s <= 59
+ do
+ second := s
+ ensure
+ second_set: second = s
+ end
+
+
+The postcondition is introduced by the keyword "ensure". Here the expression "second = s" makes certain that the routine did actually do the necessary work to ensure that the value of second matches the value of the argument received.
+
+As you look at the postcondition, you may be tempted to think that the one-line body of the routine is so simple as to make the postconditon unnecessary. To answer this concern we need to look again for a moment at software specification.
+
+===Specification of a Routine===
+
+If we remove the instructions from a routine and leave its signature, header comment and assertions, we have a specification for the routine.
+
+ set_second (s: INTEGER)
+ -- Set the second from `s'.
+ require
+ valid_argument_for_second: 0 <= s and s <= 59
+ ensure
+ second_set: second = s
+ end
+
+
+This specification of set_second tells us what is required of reuse consumers if they wish to use set_second and what set_second promises to do for them. Importantly, it does that without revealing how it does it does what it does.
+
+So, this specification view, officially called the contract view, is how consumers of class TIME_OF_DAY would view the feature.
+
+If this is the specification, then haven't we put the cart before the horse? The answer is yes. We have done so to illustrate the problems that assertion-based specification can help solve.
+
+Instead of starting with a routine and adding a specification, we really want to start in accepted software engineering fashion with specification first, and then add implementation. Therefore, the specification you see above would exist before the implementation.
+
+Now back to the concern over whether the postcondition is redundant for this simple one-line routine. Obviously, if this specification exists first, then the postcondition must be there, and it would be silly to remove it later. But, more importantly, suppose that when the producer of the class decided on an implementation, he or she chose the second design alternative we mentioned above. This would mean that the internal state of an instance of TIME_OF_DAY would be only one INTEGER with the number of seconds since midnight. That would mean that the query second would probably be a function that computed seconds from that one INTEGER instead of an attribute.
+
+What would change in the specification of set_second? Nothing. The implementation for the routine would be more complex, but what it does, setting the second in an instance of TIME_OF_DAY, would stay the same.
+
+In summary, the precondition and postcondition ensure for use that the routine will only execute if called in a state in which the precondition is true, and then will either complete in a state in which the postcondition is true, or cause a postcondition violation exception.
+
+===The Contract for a Routine===
+
+Having assertions on its routines forms a contract between the TIME_OF_DAY class and all potential reuse consumers. The contract is much like a contract in business, with obligations and benefits for both parties.
+* The client's benefits are outlined in the postcondition.
+* The client's obligations come from the precondition.
+* The supplier's obligations are in the postcondition.
+* The supplier's benefits come from the precondition.
+
+We can see the specifics of these by using set_second as an example.
+* The client gets the desired value for seconds set in the instance.
+* The client must provide an argument that is valid for seconds.
+* The supplier must update the instance successfully.
+* The supplier need not risk disaster attempting to process in an invalid state nor waste time validating the argument received from the client.
+
+===Valid State for Instances===
+
+Assertions on TIME_OF_DAY's routines gives us specification for each routine and guarantees that if the specification of a routine gets violated at runtime we will be served immediately with an exception. This will go a long way toward preventing invalid instances from going unnoticed in a running system and fouling up lots of other stuff.
+
+What will help even more is something called a class invariant. Using the class invariant we are able to state what it means for an instance of a class to be valid, or as it is sometimes put, in a stable state.
+
+The class invariant is an assertion like precondition and postcondition, but there is only one per class. Check [[Eiffel Classes|Eiffel Classes]] to see how the class invariant fits into the class structure.
+
+How would we code the class invariant for TIME_OF_DAY? An instance would be valid if its hour were between 0 and 23 inclusive, minute were between 0 and 59 inclusive, and its second were between 0 and 59 inclusive. We can code the invariant as shown below.
+
+invariant
+ hour_valid: 0 <= hour and hour <= 23
+ minute_valid: 0 <= minute and minute <= 59
+ second_valid: 0 <= second and second <= 59
+
+
+The name invariant implies that the assertion can never be false ... and that's true up to a point. It's really more like, "it must be true at times when it really counts".
+
+At runtime the invariant must be true for an instance at anytime that the instance is available to clients. In general, this means that the invariant must be true before and after the execution of every exported routine.
+
+As with the assertions on routines, if ever the invariant is not true when it should be, then a class invariant violation occurs.
+
+Remember in the example above, that the features hour, minute, and second are queries, but they could be either attributes or functions.
+
+==The Contract for a Class==
+
+Earlier we saw the contract for a routine. Now we can define the contract for a class as the aggregation of the contracts for all its exported features, plus its class invariant.
+
+In Design by Contract we design based on these contracts. They are the specifications for the modules in our system. We work in a reuse-oriented world. Whenever we produce a class, we produce it with a comprehensive contract which serves as its specification. We build each class with the thought that it may eventually become reusable.
+
+When we are in our reuse consumer role, using existing classes, we tend not to look at the implementations for the classes we use. Instead we look at their contract views. It is there that we find the obligations and benefits of using each class.
+
+==Contracts and Debugging==
+
+We saw earlier that having contracts in the code tends to expose bugs at an early stage of development. It is possible selectively to turn off and on the runtime checking of assertions by changing project settings. Checking assertions does involve processing. More about turn off assertion checking in a moment.
+
+Having contracts on a class gives another advantage when the contract gets broken. The contract tells us whose fault it is. Whenever there is a violation of a precondition, postcondition, or class invariant then the software is out of specification. This situation is called a defect, or bug.
+
+Whose fault is it? If a precondition was violated, then a client class attempted to call a routine in a supplier, but made the call in a state that did not satisfy the supplier's precondition. Therefore the bug is in the client.
+
+If a postcondition was violated, then a client made a call in a state that did satisfy the supplier's precondition, but the supplier was unable to complete the work as agreed. Therefore the fault lies with the supplier.
+
+If a class invariant was violated, then the instance has been placed in an invalid state during the execution of a routine, and left that way when the processing completed. This caused the invariant violation. As with the postcondition violation, because the problem occurred while executing routines in the supplier, preconditions must have been met. The supplier then is to blame.
+
+Based on this knowledge, we can say that it is most practical first to turn off runtime checking of postconditions and invariants as we gain confidence in a class. Meaning of course, that we feel confident that any calls that meet preconditions will be properly processed. Then our only worry is that some deranged client will, with total disregard for our carefully crafted preconditions, make calls to our routines from invalid states. So, maybe we will leave precondition checking turned on for a while.
+
+==Contracts and Inheritance==
+
+In the section titled [[Inheritance|Inheritance]] you saw that it was possible through inheritance to produce a new class that has all the features of an existing one. This is a very powerful notion, and could be dangerous. What would keep descendants from redefining inherited features with semantics that were totally different from those intended by the producer of the original class? Nothing if it were not for the contract.
+
+Simply speaking assertions on a parent class, preconditions, postconditions, and class invariants, all are inherited by the class's proper descendants.
+
+For class invariants, if any new invariants are coded in an heir, they will be added to those inherited from the parent, using a non-strict version of logical "and" (We will define non-strict booleans in Writing Assertions below).
+
+That is simple enough. And the situation is also simple for effective routines inherited and left unchanged ... the contracts stand as written.
+
+From our example above you may have gotten the idea that contracts are really useful only for effective routines. Such is not the case. In fact, specifying a contract on a deferred routine is really a powerful notion. It says not only that effective descendants must provide an implementation for this routine, but also that there is a contract that must be satisfied. Effecting or redefining a routine in a descendant class will not make the contract go away. Here is an feature from the Base Library deferred class ACTIVE which models data structures with a current item, and is an ancestor to many effective container type classes.
+
+feature -- Element change
+
+ replace (v: G)
+ -- Replace current item by `v'.
+ require
+ writable: writable
+ deferred
+ ensure
+ item_replaced: item = v
+ end
+
+
+Feature replace carries the semantics necessary for replacing an item in an ACTIVE. It does not, however provide an implementation. All implementers must produce versions of replace that satisfy the contract specified here.
+
+It actually is possible to alter a feature assertion in an effected or redefined version(technically its a replacement of the original version):
+* The precondition can only become weaker than in the inherited contract.
+* The postcondition can only become stronger than in the inherited contract.
+
+These rules are imposed as a consequence of the effect of effected or redefined routines on polymorphism and dynamic binding. But, you can understand them from an intuitive viewpoint, if you reconsider the business contract analogy. Suppose a contractor makes a deal with a client to do certain work (represented by the postcondition). Part of the deal might be that the client agrees to have a site ready by a certain date (represented by the precondition). The contractor represents the parent class in the analogy. Now suppose the contractor brings in a subcontractor (representing the heir class) to do a portion of the work. The subcontractor cannot force the client to change the date that the site is to be ready to an earlier date (no strengthing of the precondition). The deal with the client was made by the contractor and so no new or stronger requirements can be imposed by the subcontractor. Likewise the subcontractor must provide at least as much work as was bargained for by the contractor, but may promise to provide more if appropriate (strengthing of postcondition is allowed.)
+
+In Writing Assertions below you will see the syntax for weaking preconditions and strengthening postconditions.
+
+==Unfinished Business==
+
+In the section [[Adding Class Features|Adding Class Features]] , we promised to explain two issues during this discussion of Design by Contract.
+
+===Short Routines===
+
+One of these is the tendency of mature Eiffel programmers to write routines that are quite short. It should be clear by now that we wish to build a contract on each routine. The contract describes the semantics of the routine in a declarative fashion. In other words, it tells what the routine does, without giving an indication of how it does it.
+
+Try to imagine giving a declarative description of a routine that was 50 lines long. This could get ugly. So experienced Eiffel developers decompose complex computations into chunks small enough to be described through a clear, concise set of assertions.
+
+===Command/Query Separation===
+
+In [[Adding Class Features|Adding Class Features]] , we saw that we can categorize features as either queries or commands. A query will ask a question or make an observation about an instance. A command will tell the instance to take some action which may result in changing the instances internal state.
+
+We said that when program routines, that those routines should either be commands or queries but not both. Importantly, asking a question about an instance should not change the instance. Likewise, taking an action that changes the state of an instance should not return a result.
+
+Here's the rationale. In a routines postcondition we use boolean expressions to ensure that the routine has done its job properly. Likewise, class invariants, which define the valid state for instances, are written as boolean expressions. In both cases we may use the features of the class which are queries to ask about an instances current state.
+
+If a query that we use in an assertion were to change the state of the instance, then the result we received would be invalid as soon as we received it.
+
+Therein lies the primary reasoning behind command/query separation. You cannot reason about the integrity of an object if the act of asking a question changes the object.
+
+==Writing Assertions==
+
+You have seen fairly typical assertions written in the examples above. Study the classes in the libraries to see some excellent working examples. There are a couple of things that need to be covered.
+
+===Non-Strict Booleans===
+
+One is that, as you can probably imagine, it is not a good thing to cause an exception during the process of checking an assertion. One of the most common ways to cause such an exception is to apply a feature to a Void reference.
+
+The way to avoid this is to use the non-strict booleans "and then" and "or else". These forms of "and" and "or" do not force the checking of all conditions. As soon as a determination can be made, they stop checking. It is typical to see "and then" used to avoid applying a feature to a void reference in preconditons. Below is a creation procedure that uses a non-strict boolean in its precondition.
+
+ make (a_nm: STRING; a_offset: INTEGER)
+ -- Initalize with name `a_nm' and utcoffset `a_offset'.
+ require
+ name_not_empty: a_nm /= Void and then not a_nm.is_empty
+ offset_valid: a_offset >= -12 and a_offset <= 12
+ do
+ name := a_nm.twin
+ utcoffset := a_offset
+ ensure
+ name_initialized: name.is_equal (a_nm)
+ utcoffset_initialized: utcoffset = a_offset
+ end
+
+
+===Replacing Inherited Feature Assertions===
+
+To replace a precondition on a feature you are effecting or redefining, you use the "require else" keywords to introduce new conditions. These conditions will be logically "or-ed" with the original precondition to form an new one.
+
+Likewise use "and then" to add conditions to a postcondition. The added conditions will be "and-ed" to the original.
+
+Below is an example of weakening a precondition. The first feature shown is from class DYNAMIC_CHAIN in the Base Library.
+
+ remove_left
+ -- Remove item to the left of cursor position.
+ -- Do not move cursor.
+ require
+ left_exists: index > 1
+ deferred
+ ensure
+ new_count: count = old count - 1
+ new_index: index = old index - 1
+ end
+
+
+The next feature is from DYNAMIC_LIST, a proper descendant of DYNAMIC_CHAIN. DYNAMIC_LIST weakens the precondition it inherited from DYNAMIC_CHAIN. Originally in DYNAMIC_CHAIN, "index > 1" was required for remove_left. In DYNAMIC_LIST either "index > 1" or "not before" (or both) will suffice.
+
+ remove_left
+ -- Remove item to the left of cursor position.
+ -- Do not move cursor.
+ require else
+ not_before: not before
+ deferred
+ end
+
+
+==Not Writing Assertions==
+
+Let's close this discussion of Design by Contract with one more interesting and point to make about assertions. The precondition and postcondition parts of a routine are optional, as you may remember from [[Adding Class Features| Adding Class Features]] . Suppose you write a routine and do not code either precondition or postcondition. You might be tempted to think that you have simply written a routine that has no contract. But, that would not be the case.
+
+The contract exists, even though you do not code it explicitly. If it were written out, it would look as follows.
+
+ my_routine
+ -- My descriptive header comment
+ require
+ True
+ ensure
+ True
+ end
+
+
+What does this mean? It means that you have selected the weakest possible precondition and postcondition for your routine. Of course, this may be perfectly valid under some circumstances.
+
+Just understand that if your routine could speak, it would be telling you, "I can always work successfully without any particular guarantees from you at all. On the other hand, I won't promise you any particular results when I get done."
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/eiffel-classes.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/eiffel-classes.wiki
new file mode 100644
index 00000000..37db14d5
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/eiffel-classes.wiki
@@ -0,0 +1,223 @@
+[[Property:title|Eiffel Classes]]
+[[Property:weight|1]]
+[[Property:uuid|f905426e-3109-b60b-adf0-c74b83c81b55]]
+The unit of software reuse in Eiffel is the class.
+
+The unit of modularity in Eiffel is the class.
+
+The unit of type modeling in Eiffel is the class.
+
+All Eiffel code must exist within the context of a class.
+
+In Eiffel, application systems, or simply systems, are created by assembling a set of related classes. The classes in a system will be related only by one or both of the two allowable relationships in object-oriented design.
+
+Having read the above, you should be convinced that the concept of class is important and far-reaching. The fact that we have precise rules about classes simplifies life a lot. The only kind of module in Eiffel is a class. Each class exists in one source file (which contains only that class), and contains the code necessary to provide a static definition of a data type. Every runtime entity, i.e. every object, must be an instance of a class. Because we can depend upon these things in Eiffel, we have consistency and predictabililty in the inherently complex world of software development.
+
+Let's take a look at how classes are structured.
+
+The code that makes up an Eiffel class is divided into the following parts:
+
+==Structure of a Class==
+
+All of the above, except Class header, are optional. So the simplest Eiffel class you could build would look like this:
+
+class
+ SIMPLE
+end
+
+
+Okay, so class SIMPLE is only interesting in its simplicity. Let's look at an example that is more illustrative:
+
+note
+ description: Objects that model lists
+ revision: $Revision: 1.4 $
+
+class
+ OLD_FASHIONED_LIST [G]
+
+obsolete "This class is obsolete, use LINKED_LIST [G] instead"
+
+inherit
+ DYNAMIC_LIST [G]
+
+create
+ make
+
+feature -- Initialization
+
+ make
+ -- Create an empty list.
+ do
+ before := True
+ ensure
+ is_before: before
+ end
+
+feature -- Access
+
+ item: G
+ -- Current item
+ do
+ Result := active.item
+ end
+
+ first: like item
+ -- Item at first position
+ do
+ Result := first_element.item
+ end
+
+ ... other features omitted ...
+
+invariant
+ before_constraint: before implies (active = first_element)
+ after_constraint: after implies (active = last_element)
+
+Here is a class that, although completely contrived, utilizes all of the required and optional parts of the class. Let's look at each part individually.
+===Note===
+
+note
+ description: Objects that model lists
+ revision: $Revision: 1.4 $
+
+
+The note part of a class is there to allow you as a producer to record information of your choice which will help you or other reuse consumers at some later time to locate understand the class. This important in Eiffel because we try to treat every class as if someday it will become reusable.
+
+Information in note does not change the semantics of the class.
+
+The note part in the class above is typical. It is introduced with the language keyword note, and contains two note clauses, each of which is comprised of an index and a single index value. You can code note clauses with indexes that you devise yourself, so there is nothing inherently special about "description" and "revision" as used above. But, these indexes could be special to tools which analyze libraries of classes use them. Although these clauses have only one index value each, it is permissible to put more, separated by commas.
+
+===Class Header===
+
+class
+ OLD_FASHIONED_LIST [G]
+
+
+The class header is introduced by the keyword "class", which in turn can be preceded by one of three keywords which mark the class as deferred, expanded, or frozen. In our example, the class has none of these markings, so it is an effective class whose instances are access by reference.
+
+The keyword class is followed by the class name, in this case "OLD_FASHIONED_LIST".
+
+Of the three keywords for header marks, the one which you will encounter most often is deferred. A class is deferred if it contains one or more features that are deferred, that is, features which have been specified in the class but for which no implementation has been provided. Proper descendants of a deferred class will provide implementations for its deferred features.
+
+===Formal Generics===
+
+class
+ OLD_FASHIONED_LIST [G]
+
+
+In this example the class name is followed by the specification of one formal generic parameter "G". The presence of one or more formal generic parameters will designate a class as a generic class. The formal generic parameter is a place holder for a class name which will be provided by reuse consumers. For example if we wrote a class which was a client to OLD_FASHIONED_LIST we would substitute the class name for the type of objects that we would want to build an OLD_FASHIONED_LIST of. We might make this declaration:
+
+ my_list_of_cats: OLD_FASHION_LIST [CAT]
+
+
+The entity my_list_of_cats could then be attached at runtime to an OLD_FASHIONED_LIST of objects of type CAT. So the class CAT becomes an actual generic parameter and substitutes for G in the declaration.
+
+Of course formal generic parameters cannot be the same name as a class name in the same universe. If multiple formal generic parameters are used, they are separated by commas.
+
+You will learn more about generic classes in the section titled [[Genericity|Genericity]] .
+
+===Obsolete===
+
+obsolete "This class is obsolete, use LINKED_LIST [G] instead"
+
+
+OLD_FASHION_LISTs are obsolete ... and the class is marked as such by include the line above. The manifest string contains an explanation, instructions, and/or recommended alternatives. Compilers and other language tools can deliver this message to potential reuse consumers. As with note, obsolete has no effect on the semantics of the class.
+
+Obsolete is rarely used because of the nature of certain elements of the Eiffel methodology. For example, if implementations are well-hidden behind implementation-independent specifications, then those implementations may be changed to adapt the class to changing execution environments in such a way that clients are unaffected.
+
+===Inheritance===
+
+inherit
+ DYNAMIC_LIST [G]
+
+
+One of the two possible relationships between classes, inheritance is also a powerful software reuse mechanism. In this example class OLD_FASHIONED_LIST declares itself to be a proper descendant of class DYNAMIC_LIST.
+
+There will be more in the section called . For now though, be aware of two important implications of this declaration:
+* Every feature of DYNAMIC_LIST is available to OLD_FASHIONED_LIST and potentially available to its clients.
+* Whenever an instance of DYNAMIC_LIST is called for, then an instance of OLD_FASHIONED_LIST will suffice.
+
+===Creators===
+
+create
+ make
+
+
+The creators part of a class declares a procedure as being a creation procedure. In this case the procedure in question is the one named make. By convention, creation procedure names begin with the word " make".
+
+Let's take a quick look at object creation. Consider this declaration:
+
+ my_list_of_cats: OLD_FASHION_LIST [CAT]
+
+
+Here the entity my_list_of_cats can be attached to an object of type OLD_FASHION_LIST [CAT] at runtime. The process of converting my_list_of_cats from holding a void reference to holding a reference to a object modeling a list of cats, starts when a creation instruction is executed. The creation instruction creates the instance and may apply a creation procedure to initialize the instance. A creation instruction for the declaration above would look like this:
+
+ create my_list_of_cats.make
+
+
+The create keyword is used to introduce a creation instruction. This instruction causes the following four things to happen:
+* A shell of a new instance of OLD_FASHION_LIST [CAT] is created in memory with a memory field for every attribute
+* Each field is initialized with standard default values
+** False for type BOOLEAN
+** Null character for type CHARACTER
+** The appropriate form of zero for number types
+** Void for reference types
+
+* Attach the new instance to the entity my_list_of_cats
+* Apply the creation procedure make
+
+Once these steps complete successfully, my_list_of_cats will be attached to a valid instance (i.e., an instance in which the class invariant is true) of OLD_FASHIONED_LIST [CAT].
+
+===Features===
+
+feature -- Initialization
+
+ make
+ -- Create an empty list.
+ do
+ before := True
+ ensure
+ is_before: before
+ end
+
+feature -- Access
+
+ item: G
+ -- Current item
+ do
+ Result := active.item
+ end
+
+ first: like item
+ -- Item at first position
+ do
+ Result := first_element.item
+ end
+
+
+The features part of a class is the area in which we feel that most of the "programming" is done. It is here that we define those things that instances of a class have and can do. We will learn more about features in the next section [[Adding Class Features|Adding Class Features]] .
+
+Until then let's just take a quick look at how features fit into a class. Notice that in our example the features part is introduced by the keyword "feature". In fact there are two occurrences of feature in this example, each followed by a comment.
+
+You may declare multiple feature statements. This helps you group features in a manner that makes sense. Here we see the first group contains those features which are listed as creation procedures in the creators part of the class. The second group of features labeled "Access" contains a set of queries available to clients of the class.
+
+Although the words "Initialization" and "Access" are actually in comments after the feature keyword, some language processing tools apply some significance to these, for example, ordering the groups in "pretty-printed" views of a class. Also, some tools allow you to build templates for creating new classes which have feature clauses already in place for predetermined groups.
+
+{{tip|There is not a technical requirement governing the grouping or ordering of features in a class. It is the option of the producer of a class to group and order the features in a fashion that holds some meaning. Many years of Eiffel development experience are reflected in the classes in the EiffelBase Library. This is a good place to look for examples of well constructed classes. }}
+
+
+===Invariant===
+
+invariant
+ before_constraint: before implies (active = first_element)
+ after_constraint: after implies (active = last_element)
+
+
+
+Here's the last word in a class definition ... both literally and figuratively. The invariant part, introduced not surprisingly by the keyword "invariant", is that portion of the class in which we can state what it means for an object to be a valid instance of this class.
+
+We will learn more about class invariants in the section titled [[Design by Contract and Assertions|Design by Contract and Assertions]] .
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/eiffel-net-compliance.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/eiffel-net-compliance.wiki
new file mode 100644
index 00000000..5f283bcc
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/eiffel-net-compliance.wiki
@@ -0,0 +1,26 @@
+[[Property:title|Eiffel for .NET Compliance]]
+[[Property:weight|9]]
+[[Property:uuid|1e19c2f0-995e-02c1-0588-c134a11e0003]]
+As of Eiffel for ASP.NET 5.6 and EiffelStudio 5.7; Eiffel for .NET introduces the notion of '''Eiffel-Compliance'''. .NET specifies a number of language interoperability rules in a [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconwhatiscommonlanguagespecification.asp Common Language Specification-Compliance] specification. Eiffel for .NET supports all CLS-Compliant type and features in .NET but now additionally supports a number of non-CLS-compliant types and features. This is the purpose of the Eiffel-Compliant notion.
+
+The information contained within this page does not go into any depth on the Common Language Specification (CLS) or CLS-Compliance. For this information please see Microsoft's on-line documentation [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconwhatiscommonlanguagespecification.asp What is the Common Language Specification?]
+
+
+==Applicability==
+
+The CLS states a number of rules .NET tools have to abide by to be CLS-compliant. These rules relate to both a .NET producer, generally a compiler generating .NET code, and a consumer, which is generally a compiler that consumes .NET assemblies for reuse. Eiffel-Compliance relates only to consumption of .NET assemblies.
+
+==What is Eiffel-Compliant?==
+
+As already stated, anything CLS-compliant is Eiffel-compliant. Eiffel-Compliancy merely allows for exceptions so that non-CLS-compliant assemblies, types and members can be used in Eiffel for .NET.
+
+The following list outlines the supported non-CLS-compliant types:
+* All unsigned numerical basic types such as do_all takes an agent which represents some procedure and will apply the procedure to every item in the structure.
+
+==Classes to Model Operations==
+
+We know that there are two types of routines in Eiffel, functions and procedures.
+
+The implementation of agents correspondingly relies on three classes in the Base Library: class ROUTINE for the general notion, and its heirs FUNCTION, with and PROCEDURE. In addition, PREDICATE, an heir of FUNCTION , covers the particular case of a function returning a boolean result.
+
+When you use an agent from a client routine, you will be building an instance of either FUNCTION or ROUTINE.
+
+==Using Agents==
+
+Below is an instruction which passes an agent as an argument to a procedure.
+
+ button.select_actions.extend (agent gauge.step_forward)
+
+
+In this example, the producer wants to add the action of stepping the gauge forward in the event that a button is clicked. The keyword "agent" is used to indicate that at runtime an object of type PROCEDURE should be created which represents applying the feature step_forward to the object attached to gauge. It is the object of type PROCEDURE that is passed as the argument.
+
+It is important to understand that step_forward does not get applied at the point that the instruction above is executed. Rather the procedure object that represents step_forward is given to the button to hold in reserve. Then at the point that the button click event takes place, the button will go through its list of select_actions executing their associated routines. Only then does step_forwardget applied to gauge.
+
+===Agents with Arguments===
+
+In this example, the routine "step_forward" on which the agent is based takes no arguments. If you drilled down into the workings of this example you would find that class that implements the feature extend is class EV_NOTIFY_ACTION_SEQUENCE. You would also see that the signature for the feature extend is as essentially as follows.
+
+ extend (v: PROCEDURE [TUPLE])
+
+
+We don't have to know too much about the workings of agents to see that "extend" takes an argument v which is of type PROCEDURE. The actual generic parameter TUPLE represents the set of "open" arguments. In this case, extend is expecting an agent with no open arguments.
+
+===Open and Closed Arguments===
+
+It is this business of open and closed arguments which really makes agents remarkable. To get a feel for it, let's simplify the example some. Instead of considering an agent passed as an argument let's look at it as a simple assignment within a class.
+
+Suppose a class has a feature declared as shown below.
+
+ my_procedure: PROCEDURE [TUPLE]
+
+
+Then what can be assigned to my_procedure?. An agent, of course. Say the class has procedures as follows.
+
+ no_argument_procedure
+ -- A procedure with no arguments
+ do
+ print ("No argument here!%N")
+ end
+
+ two_argument_procedure (an_int: INTEGER; another_int: INTEGER)
+ -- A procedure with two arguments
+ do
+ print ("My arguments are: " + an_int.out + " and " + another_int.out + "%N")
+ end
+
+
+Then the following assignment is valid.
+
+ my_procedure := agent no_argument_procedure
+
+
+What this means is that the agent created and associated with the procedure no_argument_procedure must conform to the type PROCEDURE [TUPLE]. The feature my_procedure (which is of type PROCEDURE [TUPLE]) can be attached at runtime to an agent representing a procedure with no open arguments, which indeed is what no_argument_procedure is.
+
+Now let's turn our attention to the other procedure two_argument_procedure. You might think that because it takes two arguments, that you would not be able to build an agent from it which could be assigned to the attribute my_procedure. But you can do it by closing the two arguments at the time that the agent is created, as in the following.
+
+ my_procedure := agent two_argument_procedure (1, 2) -- Is Valid
+
+
+What happens here is that values are fixed for those arguments at the time that the agent, an object of type PROCEDURE [ TUPLE] is created.
+
+So this is the wonderful thing about agents. A routine which will be represented as an agent does not have to be an exact fit for the expected signature. By closing some arguments at agent creation, you have effectively produced a new and conforming routine.
+
+The advantage of this is that you can sometimes avoid building specialized routines for the sole purpose of having a routine which conforms to the agent signature.
+
+To leave an argument open, you hold its place with a question mark. If you intend for all arguments to be open, then you may make them all question marks, or leave off the arguments entirely.
+
+ my_procedure := agent two_argument_procedure (?, 2) -- Argument 1 left open
+ my_procedure := agent two_argument_procedure (?, ?) -- Both arguments left open
+ my_procedure := agent two_argument_procedure -- Both arguments left open
+
+
+If an argument is open, then it means that a value is not provided for that argument at the time that the agent is created. The implication is that the value must be provided at some time prior to the time that the agent's associated routine gets executed. A precondition to executing a routine associated with an agent is that the agent has a valid set of arguments (called operands within the ROUTINE classes) for the call. If you were to leave one or both of the arguments to two_argument_procedure open as in the examples above, the assignment would still work due to the rules governing TUPLE conformance. But, at runtime unless the other arguments had been provided, the "valid operands" precondition would be violated.
+
+Let's see an example in which we leave a target open. Suppose we have a class that has a feature coded as below
+
+ my_strings: LINKED_LIST [STRING]
+
+
+and some code to put some strings in my_strings:
+
+ create my_things.make
+ my_strings.extend ("Hello")
+ my_strings.extend ("World!")
+
+
+Our class also has a feature called print_on_new_line which we created to print a string preceded by a new line character.
+
+ print_on_new_line (s: STRING)
+ -- Print `s' preceded by a new line
+ do
+ print ("%N" + s)
+ end
+
+
+Now suppose we want to print the values of all the strings in my_strings each on a separate line by invoking print_on_new_line. Traditionally, we would do it by traversing the LINKED_LIST and printing each item. Like this:
+
+ from
+ my_list.start
+ until
+ my_list.exhausted
+ loop
+ print_on_new_line (my_list.item)
+ my_list.forth
+ end
+
+
+The availability of agents gives us new options. LINKED_LIST has a feature do_all which comes to it from its ancestor LINEAR. The do_all feature's signature looks like this:
+
+ do_all (action: PROCEDURE [TUPLE [G]])
+
+
+As an argument do_all takes an agent based on a procedure with one open argument which is the same type as the list items (in this class, G is the formal generic parameter representing the type of the items being stored). Then it traverses the list executing the routine associated with that agent and uses the current list item to satisfy the open argument.
+
+Instead of coding the loop shown above, we can code this instruction:
+
+ my_list.do_all (agent print_on_new_line (?))
+
+
+we leave open the argument required by print, and do_all will provide it as a reference to the current list item as it traverses the list.
+
+===Targets for Agents' Routines===
+
+In Eiffel every routine must be applied against a target object. In our model for computation, x.f (a, ...), the x is the target of the application of feature f. In the case of an agent, the agent must account for objects for each of the arguments and an object for the target of the routine.
+
+Let's identify the targets in the examples shown. First:
+
+ button.select_actions.extend (agent gauge.step_forward)
+
+
+Here the target is the object attached to the entity "gauge" which is (although you cannot determine it from this line taken out of context) an object of type EV_GAUGE.
+
+How about this:
+
+ my_procedure := agent two_argument_procedure (1, 2)
+
+
+Here, since there was no qualification, then the target is the current instance. Same with this:
+
+ my_list.do_all (agent print_on_new_line (?))
+
+
+Again, consider the fact that the agent must account for objects for each of the arguments to a routine, and an object for the target. So, in the examples we've seen so far, the target is close, that is provided at the time of the creation of the agent.
+
+But we can actually leave the target open as well. Now we cannot use the question mark notation to do that, because if we did, there would be no way to know of which class the routine is a feature. So instead, we mark an open target with the class name in braces.
+
+Suppose in our list of strings example, we wanted to print the strings, then convert them to lower case, then print them again. Remember that "do_all" has one open argument, which will be provided as the current list item during the traversal.
+
+ my_list.do_all (agent print_on_new_line (?))
+ my_list.do_all (agent {STRING}.to_lower)
+ my_list.do_all (agent print_on_new_line (?))
+
+
+In between printing the list two times, we provide do_all with an agent that representing the STRING class's feature to_lower which will convert each string in the list to lower case. Notice that to_lower does not take an argument of type STRING as print_on_new_line did. Rather it gets applied to an instance of STRING, so it is targeted to a string. So we leave its target open and do_all provides the current list item as the target.
+
+Agents for Functions
+
+So far all the agents that we have coded have created instances of PROCEDURE. But functions are routines and can be represented as agents as well. The difference is that functions have a return value.
+
+Let's extend the string example by using an agent that represents a function. Suppose we wanted to print only those strings which contain a particular character, say the exclamation point.
+
+Here again we'll use a feature of the LINKED_LIST class. There is a feature called do_if which takes two agents as arguments. One is an action procedure like the argument that do_all takes, and the other is a function which returns a boolean and used as a test. As each list item is current, the test is applied first. If the result is true, then the action is applied with the current item.
+
+ my_list.do_if (agent print_on_new_line(?), agent {STRING}.has('!'))
+
+
+
+The agent for the action is the same as we used earlier. We've added an agent for the test. It represents applying the has feature of the STRING class. Here the target is left open, because we want each of the strings in the list to be the target of has.
+
+
+Compatibility note
+
+Versions of the Kernel Library classes ROUTINE, PROCEDURE, FUNCTION and PREDICATE prior to EiffelStudio 17-05 had an extra generic parameter at the initial position; the usual actual generic parameter was ANY. It has been removed. The compiler has been engineered so that in almost all cases it will still accept the old style.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/exception-mechanism.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/exception-mechanism.wiki
new file mode 100644
index 00000000..4c895703
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/exception-mechanism.wiki
@@ -0,0 +1,66 @@
+[[Property:title|Exception Mechanism]]
+[[Property:weight|6]]
+[[Property:uuid|84a159dd-4a19-af73-7b0b-0618a284142a]]
+==Motivation: Concerning Robustness==
+
+The notion of software correctness that we saw in [[Design by Contract and Assertions|Design by Contract and Assertions]] is half of the formula for software reliability. Correctness covers what the software is supposed to do, that is, its specification.
+
+Of course,there is always a potential for things to go out of the bounds of the specification. This happens, for exampleif a client makes a call to a routine from a state in which the routine's precondition is not true.
+
+How well software responds to situations which outside specification is called robustness. Together correctness and robustness define software reliability.
+
+==Consequences of Contracts==
+
+In the presence of Design by Contract, what happens to running software boils down to a simple rule:
+
+A routine callcan complete in one of only two ways:
+# The routine fulfills its contract.
+# The routine fails to fulfill its contract.
+
+As a follow-on, we can add that:
+* Any routine that fails to fulfill its contract must cause an exception in its caller.
+
+==Reacting to Exceptions==
+
+Again, because of Design by Contract, we can state the following rule for dealing with exceptions:
+
+A routine that incurs an exeception can react in one of only two ways:
+# It can return the instance to a stable state and retry the entire routine with the same or a different strategy.
+# It can fail, causing an exception in its caller.
+
+There is an Eiffel mechanism called the rescue clause which facilitates the first alternative.
+
+===The Rescue Clause===
+
+The rescue clause is part of the routine structure we saw in [[Adding Class Features|Adding Class Features]] . The rescue clause is a sequence of instructions introduced by the keyword "rescue". At the point that an exception occurs, the processing of the normal instructions in the routine body will cease, and the instructions in the rescue clause will be executed instead.
+
+If the instructions in the rescue clause can set things up so that it might prove fruitful to attempt to retry the routine, it can do so by issuing a retry instruction. When the retry instruction is executed, the routine is restarted from its beginning, although local entities are not re-initialized. You will see why in the example below.
+
+If the rescue clause exits without issuing a retry instruction, then the routine fails.
+
+It should be noted that rescue clauses and retry instructions are not something that are used commonly. Out of the approximately 2000 classes in the delivered Eiffel libraries, there are only 16 occurrences. Many of these are oriented toward network and database operations for which some reasonable recovery might be possible.
+
+ transmit: (p: PACKET)
+ -- Transmit packet `p'
+ require
+ packet_not_void: p /= Void
+ local
+ current_retries: INTEGER
+ r: RANDOM_NUMBER_GENERATOR
+ do
+ line.send (p)
+ rescue
+ if current_retries < max_retries then
+ r.next
+ wait_millisecs (r.value_between (20, 500))
+ current_retries := current_retries + 1
+ retry
+ end
+ end
+
+
+In the example above, rescue is used to recover from a situation in which an exception occurs in trying to send a packet. When the exception occurs the rescue clause will, if the maximum number of retries has not been reached, wait for some random length of time. Then, after having updated the number of retries, it will issue the retry instruction. If the maximum number of retries is reached, the rescue clause will exit without executing the retry, constituting a failure.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/genericity.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/genericity.wiki
new file mode 100644
index 00000000..69bdfb3a
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/genericity.wiki
@@ -0,0 +1,144 @@
+[[Property:title|Genericity]]
+[[Property:weight|4]]
+[[Property:uuid|3a0bfe10-78e7-00eb-d9a0-b977d1fa352a]]
+We got a very short introduction to generic classes when we were looking at the formal generic part of class structure in [[Eiffel Classes|Eiffel Classes]] . That discussion left to the imagination the motivation and benefits for creating generic classes.
+
+You will see that most of the generic classes model containers for multiple items and at least one of their formal generic parameters represents the type of items that are to be stored in the container. Some generic classes, like LINKABLE, care for only one instance of the type represented by their formal generic parameter.
+
+==Motivation==
+
+Imagine that a software producer is planning to build a class which would represent a list of things. Someone might ask "What kinds of things?" To which the producer would reply, "Just things. I want my list to be usable for all kinds of things."
+
+Using the idea of polymorphic attachment that we learned in [[Inheritance|Inheritance]] , the producer could build such a class. It might have a query item which would return the thing from the list to which a cursor currently points. It might have a command put which would enter some new thing into the list.
+
+What would be the type of item? And what would be the type of the argument to put?
+
+If the producer wants the class to handle all kinds of things, then the answer must be class ANY, the class from which all others inherit.
+
+class
+ LIST_OF_THINGS
+ ...
+feature -- Access
+
+ item: ANY
+ -- The thing currently pointed to by cursor
+ ...
+feature -- Element change
+
+ put (new_item: ANY)
+ -- Add `new_item' at the end of the list
+ ...
+
+
+This will work, but has some definite disadvantages. Suppose you choose to use this class to maintain a list of cats in one of your classes. You might make this declaration:
+
+ my_cats: LIST_OF_THINGS
+ -- A list of my cats
+
+
+Then you could add individual instances to the list:
+
+ fluffy, twinkie: CAT
+ ...
+ my_cats.put (fluffy)
+ my_cats.put (twinkie)
+
+
+One problem with this type of list is that the type system will not help you keep from doing something pathological like:
+
+ fluffy, twinkie: CAT
+ thor: PSYCHOTIC_HYDROPHOBIC_CAT_HATING_DOG
+ -- A very nasty dog
+ ...
+ my_cats.put (fluffy)
+ my_cats.put (twinkie)
+ my_cats.put (thor)
+
+
+Another problem is that to do any CAT things with an item in the list, you must reattach it to a CAT entity. The following is invalid.
+
+ my_cats.item.purr -- Is invalid
+
+
+This is because "item" is type ANY and although it may be currently attached to an instance of CAT, the static typing system cannot guarantee that. So you must use an object test as we saw in the polymorphism example in [[Inheritance|Inheritance]] .
+
+ ...
+ if attached my_cats.item as some_cat then
+ some_cat.purr
+ end
+
+
+You can see that this type of list has its drawbacks. Of course you could build a LIST_OF_CATS class in which item and the argument for put would be of type CAT. This would let you purr a cat without pulling it out of the list, and it would also prevent you from accidently letting old Thor in with the cats. But, every time you needed a list to hold a different type of object, you have to write a new class.
+
+Indeed, this is how things are done in environments without facilities genericity.
+
+What we would like to have is a way to produce the text of the list class once. Then only when we make declarations do we add the additional information about the particular types we want allowed in the list.
+
+==Basic Genericity==
+
+In Eiffel this is accomplished through generic classes. Generic classes are written relative not to a specific class but to a kind of phony class name called a formal generic parameter. With genericity, the LIST_OF_THINGS class might become a class called LIST which is a list of items of type G. In class LIST we would declare item as type G, as well as the argument to put.
+
+class
+ LIST [G]
+ ...
+feature -- Access
+ item: G
+ -- The item currently pointed to by cursor
+ ...
+feature -- Element change
+ put (new_item: G)
+ -- Add `new_item' at the end of the list
+ ...
+
+
+We could declare feature my_cats as a LIST of items of type CAT. By doing so we are providing CAT as an "actual generic parameter" in the declaration. Then we are free to treat the features of LIST as if the class name CAT had been substituted for every occurrence of the formal generic parameter G.
+
+ my_cats: LIST [CAT]
+ -- A list of my cats
+ fluffy, twinkie: CAT
+ ...
+ my_cats.put (fluffy)
+ my_cats.put (twinkie)
+ ...
+ my_cats.item.purr -- Valid now
+
+
+The following would no longer be valid:
+
+ my_cats: LIST [CAT]
+ -- A list of my cats
+
+ thor: PSYCHOTIC_HYDROPHOBIC_CAT_HATING_DOG
+ ...
+ my_cats.put (thor) -- Is invalid
+
+
+==Constrained Genericity==
+
+The generic class LIST illustrated above is perfectly useful for making typed lists of any type of object. The features of the LIST will not attempt to use the objects in the list in any way. Sometimes though, it is important for a class to be guaranteed more about the nature of the types that can be substituted for its formal generic parameter.
+
+Take for example the case of a class called SORTED_LIST. A SORTED_LIST is a list, of course, but it is special in that it acts upon the elements that it holds to keep them in order.
+
+A SORTED_LIST needs to be able to order its elements. So, it must be able to apply queries to those elements to determine which should sort high than which. The elements themselves must respond to ordering operations.
+
+If SORTED_LIST were defined like we did LIST
+
+class
+ SORTED_LIST [G]
+
+
+there would be no guarantee that ordering operations, like "<" and ">" could be applied to all types that could be listed. An Eiffel facility called "constrained genericity" will solve this problemfor us. In the case of SORTED_LIST, we would add to the formal generic part as follows.
+
+class
+ SORTED_LIST [G -> COMPARABLE]
+
+
+You may remember from [[Inheritance|Inheritance]] that if we make instances of a class comparable with each other, then we make the class inherit from COMPARABLE and effect the feature "<".
+
+Here, constrained genericity does two things for us.
+* First, it states that any candidate for substitution for G must conform to class COMPARABLE. Typically this means it must inherit from COMPARABLE.
+* Second, it allows, within the features of SORTED_LIST, the features of COMPARABLE to be applied to any item which has a type of G.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/index.wiki
new file mode 100644
index 00000000..2d322e0b
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/index.wiki
@@ -0,0 +1,19 @@
+[[Property:title|Eiffel for .NET]]
+[[Property:weight|2]]
+[[Property:uuid|446038d8-abd6-0a0d-2b90-94124e1ac810]]
+These pages contain documentation that describes the Eiffel programming language.
+
+Eiffel is considered both a development methodology and a programming language.
+
+Eiffel the methodology is a recipe for constructing quality software which is based on a small number of powerful concepts. Eiffel the programming language is a notation which is designed to support the methodology.
+
+Eiffel for.NET is the Eiffel programming language made available in the .NET environment. Eiffel for.NET components can use and inherit from components in .NET assemblies that were produced using other.NET languages. And, programmers using other.NET languages can use and inherit from components in assemblies produced using Eiffel for.NET.
+
+==Eiffel for.NET Conventions Documentation==
+
+In Eiffel, as in other languages, certain conventions have evolved which constitute "the way things are done". Conventions provide consistency and therefore predictability and readability of software text.
+
+When working in the.NET components, particularly when using components from .NET assemblies delivered from Microsoft or produced by other parties, the conventions of Eiffel are maintained in the view of these components. The first section, titled [[Conventions]], provides you with an understanding of Eiffel terminology, conventions , and how they work with .NET.
+
+The remaining sections of this section are a reference for the Eiffel for .NET language. It is not a complete reference, though. Rather, it is intended to help you with the tasks that Eiffel programmers commonly encounter.
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/inheritance.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/inheritance.wiki
new file mode 100644
index 00000000..e081c166
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/inheritance.wiki
@@ -0,0 +1,341 @@
+[[Property:title|Inheritance]]
+[[Property:weight|3]]
+[[Property:uuid|7e4cb7ba-fda6-8eac-3e27-bbb8fafd8673]]
+Inheritance, along with client/supplier, are the two relationships that can exist between classes.
+
+Inheritance lets us mirror in software the types of abstractions that are common in many problem domains, i.e., the more general to the more specialized.
+
+Inheritance also gives a way us to combine these abstractions.
+
+Inheritance allows us to make extensions and adaptations to existing software, while at the same time, leaving the original software unaltered.
+
+==The Eiffel Inheritance Model==
+
+If class B inherits from class A, then:
+* Every feature of A is also a feature of B
+* In any case in which an instance of A is called for, then an instance of B will suffice.
+
+Flexibility and adaptability are key qualities of the Eiffel inheritance model. On an informal level, this means that, except as prevented by certain constraints, a class can inherit from a set of classes containing just about any other classes.
+
+Eiffel classes can be effective or deferred. If a class is effective, then it is completely implemented. As a result, it is possible to create and use direct instances of an effective class at runtime.
+
+If a class is deferred, then it is not completely implemented. A class is deferred if it contains at least one deferred feature. So, it is possible for you to mark a feature (and by consequence also its class) as deferred when you code it. This means that the specification for this class dictates that such a feature exists, but there is no implementation for the feature included in the class. As a result, there can be no direct instances of deferred classes at runtime. However, a class that inherits from a deferred class can implement, or effect, the deferred features. This results in an effective descendant to the deferred class. And it is possible to create direct instances of this effective descendant. Such instances would also be instances (albeit not direct instances) of the original deferred class.
+
+What this means to us as software producers, is that in any development effort, we have available a great number of classes which can serve as potential starting points. That is, classes that we could make parents to the classes we produce. And, those classes do not have to chosen from a strict dichotomy of classes which are either completely abstract or completely implemented. Inheritance from classes that are deferred but have some implemented features is both possible and encouraged. It reuses existing software and it reduces the opportunity for error.
+
+Consider the deferred class COMPARABLE from the Eiffel Base Library. A portion of COMPARABLE is shown below:
+
+deferred class
+ COMPARABLE
+
+feature -- Comparison
+
+ is_less alias "<" (other: like Current): BOOLEAN
+ -- Is current object less than `other'?
+ deferred
+ end
+
+ is_less_equal alias "<=" (other: like Current): BOOLEAN
+ -- Is current object less than or equal to `other'?
+ do
+ Result := not (other < Current)
+ end
+
+ is_greater alias ">" (other: like Current): BOOLEAN
+ -- Is current object greater than `other'?
+ do
+ Result := other < Current
+ end
+
+ is_greater_equal alias ">=" (other: like Current): BOOLEAN
+ -- Is current object greater than or equal to `other'?
+ do
+ Result := not (Current < other)
+ end
+
+ is_equal (other: like Current): BOOLEAN
+ -- Is `other' attached to an object of the same type
+ -- as current object and identical to it?
+ do
+ Result := (not (Current < other) and not (other < Current))
+ end
+
+
+If you are producing a class that you wish to support basic comparison operators, like "<" and ">", you can have that class inherit from COMPARABLE, which has features which correspond to those operators. The text for COMPARABLE contains eight features. Seven of these are effective and one is deferred.
+
+So through inheritance from COMPARABLE, your class, let's call it WHATZIT, would now have these features available. But how would the features of COMPARABLE know what it means to compare WHATZITs?
+
+Of course, it would have no way of knowing, so you must show it. And you do that by writing the implementation for "<", the one deferred feature that WHATZIT inherits from the COMPARABLE class.
+
+When you look closely at the effective features of COMPARABLE, you see that their implementations are ultimately based on "<". If we were not able to inherit from multiple partially implemented classes, then we would be forced to implement many more features, a process which invites error, or, in the case of comparison, to move to a less appealing model.
+
+==The Inheritance Part of Classes in Eiffel==
+
+Because the inheritance model has such flexibility, it must also have adaptability. A consequence of inheriting from multiple classes is that it would be possible to inherit multiple features with the same name ... and you remember from [[Adding Class Features|Adding Class Features]] that a class is not allowed to have more than one feature with the same name. A process called feature adaptation allows us to resolve these issues in an heir. Feature adaptation is also done for reasons other than resolving name clashes as well.
+
+Feature adaptation is an enabling capability, but it is also one that takes some study to understand fully.
+
+We will look at the types of feature adaptation that will serve most useful to you as you begin to produce Eiffel software.
+
+In [[Eiffel Classes|Eiffel Classes]] you saw where the inheritance part fits into the class structure. Shown below is a portion of class LINKED_QUEUE from the Eiffel libraries. LINKED_QUEUE is an effective class which implements the abstract notion of a QUEUE (a deferred class) with an implementation based on the services provided by LINKED_LIST (an effective class).
+
+class
+ LINKED_QUEUE [G]
+inherit
+ QUEUE [G]
+ undefine
+ is_empty,
+ copy,
+ is_equal
+ redefine
+ linear_representation,
+ prune_all,
+ extend
+ select
+ item,
+ put
+ end
+ LINKED_LIST [G]
+ rename
+ item as ll_item,
+ remove as ll_remove,
+ make as ll_make,
+ remove_left as remove,
+ put as ll_put
+ export
+ {NONE}
+ all
+ {ANY}
+ writable,
+ extendible,
+ wipe_out,
+ readable
+ undefine
+ fill,
+ append,
+ prune,
+ readable,
+ writable,
+ prune_all,
+ extend,
+ force,
+ is_inserted
+ redefine
+ duplicate,
+ linear_representation
+ select
+ remove
+ end
+
+
+Okay ... now calm down ... please. This is an example from a very highly-evolved and sophisticated library which is replete with software reuse. LINKED_QUEUE has two parents and uses considerable feature adaptation. In fact, it uses every feature adaptation option available. The benefit is obvious, though. LINKED_QUEUE class has only seven features actually coded. In total there are only 26 lines of instructions!
+
+In practice you can use inheritance, even multiple inheritance, to do some quite productive programming in Eiffel without having to write anything that looks like the inheritance part of LINKED_QUEUE above.
+
+Regardless, let's break LINKED_QUEUE's inheritance part into chunks and take a look at some of them.
+
+===Rename===
+
+ rename
+ item as ll_item,
+ remove as ll_remove,
+ make as ll_make,
+ remove_left as remove,
+ put as ll_put
+
+
+As you might have already guessed, the rename part, introduced oddly enough by the keyword "rename", is used to rename features.
+
+Specifically, it is used when an heir wants to use a feature from a parent, but wants to use it under a different name than that by which the parent knows it. So in the example, the feature known as item in LINKED_LIST is perfectly usable in LINKED_QUEUE, but must be applied as ll_item.
+
+This is common when your class inherits two different features with the same name from two different parents and you want to be able to use them both. Because you can only have one feature with a given name, then rename one of the features.
+
+===New Exports===
+
+ export
+ {NONE}
+ all
+ {ANY}
+ writable,
+ extendible,
+ wipe_out,
+ readable
+
+
+The new exports part is introduced by the keyword "export". This section allows you to change the export status of inherited features. Remember from [[Adding Class Features|Adding Class Features]] that features become available (or not) to clients by their export status. Export status of immediate features is controlled in the feature clause. But here we are dealing with inherited features, so we control their status in the export part of the class's inheritance section. Any feature not mentioned will have the same export status as it did in the parent class.
+
+In this example, the keyword "all" is used first to say that all features inherited form LINKED_LIST are unavailable to any clients (export to class NONE). This is typical for a class like LINKED_QUEUE in which the features important to the client come from the deferred parent, in this case QUEUE, and the class LINKED_LIST is used only for implementation. But, it seems that also in this case, the producer felt differently about the features writable, extendible, wipe_out, and readable, and decided the allow clients of ANY type to utilize these features inherited from LINKED_LIST.
+
+===Undefine===
+
+ undefine
+ is_empty,
+ copy,
+ is_equal
+
+
+Next, undefine ... it's probably not what you think. You might assume that undefine is a way to banish forever any inherited features that you just do not want to deal with. But what happens to features whose names are listed in an undefine clause is that they become deferred features in the heir.
+
+Undefine is useful if you inherit two different features of the same name from different parents, a situation you cannot live with. If you like one and you don't like the other, then you can undefine the one you don't like. The the only version you get is the one you like.
+
+Another way you might use undefine is in the case in which you actually want a feature to be deferred in an heir that was effective in a parent.
+
+===Redefine===
+
+ redefine
+ linear_representation,
+ prune_all,
+ extend
+
+
+The redefine part lists the names of effective features for which the producer of the heir class would like to provide implementations that replace the inherited implementations.
+
+So, in this example the implementation for linear_representation, for example, that LINKED_QUEUE would have inherited from QUEUE will not be used. Instead LINKED_QUEUE implements its own version of linear_representation.
+
+{{note|When a class implements a version of an inherited feature which was deferred in its parent, this is known as "effecting" the feature. Because features being effected are getting their first implementation, it is not necessary to list their names in the redefine part, or anywhere else in the inheritance part of the heir. }}
+
+===Select===
+
+ select
+ remove
+
+
+The select part is used only under special circumstances. The case in which select is required involves a situation called "repeated" inheritance. Repeated inheritance occurs when an heir inherits more than once from the same ancestor. Usually this means it has two or more parents who have a common proper ancestor (but it can occur directly). The features from the common ancestor are inherited by each of the parents and passed on to the heir. The rules and effects of repeated inheritance occupy an entire chapter in the official Eiffel programming language reference and will not be reproduced here. Justunderstand at this point that it is sometimes necessary to use select to provide the dynamic binding system with an unambiguous choice of features in the presence of polymorphic attachment.
+
+You should note also that repeated inheritance can and does occur often without causing any problem at all. In fact it happens in every case of multiple inheritance, due to the fact that all classes inherit from class ANY and receive its features as a result. The reason it is not a problem is that in the case that any feature makes it from the original common ancestor along multiple paths to the heir with its name and implementation still intact, it will arrive as only one feature heir. This is called sharing and nothing special needs to be done to make it happen.
+
+==Polymorphism==
+
+It is time now to see another way in which inheritance helps build more extendible software.
+
+Assume that we have to build classes that model different types of polygons. We would do this by building a class for polygon which would model a garden-variety polygon, a multi-sided closed figure. But when we consider that there are specialized types of polygons, like triangles and rectangles, we realize that to support these specializations, we need classes for them as well. And this is an obvious opportunity for inheritance. All triangles and rectangles are polygons. So, we start with class POLYGON and its proper descendants TRIANGLE and RECTANGLE.
+
+So we can make declarations like:
+
+ my_polygon: POLYGON
+ your_polygon: POLYGON
+ my_triangle: TRIANGLE
+ my_rectangle: RECTANGLE
+ another_rectangle: RECTANGLE
+
+
+Assume these declarations are in force for all the examples this section on polymorphism.
+
+We saw in [[Adding Class Features|Adding Class Features]] that we can say that one class conforms to another if it is the same class or one of its proper descendants. Therefore POLYGON conforms to POLYGON. Also, TRIANGLE and RECTANGLE conform to POLYGON. But, importantly, POLYGON does not conform to TRIANGLE or RECTANGLE. This makes sense intuitively, because we know all rectangles and triangles are polygons ... and we also know that not all polygons are rectangles.
+
+===Polymorphic Attachment===
+
+These facts affect how assignments can work. Using the declarations above:
+
+ my_polygon := your_polygon -- Is valid
+ your_polygon :=my_polygon -- Is valid
+ my_polygon :=my_rectangle -- Is valid
+ my_polygon := my_triangle -- Is valid
+
+
+but
+
+ my_rectangle := my_polygon -- Is not valid
+ my_triangle := my_polygon -- Is not valid
+
+
+and of course
+
+ my_rectangle := my_triangle -- Is not valid
+
+
+Consider now the assignment below which is valid.
+
+ my_polygon := my_rectangle
+
+
+After an assignment like this executes the entity my_polygon will be holding at runtime a reference to an instance of a type which is not a direct instance of its declared type POLYGON. But conformance ensures us that, although it may not be a direct instance, it will indeed by an instance. (all rectangles are polygons).
+
+Depending upon how many different types of polygons get modeled in classes, the entity "my_polygon" could be attached objects of may different types ... it could take on many forms. This in fact is the basis for the term "polymorphism"; having many forms. So we speak of "polymorphic attachment" as the process by which at runtime entities can hold references to objects which are not of the entity's declared type ... but they are of conforming types.
+
+Now let's see how we get some value from this.
+
+===Dynamic Binding===
+
+Suppose that one of the features of POLYGON is a query perimeter which returns an instance's perimeter. The producer of POLYGON may have implemented perimeter as a function that computes the perimeter by adding up the lengths of all the sides. This approach is guaranteed to work for all polygons, and we can apply the perimeter feature to any polygon. Let's print some perimeters:
+
+ print (my_polygon.perimeter)
+ print (my_triangle.perimeter)
+ print (my_rectangle.perimeter)
+
+
+TRIANGLE and RECTANGLE might have properties, expressed as queries, which as a part of their specialization, distinguish them from run-of-the-mill polygons. Two features of rectangles are width and height the lengths of the sides.
+
+Armed with these RECTANGLE-specific features, the producer of RECTANGLE may say, "Now I no longer have to depend upon that crude implementation of perimeter that is inherited from POLYGON. I can build an efficient RECTANGLE-specific implementation of perimeter, based on the knowledge that for all RECTANGLEs perimeter = 2*(width+height)"
+
+To implement this specialized version of perimeter, the producer of RECTANGLE must add the feature to the class, but also must list its name in the "redefine" part of the RECTANGLE's inheritance clause.
+
+class
+ RECTANGLE
+inherit
+ POLYGON
+ redefine
+ perimeter
+ end
+ .
+ .
+feature
+ perimeter: REAL
+ -- Sum of lengths of all sides
+ do
+ Result := 2 * (width + height)
+ end
+
+
+You would expect then, that this version of perimeter would be executed in the following context:
+
+ print (my_rectangle.perimeter)
+
+
+But what makes this interesting is that even in the context below
+
+ my_polygon := my_rectangle
+ print (my_polygon.perimeter)
+
+
+in which perimeter is being applied to a entity declared as POLYGON, the specialized version of perimeter from RECTANGLE is being used. It would be impossible to ensure at compile time which version of perimeter is most appropriate. So it must be done at runtime. This ability to choose the best version of a feature to apply, just at the moment it needs to be applied, is called "dynamic binding".
+
+Static typing tells us at compile time that it is safe to apply perimeter to my_polygon No matter which of the types of polygons is attached to my_polygon, there will be a perimeter feature that will work.
+
+Dynamic binding tells us that when we apply perimeter, we know that the most appropriate version of the feature will get applied at runtime.
+
+===Object Test===
+
+Now let's add another situation. Consider the code below:
+
+ my_polygon := my_rectangle
+ print (my_polygon.perimeter)
+ print (my_polygon.width) -- Is invalid
+
+
+We could apply perimeter to my_polygon and everything is fine ... we even get RECTANGLE's specialized version of the feature. But it is invalid for us to try to apply width to my_polygon even though we feel (with rather strong conviction) that at this point in execution, my_polygon will be attached to an object of type RECTANGLE, and we know that width is a valid query on RECTANGLEs.
+
+The reason follows. When we declared my_polygon as type POLYGON, we made a deal that says that the only features that can be applied to my_polygon are the features of POLYGON. Remember that static typing guarantees us at compile time that at runtime there will be at least one version of the feature available that can be applied.
+
+ print (my_polygon.width) -- Is invalid
+
+
+But in the case above, the guarantee cannot be made. my_polygon is declared with class POLYGON which has no width feature, despite the fact that some of its proper descendants might.
+
+Does this mean that we can never do RECTANGLE things with this instance again, once we have attached it to my_polygon?
+
+No. There is a language facility called the '''object test''' which will come to our rescue. The object test will allow us safely to attach our instance back to an entity typed as RECTANGLE. After doing so, we are free use RECTANGLE features.
+
+ my_polygon := my_rectangle
+ print (my_polygon.perimeter)
+ if attached {RECTANGLE} my_polygon as l_rect then
+ print (l_rect.width)
+ end
+
+In this code, the entity l_rect is a fresh local entity produced during the object test. So, the code can be read: if at this point, my_polygon is attached to an instance of type RECTANGLE, then attach that instance to a fresh local entity named l_rect, then apply width to l_rect and print the result.
+
+
+:'''Note:''' The object test replaces the functionality of an obsolete mechanism called assignment attempt. Assignment attempt used the syntax '''?=''' in the context of assignment versus the ''':=''' of normal assignment.
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/referenced-assembly-type-and-feature-name-conversion.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/referenced-assembly-type-and-feature-name-conversion.wiki
new file mode 100644
index 00000000..fcc4e197
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/eiffel-net-language/eiffel-net/referenced-assembly-type-and-feature-name-conversion.wiki
@@ -0,0 +1,49 @@
+[[Property:title|Referenced Assembly Type and Feature Name Conversion]]
+[[Property:weight|10]]
+[[Property:uuid|5d575090-35d9-f983-7308-172b1641173f]]
+The [[The Eiffel for .NET language|Eiffel for .NET language]] is Eiffel. It is not a variant of Eiffel that spawned a new language, as is '''C#''', or a dramatic evolution of Eiffel, such as '''Visual Basic .NET''' is to '''VB6'''. As Eiffel stands today, and will probably remain, Eiffel's conventions for class names and features names match neither that of the OO Pascal variants nor the "Camel-casing" conventions recommended by Microsoft. Eiffel also does not support the notion of full quantified type names. The period (''''.'''') between namespace and type names is not valid Eiffel syntax. These naming convention rules pose a problem for maintaining the Eiffel programming language. To address this issue, when referencing .NET assemblies, all referenced assembly type names and feature names are converted into "Eiffel-case" when using Eiffel.
+
+==What is Eiffel-Case?==
+
+Eiffel-casing is almost the same for both class and class feature names, all words are separated using underscores (''''_''''). The differences between them are class names are always in uppercase and feature names always in lowercase.
+
+ARGUMENTS.
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/index.wiki
new file mode 100644
index 00000000..5409ccbf
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/index.wiki
@@ -0,0 +1,8 @@
+[[Property:title|.NET]]
+[[Property:weight|-15]]
+[[Property:uuid|55eda2f0-0c60-f08c-b141-913e31a49c2f]]
+==.NET==
+
+Eiffel support for Microsoft .NET.
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/net-installation-instructions.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/net-installation-instructions.wiki
new file mode 100644
index 00000000..81cb8df4
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/net-installation-instructions.wiki
@@ -0,0 +1,5 @@
+[[Property:title|.NET Installation instructions]]
+[[Property:weight|0]]
+[[Property:uuid|64f7e3b1-f6ee-5cc4-1006-2fc4dfdaeae7]]
+Before installing the .NET components for Eiffel for .NET you need to install either the .NET Framework, the .NET Framework SDK or Visual Studio .NET. If you do not have any of those installed, the installation program will prompt you with a warning because no .NET features support will be installed.
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/ado-net-samples/adonet-sample.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/ado-net-samples/adonet-sample.wiki
new file mode 100644
index 00000000..b6c08c19
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/ado-net-samples/adonet-sample.wiki
@@ -0,0 +1,88 @@
+[[Property:title|ADO.NET Sample]]
+[[Property:weight|0]]
+[[Property:uuid|45d24893-63d0-c2a9-9f62-ead08ca4b901]]
+This sample consist of a command line showing how to interact with a database.
+
+The DataReader object is somewhat synonymous with a read-only/forward-only cursor over data. The DataReader API supports flat as well as hierarchical data. A DataReader object is returned after executing a command against a database. The format of the returned DataReader object is different from a recordset. For example, you might use the DataReader to show the results of a search list in a web page.
+
+==Compiling==
+
+To compile the example:
+# Launch EiffelStudio.
+# Select '''Use existing Ace (control file)''' and click '''OK'''
+# Browse to ''$ISE_EIFFEL\examples\dotnet\ado\ado3\''
+# Choose the Ace file for the version of the .net framework you are running
+# Choose the directory where the project will be compiled, by default the same directory containing the Ace file.
+# Click '''OK'''.
+
+
+==Running==
+
+After you launch the sample, the following output appears:
+
+Customer ID Company Name
+ALFKI Alfreds Futterkiste
+ANATR Ana Trujillo Emparedados y helados
+ANTON Antonio Moreno Taquera
+AROUT Around the Horn
+BERGS Berglunds snabbkp
+BLAUS Blauer See Delikatessen
+BLONP Blondesddsl p`re et fils
+BOLID Blido Comidas preparadas
+BONAP Bon app'
+BOTTM Bottom-Dollar Markets
+BSBEV B's Beverages
+CACTU Cactus Comidas para llevar
+CENTC Centro comercial Moctezuma
+CHOPS Chop-suey Chinese
+COMMI Comrcio Mineiro
+CONSH Consolidated Holdings
+DRACD Drachenblut Delikatessen
+DUMON Du monde entier
+EASTC Eastern Connection
+... ... ...
+WILMK Wilman Kala
+WOLZA Wolski Zajazd
+
+
+When the display is finished, the application wait for you to pressed the return key to finish the application.
+
+==Under the Hood==
+
+This application shows how to interact with a database. First the connection to the database is opened:
+
+ create connection.make ("server=(local)\NetSDK;Trusted_Connection=yes;database=northwind")
+
+Then a request to the database is made:
+
+ create command.make ("select * from customers", connection)
+ connection.open
+ reader := command.execute_reader
+
+Finally, the result of the request is displayed:
+
+ from
+ ok := reader.read
+ until
+ not ok
+ loop
+ io.put_string (reader.item ("CustomerID").to_string)
+ io.put_string ("%T%T")
+ io.put_string (reader.item ("CompanyName").to_string)
+ io.new_line
+ ok := reader.read
+ end
+
+
+This sample uses the following ADO.NET classes:
+*
+*********************************
+Calculator in reverse Polish form
+*********************************
+Allowable operations are:
+ '/': Divide top two numbers on the stack.
+ '0': Empty the stack.
+ 'a': Enter operand onto stack.
+ '?': Help.
+ '*': Multiply top two numbers on the stack.
+ '+': Add top two numbers on the stack
+ 'q': Quit.
+ '-': Subtract top two numbers on the stack.
+Enter a number, followed by :
+
+
+Enter the first number to be put onto the stack, for example 3.
+
+{{note|Failing to enter a number at this stage will cause the sample to stop. This sample was designed to showcase the use of EiffelBase data structures in the Microsoft .NET environment and is not protected against unexpected entries. }}
+
+You may then add another number on the stack by entering the character "a":
+
+*********************************
+Calculator in reverse Polish form
+*********************************
+Allowable operations are:
+ '/': Divide top two numbers on the stack.
+ '0': Empty the stack.
+ 'a': Enter operand onto stack.
+ '?': Help.
+ '*': Multiply top two numbers on the stack.
+ '+': Add top two numbers on the stack
+ 'q': Quit.
+ '-': Subtract top two numbers on the stack.
+Enter a number, followed by : 3
+
+Accumulator = 3
+
+Next operation? a
+Enter a number, followed by :
+
+
+Enter a second number, for example 2. You can then apply any operation to the two operands such as minus:
+
+...
+Next operation? a
+Enter a number, followed by : 2
+
+Accumulator = 2
+
+Next operation? -
+
+Accumulator = 1
+
+Next operation?
+
+
+You may use the operation 0 to clear the stack at any time. You may use q to quit the program.
+
+{{tip|You can use the command ? to display the list of available operations. }}
+
+==Under the Hood==
+
+This sample shows how to leverage EiffelBase data structures in a simple Eiffel system. The root class
+Main thread: Queuing an asynchronous operation.
+Main thread: Performing other operations.
+WorkItem thread: Performing asynchronous operation
+Main thread: Waiting for asynchronous operation to complete.
+
+
+When the display is finished, the application wait for you to pressed the return key to finished the application.
+
+==Under the Hood==
+
+This application shows how to use the thread
+ return := {THREAD_POOL}.queue_user_work_item (create {WAIT_CALLBACK}.make (Current, $async_operation, l_async_operation_done))
+
+and is associated to the local variable l_async_operation_done. Both threads perform simultaneously some operations. The main thread wait for the asynchronous thread to complete his own operations
+
+ return := l_async_operation_done.wait_one
+ to close the application.
+
+
+This sample uses the following .NET types:
+*
+Checking for status updates every two seconds
+
+Checking Status.
+Checking Status.
+Checking Status.
+Checking Status.
+Checking Status.
+...
+
+
+When the display is finished, the application wait for you to pressed the return key to finished the application.
+
+==Under the Hood==
+
+This application shows how to use the thread
+ create my_timer.make_with_callback (create {TIMER_CALLBACK}.make (Current, $check_status), Void, 0, 2000)
+
+and calls the feature "Checking Status." every two seconds.
+
+This sample uses the following .NET types:
+*
+ set_is_mdi_container (True)
+
+# Create child forms and set the '''MdiParent''' property of each form to reference the parent form. The following code demonstrates setting the MDI parent for an instance of a child form.
+ doc.set_mdi_parent (Current)
+
+
+If you have different types of data to display, you can have multiple types of child forms. To display a child form, create an instance of the child form and call its '''Show''' method.
+
+
+
+==Standard MDI Menus==
+
+Typically, an MDI application has a '''Windows''' menu that allows the user to arrange the open child windows through tiling or cascading. The '''Windows''' menu also allows you to navigate to any of the open child windows. To create a '''Windows''' menu, add the menu items for tiling and cascading to a '''Windows''' menu in your parent form and set the '''MdiList''' property to '''True''' for the top-level '''Windows''' menu. The following code demonstrates how to create a '''Windows''' menu in an MDIapplication.
+
+ mi_window: WINFORMS_MENU_ITEM
+
+ ...
+
+ mi_window := main_menu.get_menu_items.add ("&Window")
+ dummy := mi_window.get_menu_items.add_string_event_handler ("&Cascade", create {EVENT_HANDLER}.make (Current, $window_cascade_clicked))
+ dummy := mi_window.get_menu_items.add_string_event_handler ("Tile &Horizontal", create {EVENT_HANDLER}.make (Current, $window_tile_h_clicked))
+ dummy := mi_window.get_menu_items.add_string_event_handler ("Tile &Vertical", create {EVENT_HANDLER}.make (Current, $window_tile_v_clicked))
+ mi_window.set_mdi_list (True) -- Adds the MDI Window List to the bottom of the menu
+ ...
+
+
+
+
+
+
+==Child Window Activation==
+
+If you want your parent form to be notified when a child window is activated by the user, you can register an event-handling method for the '''MdiChildActivate''' event. You can determine which child window is active by using the '''ActiveMdiChild''' property of the '''Form''' class. For example, the following code updates a '''StatusBar''' control on the parent form with the name of the child window.
+
+ ...
+
+ add_mdi_child_activate (create {EVENT_HANDLER}.make (Current, $mdi_child_activated))
+
+ ...
+
+ mdi_child_activated (sender: SYSTEM_OBJECT; e: EVENT_ARGS)
+ do
+ status_bar.set_text (active_mdi_child.get_text)
+ end
+
+ ...
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/winform-samples/menus/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/winform-samples/menus/index.wiki
new file mode 100644
index 00000000..0e2cfb84
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/winform-samples/menus/index.wiki
@@ -0,0 +1,45 @@
+[[Property:title|Menus]]
+[[Property:weight|-10]]
+[[Property:uuid|5a32fed4-0b46-51f8-a6b6-fc3eac70a844]]
+
+ main_menu: WINFORMS_MAIN_MENU
+
+
+ create main_menu.make
+ set_menu (main_menu)
+
+
+==Adding a Context Menu to a Control==
+
+The following code demonstrates how to create a '''ContextMenu''' and assign it to a control.
+
+ label_1: WINFORMS_LABEL
+ label_1_context_menu: WINFORMS_CONTEXT_MENU
+
+
+ create label_1.make
+ create label_1_context_menu.make
+ label_1.set_context_menu (label_1_context_menu)
+
+
+==Adding Menu Items==
+
+In the following example, a '''File''' menu item is added to the '''MainMenu'''. The '''File''' menu item contains submenu items called '''Open''' and '''Exit'''.
+
+ mi_file: WINFORMS_MAIN_MENU
+
+
+ mi_file := main_menu. get_menu_items.add (("&File").to_cil )
+ dummy := mi_file. get_menu_items.add_menu_item (create {WINFORMS_MENU_ITEM}.make_from_text (("&Open...").to_cil ))
+ dummy := mi_file. get_menu_items.add (("-").to_cil ) -- Gives us a separator
+ dummy := mi_file. get_menu_items.add_menu_item (create {WINFORMS_MENU_ITEM}.make_from_text(("E&xit").to_cil )
+
+
+
+ mi_file := main_menu.get_menu_items.add (("&File").to_cil)
+ dummy := mi_file.get_menu_items.add_menu_item (create {WINFORMS_MENU_ITEM}.make_from_text_and_on_click_and_shortcut
+ (("&Open...").to_cil, create {EVENT_HANDLER}.make (Current, $FileOpen_Clicked), feature {WINFORMS_SHORTCUT}.ctrl_O))
+ dummy := mi_file.get_menu_items.add (("-").to_cil) -- Gives us a separator
+ dummy := mi_file.get_menu_items.add_menu_item (create {WINFORMS_MENU_ITEM}.make_from_text_and_on_click_and_shortcut
+ (("E&xit").to_cil, create {EVENT_HANDLER}.make (Current, $FileExit_Clicked), feature {WINFORMS_SHORTCUT}.ctrl_X))
+
+
+
+ mi_file := main_menu.get_menu_items.add (("&File").to_cil)
+ dummy := mi_file.get_menu_items.add_menu_item (create {WINFORMS_MENU_ITEM}.make_from_text_and_on_click_and_shortcut
+ (("&Open...").to_cil, create {EVENT_HANDLER}.make (Current, $FileOpen_Clicked), feature {WINFORMS_SHORTCUT}.ctrl_O))
+ dummy := mi_file.get_menu_items.add (("-").to_cil) -- Gives us a separator
+ dummy := mi_file.get_menu_items.add_menu_item (create {WINFORMS_MENU_ITEM}.make_from_text_and_on_click_and_shortcut
+ (("E&xit").to_cil, create {EVENT_HANDLER}.make (Current, $FileExit_Clicked), feature {WINFORMS_SHORTCUT}.ctrl_X))
+
+
+
+
+==Adding Submenus==
+
+The following example demonstrates how to create submenus.
+
+ mi_format: WINFORMS_MAIN_MENU
+
+
+ -- Add Format Menu
+ mi_format := main_menu.get_menu_items.add (("F&ormat").to_cil)
+
+ -- Font Face sub-menu
+ create mmi_sans_serif.make_from_text_and_on_click ((("").to_cil).concat_string_string (("&1. ").to_cil,
+ sans_serif_font_family.get_name), create {EVENT_HANDLER}.make (Current, $FormatFont_Clicked))
+ mmi_sans_serif.set_checked (True)
+ mmi_sans_serif.set_default_item (True)
+ create mmi_serif.make_from_text_and_on_click ((("").to_cil).concat_string_string(("&2. ").to_cil,
+ serif_font_family.get_name), create {EVENT_HANDLER}.make (Current, $FormatFont_Clicked))
+ create mmi_mono_space.make_from_text_and_on_click ((("").to_cil).concat_string_string(("&3. ").to_cil,
+ mono_space_font_family.get_name), create {EVENT_HANDLER}.make (Current, $FormatFont_Clicked))
+
+ create l_array_menu_item.make (3)
+ l_array_menu_item.put (0, mmi_sans_serif)
+ l_array_menu_item.put (1, mmi_serif)
+ l_array_menu_item.put (2, mmi_mono_space)
+ dummy := mi_format.get_menu_items.add_string_menu_item_array (("Font &Face").to_cil, l_array_menu_item)
+
+
+
+
+==Adding Default Menu Items==
+
+The following example demonstrates how to specify a default menu item.
+
+ mmi_sans_serif: WINFORMS_MAIN_MENU
+
+
+ create mmi_sans_serif.make_from_text_and_on_click ((("").to_cil).concat_string_string (("&1 ").to_cil,
+ sans_serif_font_family.get_name), create {EVENT_HANDLER}.make (Current, $format_font_clicked))
+ mmi_sans_serif.set_checked (True)
+
+
+
+
+
+
+==Adding Check Marks to Menu Items==
+
+The following example demonstrates how to display a check mark next to a menu item. The code also demonstrates how to track which item is checked.
+
+ mi_medium: WINFORMS_MAIN_MENU
+
+
+ create mi_medium.make_from_text_and_on_click (("&Medium").to_cil, create {EVENT_HANDLER}.make (Current, $format_size_clicked))
+ mi_medium.set_checked (True)
+
+
+ mmy := label_1_context_menu.get_menu_items.add_menu_item (mi_format.clone_menu)
+
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/winform-samples/message-box.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/winform-samples/message-box.wiki
new file mode 100644
index 00000000..69031294
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/net/samples/winform-samples/message-box.wiki
@@ -0,0 +1,68 @@
+[[Property:title|Message Box]]
+[[Property:weight|-11]]
+[[Property:uuid|cbc37679-43b0-99b8-b8c7-1be8be49882e]]
+
+ my_button.add_click (create {EVENT_HANDLER}.make (Current, $on_my_button_clicked ))
+associates a click to my_button to the feature
+ {WINFORMS_MESSAGE_BOX}.show (msg)
+
+with the text contained in
+ msg := "Text is : '"
+ msg.append (my_text_box.text)
+ msg.append ("'")
+
+
+This sample uses the following classes:
+* "Hello world" with the inherited feature
+ set_text ("Hello world")
+
+
+The application is launched in a
+ {WINFORMS_APPLICATION}.run_form (Current).
+
+
+This sample uses the following classes:
+*
+ on_paint (paint_dc: WEL_PAINT_DC; invalid_rect: WEL_RECT)
+ --Draw a centered text
+ do
+ end
+
+
+
+An on_paint message corresponds to the Wm_paint message generated by Windows whenever it needs to re-paint a window, and if you look at the feature, you can see that the arguments are a [[ref:libraries/wel/reference/wel_paint_dc_chart|WEL_PAINT_DC]] and a[[ref:libraries/wel/reference/wel_rect_chart| WEL_RECT]] . which are relevant to this message. By redefining this feature (and others as required), your code will be able to respond appropriately to windows events.
+{{note|See [[Tutorial Step 2|step2]] in the [[WEL Tutorial|tutorial]] for a simple demonstration involving the re-definition of on_" message hook defined in WEL. If you wish to process a Windows message that does not correspond to one of the available features, you will need to redefine process_message.
+}}
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/index.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/index.wiki
new file mode 100644
index 00000000..4cc93b43
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|WEL Common Concepts]]
+[[Property:weight|0]]
+[[Property:uuid|f2486cae-0ce5-7360-d40f-aea5f2766ebd]]
+WEL concepts you should understand.
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/inheriting-wel-application.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/inheriting-wel-application.wiki
new file mode 100644
index 00000000..5563d13e
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/inheriting-wel-application.wiki
@@ -0,0 +1,9 @@
+[[Property:title|Inheriting WEL_APPLICATION]]
+[[Property:weight|1]]
+[[Property:uuid|e6b092c9-dfb1-7bf1-67fc-647d047b6a01]]
+For most WEL applications that you write, you will need to inherit [[ref:libraries/wel/reference/wel_application_chart|WEL_APPLICATION]] .
+
+{{note|. See [[Tutorial Step 1|step1]] in the [[WEL Tutorial|tutorial]] for a simple demonstration of how to do this }}
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/redefining-init-application.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/redefining-init-application.wiki
new file mode 100644
index 00000000..530356b9
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-common-concepts/redefining-init-application.wiki
@@ -0,0 +1,5 @@
+[[Property:title|Redefining `init_application']]
+[[Property:weight|2]]
+[[Property:uuid|95d9b971-7470-9191-3023-b99c22354e8f]]
+[[ref:libraries/wel/reference/wel_application_chart|WEL_APPLICATION]] contains a feature set_buddy_window, a window of type [[ref:libraries/wel/reference/wel_window_chart|WEL_WINDOW]] can be linked to this control, and is commonly used to display the current value.
+==Appearance==
+[[Image:wel-up-down-control|wel_up_down_control]]
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-interface-content/controls-cluster/wel-group-box.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-interface-content/controls-cluster/wel-group-box.wiki
new file mode 100644
index 00000000..7d30bc7f
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-interface-content/controls-cluster/wel-group-box.wiki
@@ -0,0 +1,10 @@
+[[Property:title|WEL_GROUP_BOX]]
+[[Property:weight|2]]
+[[Property:uuid|9ef874da-4d1f-b3f4-9645-9b50b1718daf]]
+A [[ref:libraries/wel/reference/wel_group_box_chart|WEL_GROUP_BOX]] is used to enclose other controls, and certain controls such as a [[WEL_RADIO_BUTTON|WEL_RADIO_BUTTON]] have special behavior when parented in a [[ref:libraries/wel/reference/wel_group_box_chart|WEL_GROUP_BOX]] .
+
+==Appearance==
+[[Image:wel-group-box|wel_group_box]]
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-interface-content/controls-cluster/wel-list-view.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-interface-content/controls-cluster/wel-list-view.wiki
new file mode 100644
index 00000000..fabd2f3c
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-interface-content/controls-cluster/wel-list-view.wiki
@@ -0,0 +1,19 @@
+[[Property:title|WEL_LIST_VIEW]]
+[[Property:weight|3]]
+[[Property:uuid|730f6b22-f858-816f-090e-c32ec1bebfd9]]
+A [[ref:libraries/wel/reference/wel_list_view_chart|WEL_LIST_VIEW]] control is an encapsulation of the Windows List View control and provides several ways of displaying a collection of items. Each item can consist of a text and an icon. Certain styles allow additional information to be displayed in columns to the right of the icon and label.
+==Appearance==
+A [[ref:libraries/wel/reference/wel_list_view_chart|WEL_LIST_VIEW]] with the Lvs_report style. MAIN_WINDOW inherits [[ref:libraries/wel/reference/wel_mdi_frame_window_chart|WEL_MDI_FRAME_WINDOW]] and redefines on_menu_command to handle the menu selections. CHILD_WINDOW inherits [[ref:libraries/wel/reference/wel_mdi_child_window_chart|WEL_MDI_CHILD_WINDOW]] and implements make to load a named bitmap, while on_paint has been redefined to re-draw the bitmap. A [[ref:libraries/wel/reference/wel_open_file_dialog_chart|WEL_OPEN_FILE_DIALOG]] is used to select files for viewing.
+This sample contains the following classes:
+* BMP_VIEW
+* MAIN_WINDOW
+* CHILD_WINDOW
+* APPLICATION_IDS
+
+{{seealso|MAIN_WINDOW inherit [[ref:libraries/wel/reference/wel_frame_window_chart|WEL_FRAME_WINDOW]] and contains code for generating their output. BRUSHES_DEMO redefines idle_action to force a re-draw on the applicable windows.
+{{note|If enable_idle_action is not called, then idle_action is never executed. }}
+
+This sample contains the following classes:
+* APPLICATION_IDS
+* BRUSH_DEMO
+* BRUSHES_DEMO
+* DEMO_3D
+* MAIN_WINDOW
+* PROJECTION
+* RECTANGLE_DEMO
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/commands.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/commands.wiki
new file mode 100644
index 00000000..0bfb80d6
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/commands.wiki
@@ -0,0 +1,34 @@
+[[Property:title|Commands]]
+[[Property:weight|-12]]
+[[Property:uuid|e1942cb8-02df-352e-061c-2c87c280ead8]]
+[[Image:commands|commands]] MAIN_DIALOG inherits [[ref:libraries/wel/reference/wel_main_dialog_chart|WEL_MAIN_DIALOG]] which provides the feature put_command, used to associate a [[ref:libraries/wel/reference/wel_command_chart|WEL_COMMAND]] to a Windows message received by the window. A [[ref:libraries/wel/reference/wel_command_chart|WEL_COMMAND]] contains a deferred feature, execute which is executed when the command is fired. SHOW_COMMAND_INFORMATION, SHOW_MOUSE_BUTTON_INFORMATION and SHOW_MOVE_INFORMATION all inherit [[ref:libraries/wel/reference/wel_command_chart|WEL_COMMAND]] .
+{{note|execute has an argument of type ANY which is used to pass any additional information required. }}
+
+This sample contains the following classes:
+* APPLICATION_IDS
+* COMMANDS_DEMO
+* MAIN_DIALOG
+* SHOW_COMMAND_INFORMATION
+* SHOW_MOUSE_BUTTON_INFORMATION
+* SHOW_MOVE_INFORMATION
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/common-controls.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/common-controls.wiki
new file mode 100644
index 00000000..05eed728
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/common-controls.wiki
@@ -0,0 +1,33 @@
+[[Property:title|Common Controls]]
+[[Property:weight|-13]]
+[[Property:uuid|d50d633a-2ba5-995e-637c-6694cee8bf55]]
+[[Image:comctrls|comctrls]] on_notify has been redefined to handle the Ttn_needtext notification which is posted by a control, and received by the controls parent, when a control needs to display a tooltip. The feature on_menu_select has been redefined to output the text of the selected menu item in the [[ref:libraries/wel/reference/wel_status_window_chart|WEL_STATUS_WINDOW]] located at the bottom of MAIN_WINDOW.
+This sample contains the following classes:
+* APPLICATION_IDS
+* MAIN_WINDOW
+* COMCTRLS_DEMO
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/controls-sample.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/controls-sample.wiki
new file mode 100644
index 00000000..99ab2ae5
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/controls-sample.wiki
@@ -0,0 +1,44 @@
+[[Property:title|Controls Sample]]
+[[Property:weight|-11]]
+[[Property:uuid|7f9a091f-61af-9ea2-18c3-469573ba14f3]]
+[[Image:controls|controls]] MAIN_WINDOW to perform the appropriate actions.
+This sample contains the following classes:
+* APPLICATION_IDS
+* CONTROLS
+* MAIN_WINDOW
+
+{{seealso|CTLCOLOR_DEMO
+* MAIN_WINDOW
+* MY_BUTTON
+* PRECOMP_MAIN_WINDOW
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/cursors.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/cursors.wiki
new file mode 100644
index 00000000..a292722d
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/cursors.wiki
@@ -0,0 +1,34 @@
+[[Property:title|Cursors]]
+[[Property:weight|-9]]
+[[Property:uuid|2f1abcdd-182f-3fdf-27b9-861d1c2e2167]]
+[[Image:cursors|cursors]] Project -> Freeze..." to freeze the project. This is necessary to include the compiled resource (.rc) file.
+
+==Running==
+
+After launching the program, a window will be displayed as illustrated above. Selecting one of the cursor types from the "Cursors" menu will cause the selected cursor to be displayed when the mouse pointer is over the client area of the window.
+
+==Under the Hood==
+
+The feature on_menu_command has been redefined in MAIN_WINDOW to create the appropriate cursor when a menu selection is made, while on_set_cursor has been redefined to update the style of the displayed cursor.
+
+This sample contains the following classes:
+* CURSORS_DEMO
+* MAIN_WINDOW
+* APPLICATION_IDS
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/disk-space.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/disk-space.wiki
new file mode 100644
index 00000000..e79c0ed9
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/disk-space.wiki
@@ -0,0 +1,31 @@
+[[Property:title|Disk Space]]
+[[Property:weight|-8]]
+[[Property:uuid|09c90710-45c8-f674-376c-30ed0da738cd]]
+[[Image:diskspace|diskspace]] DISCSPACE_DEMO contains a once feature, diskspace which returns an instance of [[ref:libraries/wel/reference/wel_disk_space_chart|WEL_DISK_SPACE]] , used to query the local drives.
+
+This sample contains only one class:
+* DISKSPACE_DEMO
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/fontenum.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/fontenum.wiki
new file mode 100644
index 00000000..fd5b2b74
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/fontenum.wiki
@@ -0,0 +1,33 @@
+[[Property:title|Fontenum]]
+[[Property:weight|-7]]
+[[Property:uuid|7dbb5e5c-3e00-e4f6-9fc6-29ba4f2476d9]]
+[[Image:fontenum|fontenum]] MAIN_DIALOG inherits from [[ref:libraries/wel/reference/wel_main_dialog_chart|WEL_MAIN_DIALOG]] and also WEL_FONT_FAMILY_ENUMERATOR. MAIN_DIALOG implements action which was deferred from WEL_FONT_ENUMERATOR and executed every an enumeration finds a new font. This new implementation is used to display the available fonts in the [[ref:libraries/wel/reference/wel_list_view_chart|WEL_LIST_VIEW]]
+
+This sample contains the following classes:
+* APPLICATION_IDS
+* FONTENUM_DEMO
+* MAIN_DIALOG
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/fun.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/fun.wiki
new file mode 100644
index 00000000..cb5bf3aa
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/fun.wiki
@@ -0,0 +1,32 @@
+[[Property:title|Fun]]
+[[Property:weight|-6]]
+[[Property:uuid|ad05362e-76a3-db98-a58d-d49f9f2b5f2a]]
+[[Image:fun|fun]] FUN_DIALOG and ARTIST redefine on_mouse_move to track the actions of the mouse pointer and respond accordingly.
+This sample contains the following classes:
+* APPLICATION_IDS
+* ARTIST
+* FUN_DEMO
+* FUN_DIALOG
+* MAIN_WINDOW
+* MAZE
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/header-control.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/header-control.wiki
new file mode 100644
index 00000000..b6a3b73f
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/header-control.wiki
@@ -0,0 +1,34 @@
+[[Property:title|Header Control]]
+[[Property:weight|-5]]
+[[Property:uuid|9b2bee5f-8676-4f9f-c6e0-e00b44b3bef4]]
+[[Image:header-ctrl|header_ctrl]] HEADER_CONTROL inherits [[ref:libraries/wel/reference/wel_header_control_chart|WEL_HEADER_CONTROL]] and redefines many of the `on_` notification features to display the output.
+
+This sample contains the following classes:
+* APPLICATION_IDS
+* HEADER_CONTROL
+* HEADER_CONTROL_DEMO
+* MAIN_WINDOW
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/hello-world.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/hello-world.wiki
new file mode 100644
index 00000000..4be0d825
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/hello-world.wiki
@@ -0,0 +1,45 @@
+[[Property:title|Hello World!]]
+[[Property:weight|-4]]
+[[Property:uuid|37b82651-78e9-dd6a-97bf-0fe3c444157d]]
+[[Image:hello|hello]]
+ on_paint (paint_dc: WEL_PAINT_DC; invalid_rect: WEL_RECT)
+ --Draw a centered text
+ do
+ paint_dc.draw_centered_text("Hello, World!", client_rect)
+ end
+
+
+{{note|If you look at MAIN_WINDOW, you will see that it contains many features. However, nearly all of these are features are inherited from WEL_FRAME_WINDOW. }}
+
+This sample contains the following classes:
+* HELLO_DEMO
+* MAIN_WINDOW
+
+
+{{seealso|LISTVIEW_DEMO redefines init_application in order to load the [[ref:libraries/wel/reference/wel_common_controls_dll_chart|WEL_COMMON_CONTROLS_DLL]] and the [[ref:libraries/wel/reference/wel_rich_edit_dll_chart|WEL_RICH_EDIT_DLL]] .
+
+LISTVIEW redefines many of the `on_` features inherited from [[ref:libraries/wel/reference/wel_list_view_chart|WEL_LIST_VIEW]] in order to generate output for the user.
+
+The style of the LISTVIEW_DEMO is changed by calling set_style with the required new style.
+
+This sample contains the following classes:
+* LISTVIEW
+* MAIN_WINDOW
+* LISTVIEW_DEMO
+* APPLICATION_IDS
+
+{{seealso|MAIN_WINDOW redefines many features from [[ref:libraries/wel/reference/wel_frame_window_chart|WEL_FRAME_WINDOW]] . The feature draw_zoom_rectangle is used to display the output and on_menu_command handles the notifications sent to the window when a menu_selection has been made.
+
+This sample contains the following classes:
+* APPLICATION_IDS
+* MAIN_WINDOW
+* MAGNIFY_DEMO
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/mdi-multiple-document-interface.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/mdi-multiple-document-interface.wiki
new file mode 100644
index 00000000..e9acc377
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/mdi-multiple-document-interface.wiki
@@ -0,0 +1,32 @@
+[[Property:title|MDI (Multiple Document Interface)]]
+[[Property:weight|-1]]
+[[Property:uuid|e5f4b1d5-31a1-51a3-46ea-3cf70a4b40d7]]
+[[Image:mdi--mdi|mdi]] MAIN_WINDOW inherits [[ref:libraries/wel/reference/wel_mdi_frame_window_chart|WEL_MDI_FRAME_WINDOW]] to provide the multiple document interface behavior while each child window is of type [[ref:libraries/wel/reference/wel_mdi_child_window_chart|WEL_MDI_CHILD_WINDOW]] . When "Close" is selected from the "File" menu, the feature active_window from [[ref:libraries/wel/reference/wel_mdi_frame_window_chart|WEL_MDI_FRAME_WINDOW]] is used to select the window that must be closed.
+This sample contains the following classes:
+* APPLICATION_IDS
+* MAIN_WINDOW
+* MDI_DEMO
+
+{{seealso|MINIMAL_DEMO inherits [[ref:libraries/wel/reference/wel_application_chart|WEL_APPLICATION]] and redefines main_window in order to display a [[ref:libraries/wel/reference/wel_frame_window_chart|WEL_FRAME_WINDOW]] .
+This sample contains only one class:
+* MINIMAL_DEMO
+
+
+{{seealso|MAIN_WINDOW inherits [[ref:libraries/wel/reference/wel_frame_window_chart|WEL_FRAME_WINDOW]] while DIALOG inherits [[ref:libraries/wel/reference/wel_modal_dialog_chart|WEL_MODAL_DIALOG]] . DIALOG demonstrates the use of a selection of common controls to build a custom user interface.
+This sample contains the following classes:
+* APPLICATION_IDS
+* DIALOG
+* MAIN_WINDOW
+* PIZZA_DEMO
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/printer.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/printer.wiki
new file mode 100644
index 00000000..8d36f706
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/printer.wiki
@@ -0,0 +1,34 @@
+[[Property:title|Printer]]
+[[Property:weight|3]]
+[[Property:uuid|ee50d48e-4f39-adbc-1f69-1f9d9ef6e101]]
+[[Image:printer|printer]] MAIN_WINDOW inherits [[ref:libraries/wel/reference/wel_frame_window_chart|WEL_FRAME_WINDOW]] and the feature on_paint has been redefined to display the output in the client area. A [[WEL_PRINT_DIALOG|WEL_PRINT_DIALOG]] is used to retrieve the print options before the printing occurs through the interface provided by a [[ref:libraries/wel/reference/wel_printer_dc_chart|WEL_PRINTER_DC]] .
+This sample contains the following classes:
+* APPLICATION_IDS
+* MAIN_WINDOW
+* PRINTER_DEMO
+
+{{seealso|WEL_SPLIT_AREA was created for this sample to illustrate how new controls can be built when required. Redefining some of the `on_` features inherited from [[ref:libraries/wel/reference/wel_window_chart|WEL_WINDOW]] in WEL_SPLIT_AREA shows how the control over the contents of the split area is achieved.
+
+This sample contains the following classes:
+* APPLICATION
+* SPLIT_AREA_DEMO
+* WEL_SPLIT_AREA
+
+
+{{seealso|on_menu_command has been redefined in MAIN_WINDOW to display a different standard dialog when each of the menu items is selected.
+This sample contains the following classes:
+* APPLICATION_IDS
+* MAIN_WINDOW
+* STDDLG_DEMO
+
+{{seealso|on_timer feature is called every time a timer interval is reached with an argument corresponding to the id of the timer. Within MAIN_WINDOW, on_timer has been redefined to update the appearance of the hatched areas.
+This sample contains the following classes:
+* APPLICATION_IDS
+* MAIN_WINDOW
+* TIMER
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/tree-view-sample.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/tree-view-sample.wiki
new file mode 100644
index 00000000..4120bee0
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/tree-view-sample.wiki
@@ -0,0 +1,37 @@
+[[Property:title|Tree View Sample]]
+[[Property:weight|8]]
+[[Property:uuid|31c64f11-3aa4-cfff-b9f3-09027acfc143]]
+[[Image:tree-view--tree-view|tree_view]] TREEVIEW inherits [[ref:libraries/wel/reference/wel_tree_view_chart|WEL_TREE_VIEW]] and redefines make to initialize items within the tree. A [[ref:libraries/wel/reference/wel_tree_view_insert_struct_chart|WEL_TREE_VIEW_INSERT_STRUCT]] is used to insert each [[ref:libraries/wel/reference/wel_tree_view_item_chart|WEL_TREE_VIEW_ITEM]] while a [[ref:libraries/wel/reference/wel_image_list_chart|WEL_IMAGE_LIST]] is used to reference images within the tree.
+This sample contains the following classes:
+* TREEVIEW
+* MAIN_WINDOW
+* TREEVIEW_DEMO
+* APPLICATION_IDS
+
+{{seealso|MAIN_WINDOW class used for all the controls. The feature init_locale_list is used to determine the systems available input locales and populate the corresponding "Input Locales" combo box. The features 'change_font' and 'change_control' are used to change the applications font (in case the currently selected font does not correctly display Unicode characters), and to set the text property of all controls to the same as that in the rich-edit box.
+This sample contains the following classes:
+* UNICODE_DEMO
+* MAIN_WINDOW
+* DISPLAY_TEXT
+* APPLICATION_IDS
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/wel-sample-menus.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/wel-sample-menus.wiki
new file mode 100644
index 00000000..522d066e
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/wel-sample-menus.wiki
@@ -0,0 +1,28 @@
+[[Property:title|Wel Sample: Menus]]
+[[Property:weight|0]]
+[[Property:uuid|9cd62273-3624-fc6c-44d5-c42150d9b684]]
+[[Image:menus|menus]] MAIN_WINDOW
+* MENUS_DEMO
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/windows-sample.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/windows-sample.wiki
new file mode 100644
index 00000000..00d87ef9
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/windows-sample.wiki
@@ -0,0 +1,36 @@
+[[Property:title|Windows Sample]]
+[[Property:weight|10]]
+[[Property:uuid|3ace1338-c85b-c7d8-faaf-52e9fb4e157e]]
+[[Image:windows|windows]] ON_OFF_CONTROL control displayed. Clicking on this control will cause its state to change. If you select one of the options from the "Windows" menu, that type of window will be displayed.
+==Under the Hood==
+
+The ON_OFF_CONTROL inherits [[ref:libraries/wel/reference/wel_control_window_chart|WEL_CONTROL_WINDOW]] and demonstrates how to build your controls. The classes MODAL and MODELESS inherit [[ref:libraries/wel/reference/wel_modal_dialog_chart|WEL_MODAL_DIALOG]] and [[ref:libraries/wel/reference/wel_modeless_dialog_chart|WEL_MODELESS_DIALOG]] respectively.
+
+This sample contains the following classes:
+* APPLICATION_IDS
+* MAIN_WINDOW
+* MODAL
+* MODELESS
+* ON_OFF_CONTROL
+* WINDOWS_DEMO
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/xcell.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/xcell.wiki
new file mode 100644
index 00000000..2e864281
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/xcell.wiki
@@ -0,0 +1,36 @@
+[[Property:title|Xcell]]
+[[Property:weight|11]]
+[[Property:uuid|b48ed2d1-d91f-e288-5705-7a6bfa612c29]]
+[[Image:xcell|xcell]] APP_CONSTANTS
+* CARD
+* COLUMN
+* GAME
+* GAME_CONSTANTS
+* GAME_MANAGER
+* MAIN_WINDOW
+* SELECT_GAME_NUMBER_DIALOG
+* SELECT_NUMBER_OF_CARDS_DIALOG
+* XCELL_DEMO
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/xy-co-ordinates.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/xy-co-ordinates.wiki
new file mode 100644
index 00000000..c85b8c5d
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-samples/xy-co-ordinates.wiki
@@ -0,0 +1,35 @@
+[[Property:title|XY Co-ordinates]]
+[[Property:weight|12]]
+[[Property:uuid|f0b46125-2954-1504-0f47-c023462957f3]]
+[[Image:xy|xy]] on_left_button_down which has been redefined in MAIN_WINDOW.
+
+This sample contains the following classes:
+* XY_DEMO
+* MAIN_WINDOW
+
+
+{{seealso|main_window
+
+{{seealso|on_left_button_down has been redefined from [[ref:libraries/wel/reference/wel_window_chart|WEL_WINDOW]] to display a [[ref:libraries/wel/reference/wel_msg_box_chart|WEL_MSG_BOX]] containing notification of the event occurring.
+
+If you look at closeable from MAIN_WINDOW, you will see that it has been redefined to display a [[ref:libraries/wel/reference/wel_msg_box_chart|WEL_MSG_BOX]] and the result from this message box is used to generate the return value of closeable. If this Result is True, the window will be closed.
+This sample contains the following classes:
+* TUTORIAL_STEP2
+* MAIN_WINDOW
+
+
+{{seealso|MAIN_WINDOW. The output is shown below:
+
+[[Image:step3|step3]] MAIN_WINDOW. Using this DC, it is a simple step to output the position of the mouse which is provided as arguments to on_left_button_down.
+
+on_right_button_down has also been redefined to call invalidate which clears the client area of the window.
+This sample contains the following classes:
+* TUTORIAL_STEP3
+* MAIN_WINDOW
+
+
+{{seealso|TUTORIAL_STEP4
+* MAIN_WINDOW
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-5.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-5.wiki
new file mode 100644
index 00000000..9a44a94b
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-5.wiki
@@ -0,0 +1,36 @@
+[[Property:title|Tutorial Step 5]]
+[[Property:weight|4]]
+[[Property:uuid|05145328-5d2a-4d48-68cc-746ddf66b68f]]
+The sample builds on tutorial [[Tutorial Step 4|step 4]] and also demonstrates the use of a [[ref:libraries/wel/reference/wel_modal_dialog_chart|WEL_MODAL_DIALOG]] . The output is shown below:
+
+[[Image:step5|step5]] LINE_THICKNESS_DIALOG inherits [[ref:libraries/wel/reference/wel_modal_dialog_chart|WEL_MODAL_DIALOG]] and uses a WEL_SINGLE_LINE_EDIT to input the desired line width.
+This sample contains the following classes:
+* TUTORIAL_STEP5
+* MAIN_WINDOW
+* LINE_THICKNESS_DIALOG
+* APPLICATION_IDS
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-6.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-6.wiki
new file mode 100644
index 00000000..e16337ba
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-6.wiki
@@ -0,0 +1,38 @@
+[[Property:title|Tutorial Step 6]]
+[[Property:weight|5]]
+[[Property:uuid|90d557e1-c4a6-e6ff-ff19-95a44c99f0ae]]
+This sample builds on tutorial [[Tutorial Step 5|step 5]] by preventing the loss of the drawing when Windows re-draws the client area of the [[ref:libraries/wel/reference/wel_frame_window_chart|WEL_FRAME_WINDOW]] . The output is shown below:
+
+[[Image:step6|step6]] LINKED_LIST of LINES is used to store all the lines that have been drawn and during on_paint, this list is traversed in order to re-draw each line.
+This sample contains the following classes:
+* TUTORIAL_STEP6
+* MAIN_WINDOW
+* LINE_THICKNESS_DIALOG_CHART
+* APPLICATION_IDS
+* POINT
+* LINE
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-7.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-7.wiki
new file mode 100644
index 00000000..133e1529
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-7.wiki
@@ -0,0 +1,38 @@
+[[Property:title|Tutorial Step 7]]
+[[Property:weight|6]]
+[[Property:uuid|751a492d-6902-838e-7468-38b67e40f4e2]]
+This sample builds on tutorial [[Tutorial Step 6|step 6]] , and also demonstrates the use of a [[ref:libraries/wel/reference/wel_menu_chart|WEL_MENU]] . The output is shown below:
+
+[[Image:step7|step7]] MAIN_WINDOW, the menu is assigned to the window and on_menu_command is redefined to allow processing of the menu selections.
+
+This sample contains the following classes:
+* TUTORIAL_STEP7
+* MAIN_WINDOW
+* LINE_THICKNESS_DIALOG_CHART
+* APPLICATION_IDS
+* POINT
+* LINE
+
+
+
+
+
diff --git a/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-8.wiki b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-8.wiki
new file mode 100644
index 00000000..f52d2690
--- /dev/null
+++ b/documentation/18.11/solutions/platform-specifics/microsoft-windows/wel/wel-tutorial/tutorial-step-8.wiki
@@ -0,0 +1,41 @@
+[[Property:title|Tutorial Step 8]]
+[[Property:weight|7]]
+[[Property:uuid|38c3a22d-2c15-cb68-a685-99a25d191885]]
+This sample builds on tutorial [[Tutorial Step 7|step 7]] , and also demonstrates the use of a [[ref:libraries/wel/reference/wel_open_file_dialog_chart|WEL_OPEN_FILE_DIALOG]] and a [[ref:libraries/wel/reference/wel_save_file_dialog_chart|WEL_SAVE_FILE_DIALOG]] . The output is shown below:
+
+[[Image:step8|step8]] on_menu_command. A new class, LINES is now used to store the lines drawn by the user and this inherits [[ref:libraries/base/reference/storable_chart|STORABLE]] which allows it to be easily stored and retrieved.
+This sample contains the following classes:
+* TUTORIAL_STEP6
+* MAIN_WINDOW
+* LINE_THICKNESS_DIALOG_CHART
+* APPLICATION_IDS
+* POINT
+* LINES
+* LINE
+
+{{seealso|
+ new_integer_preference_value (a_manager: PREFERENCE_MANAGER; a_name: STRING; a_fallback_value: INTEGER): INTEGER_PREFERENCE
+ -- Add a new integer preference with name `a_name'. If preference cannot be found in
+ -- underlying datastore or in a default values then `a_fallback_value' is used for the value.
+ require
+ name_valid: a_name /= Void
+ name_not_empty: not a_name.is_empty
+ not_has_preference: not a_manager.known_preference (a_name)
+ ensure
+ has_result: Result /= Void
+ preference_name_set: Result.name.is_equal (a_name)
+ preference_added: a_manager.preferences.has_preference (a_name)
+ end
+
+An appropriate example in code of this could be:
+
+
+ window_width_preference: INTEGER_PREFERENCE
+ -- Preference holding value for width of application main window
+
+ initialize_my_preferences
+ -- Initialize the application preferences
+ local
+ factory: BASIC_PREFERENCE_FACTORY
+ do
+ create factory
+ window_width_preference := factory.new_integer_preference_value (my_manager, "window_width", 480)
+ end
+This will create a new preference, which you can then use in your application to get, set and save the corresponding value when necessary. The issue to be aware of here though involves the value that the preference will contain when it is created. You see in the code above we pass the integer value 480. '''This does not mean, however, the initial value of the preference will be 480'''. This may sound odd, so let me explain...
+The value of a preference when initialized is determined by a number of factors. The first of these is the underlying data store value. If a preference value was changed in a previous session, by the user or by the application directly, and was saved to the underlying data store, then this value will be given priority. This makes sense, since if a user changes their preferences they don't want to have to do it every time they use your program. So, if they want the default window width to be larger, say 600, then this will be the value of the preference named "window_width" when initialized next time. Following this, if there is no previously saved value then the library will look for a default value to use. If a default file was given when the preferences were created (see above), and this default specifies a default value of 240 for the integer preference called "window_width", then this will be used. Finally, if no preference value was previously stored ''and'' no value is provided as a default value then the supplied value in the code is used - our 480 value from the example above. Although this process may seem confusing it is infact very simple and intuitive way to initialze the preferences. The process chart below illustrates more clearly the various permutations.
+
+[[Image:value-chart]]
+
+==Using and Manipulating Preferences==
+
+Now you have preferences created you may use them from your application. Using the example preference above, window_width_preference, you can query the value of the preferences by simply querying the preference directly:
+window_width := window_width_preference.value
+
+Or for a value which should always be associated to the preference:
+
+ window_width: INTEGER
+ -- Width of window
+ do
+ Result := window_width_preference.value
+ end
+
+
+If you need to react when a preference value is changed you can hook up an agent to the window_width_preference.change_actions.extend (agent my_agent_routine)
+
+To manually set the value of the preference call
+ make (a_preferences: PREFERENCES; a_namespace: STRING)
+ -- New manager.
+ require
+ preferences_not_void: a_preferences /= Void
+ namespace_not_void: a_namespace /= Void
+ namespace_not_empty: not a_namespace.is_empty
+ ensure
+ has_preferences: preferences /= Void
+ inserted_in_preferences: preferences.has_manager (namespace)
+ has_namespace: namespace /= Void
+ namespace_valid: not a_namespace.is_empty
+ end
+
+
+You can see in the post-condition
+-- Example of a lexical analyzer based on the Eiffel syntax.
+-- The analyzer itself is found in the file ``eiffel_lex'', which
+-- is created according to the file ``eiffel_token'' if not
+-- previously built and stored.
+
+class EIFFEL_SCAN
+
+inherit
+
+ SCANNING
+ rename
+ make as scanning_make
+ end;
+
+ ARGUMENTS
+ undefine
+ copy, consistent, is_equal, setup
+ end
+
+create
+
+ make
+
+feature
+
+ make
+ -- Create a lexical analyser for Eiffel if none,
+ -- then use it to analyze the file of name
+ -- `file_name'.
+ local
+ file_name: STRING;
+ do
+ if argument_count < 1 then
+ io.error.putstring ("Usage: eiffel_scan eiffel_class_file.e%N")
+ else
+ file_name := argument (1);
+ scanning_make;
+ build ("eiffel_lex", "eiffel_regular");
+ io.putstring ("Scanning file `");
+ io.putstring (file_name);
+ io.putstring ("'.%N");
+ analyze (file_name)
+ end
+ end -- make
+
+end -- class EIFFEL_SCAN
+
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffel-scan-console-output.wiki b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffel-scan-console-output.wiki
new file mode 100644
index 00000000..109ac19c
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffel-scan-console-output.wiki
@@ -0,0 +1,118 @@
+[[Property:title|eiffel_scan console output]]
+[[Property:weight|3]]
+[[Property:uuid|a233d1b0-b964-ba44-7b24-7204d9fa6932]]
+
+Scanning file `eiffel_scan.e'.
+
+
+--------------- LEXICAL ANALYSIS: ----
+
+Token type 11: -- Example of a lexical analyzer based on the Eiffel syntax.
+-- The analyzer itself is found in the file ``eiffel_lex'', which
+-- is created according to the file ``eiffel_token'' if not
+-- previously built and stored.
+
+Keyword: class Code: 1819086195
+Token type 32: EIFFEL_SCAN
+Keyword: inherit Code: 1080299636
+Token type 32: SCANNING
+Keyword: rename Code: 2076787557
+Token type 32: make
+Keyword: as Code: 24947
+Token type 32: scanning_make
+Keyword: end Code: 6647396
+Token type 15: ;
+Token type 32: ARGUMENTS
+Keyword: undefine Code: 1472863845
+Token type 32: copy
+Token type 17: ,
+Token type 32: consistent
+Token type 17: ,
+Token type 32: is_equal
+Token type 17: ,
+Token type 32: setup
+Keyword: end Code: 6647396
+Token type 32: create
+Token type 32: make
+Keyword: feature Code: 1951938661
+Token type 32: make
+Keyword: is Code: 26995
+Token type 11: -- Create a lexical analyser for Eiffel if none,
+ -- then use it to analyze the file of name
+
+Token type 11: -- `file_name'.
+
+Keyword: local Code: 1869613420
+Token type 32: file_name
+Token type 16: :
+Token type 32: STRING
+Token type 15: ;
+Keyword: do Code: 25711
+Keyword: if Code: 26982
+Token type 32: argument_count
+Token type 10: <
+Token type 2: 1
+Keyword: then Code: 1952998766
+Token type 32: io
+Token type 13: .
+Token type 32: error
+Token type 13: .
+Token type 32: putstring
+Token type 20: (
+Token type 3: "Usage: eiffel_scan eiffel_class_file.e%N"
+Token type 21: )
+Keyword: else Code: 1701606245
+Token type 32: file_name
+Token type 18: :=
+Token type 32: argument
+Token type 20: (
+Token type 2: 1
+Token type 21: )
+Token type 15: ;
+Token type 32: scanning_make
+Token type 15: ;
+Token type 32: build
+Token type 20: (
+Token type 3: "eiffel_lex"
+Token type 17: ,
+Token type 3: "eiffel_regular"
+Token type 21: )
+Token type 15: ;
+Token type 32: io
+Token type 13: .
+Token type 32: putstring
+Token type 20: (
+Token type 3: "Scanning file `"
+Token type 21: )
+Token type 15: ;
+Token type 32: io
+Token type 13: .
+Token type 32: putstring
+Token type 20: (
+Token type 32: file_name
+Token type 21: )
+Token type 15: ;
+Token type 32: io
+Token type 13: .
+Token type 32: putstring
+Token type 20: (
+Token type 3: "'.%N"
+Token type 21: )
+Token type 15: ;
+Token type 32: analyze
+Token type 20: (
+Token type 32: file_name
+Token type 21: )
+Keyword: end Code: 6647396
+Keyword: end Code: 6647396
+Token type 11: -- make
+
+Keyword: end Code: 6647396
+Token type 11: -- class EIFFEL_SCAN
+
+Token type -1:
+
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffel-scan-text.wiki b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffel-scan-text.wiki
new file mode 100644
index 00000000..2bb58404
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffel-scan-text.wiki
@@ -0,0 +1,54 @@
+[[Property:title|EIFFEL_SCAN Text]]
+[[Property:weight|1]]
+[[Property:uuid|092bd183-2fc4-ae65-02b9-d66933492a50]]
+
+
+class
+ EIFFEL_SCAN
+
+inherit
+ SCANNING
+ rename
+ make as scanning_make
+ end
+
+ ARGUMENTS
+ undefine
+ copy,
+ consistent,
+ is_equal,
+ setup
+ end
+
+create
+ make
+
+feature
+
+ make
+ -- Create a lexical analyser for Eiffel if none,
+ -- then use it to analyze the file of name
+ -- file_name.
+ local
+ file_name: STRING
+ do
+ if argument_count < 1 then
+ io.error.putstring ("Usage: eiffel_scan eiffel_class_file.e%N")
+ else
+ file_name := argument (1)
+ scanning_make
+ build ("eiffel_lex", "eiffel_regular")
+ io.putstring ("Scanning file `")
+ io.putstring (file_name)
+ io.putstring ("'.%N")
+ analyze (file_name)
+ end
+ end
+
+end -- class EIFFEL_SCAN
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffellex-samples.wiki b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffellex-samples.wiki
new file mode 100644
index 00000000..21389446
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/eiffellex-samples.wiki
@@ -0,0 +1,100 @@
+[[Property:title|EiffelLex Samples]]
+[[Property:weight|0]]
+[[Property:uuid|2e4911de-4838-00fc-1742-a8ebd1ae05ff]]
+
+
+
+Real $R
+Integer $Z
+String ("\"" -> "\"")
+Div "//"
+Mod "\\"
+Quotient '/'
+Product '*'
+Plus '+'
+Minus '-'
+Relational ('=' | '<' | '>' | ('<' '=') | ('>' '=') | ('/' '='))
+Comment ("--" -> "\n") *(' '| '\t') *("--" -> "\n")
+FeatureAddress '$'
+Dot '.'
+Dotdot ".."
+Semicolon ';'
+Colon ':'
+Comma ','
+Assign ":="
+ReverseAssign "?="
+Lparan '('
+Rparan ')'
+Lcurly '{'
+Rcurly '}'
+Lsquare '['
+Rsquare ']'
+Bang '!'
+LeftArray "<<"
+RightArray ">>"
+Power '^'
+Constraint "->"
+Character (('\''$P'\'') | ('\'''\\'['t'|'n'|'r'|'f']'\'') | ('\''+('0'..'7')'\''))
+Identifier ~('a'..'z') *(~('a'..'z') | '_' | ('0'..'9'))
+-- Keywords
+as
+and
+check
+class
+current
+debug
+deferred
+do
+else
+elseif
+end
+ensure
+expanded
+export
+external
+false
+feature
+from
+if
+implies
+indexing
+infix
+inherit
+inspect
+integer
+invariant
+is
+language
+like
+local
+loop
+not
+obsolete
+old
+once
+or
+prefix
+real
+redefine
+require
+rename
+rescue
+result
+retry
+select
+strip
+then
+true
+undefine
+unique
+until
+variant
+void
+when
+xor
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/index.wiki b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/index.wiki
new file mode 100644
index 00000000..881fe0e5
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/eiffel-scanner/index.wiki
@@ -0,0 +1,13 @@
+[[Property:title|Eiffel scanner]]
+[[Property:weight|0]]
+[[Property:uuid|c0d6ad9d-2bac-c5ad-69b6-873db2e47aa9]]
+In the directory '''$ISE_EIFFEL/examples/lex''' you will find a system that scans Eiffel classes. It consists of the class [[EIFFEL_SCAN Text|EIFFEL_SCAN]] . It uses the file [[EiffelLex Samples|eiffel_regular]] as lexical grammar to analyze an Eiffel class passed on the command line.
+
+When compiling the example, the executable '''eiffel_scan(.exe)''' is created. Use the program as follows:
+eiffel_scan ;
+
+As an example, when the [[eiffel_scan console input|source code]] of the root class is run through the scanner, it outputs a [[eiffel_scan console output|list]] of all consecutive tokens and keywords in that class to the console.
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/index.wiki b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/index.wiki
new file mode 100644
index 00000000..e6f45381
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-sample/index.wiki
@@ -0,0 +1,8 @@
+[[Property:title|EiffelLex Sample]]
+[[Property:weight|2]]
+[[Property:uuid|79ad35f3-75a9-429c-ad47-f304fec23306]]
+* [[Eiffel scanner|Eiffel scanner]]
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-tutorial.wiki b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-tutorial.wiki
new file mode 100644
index 00000000..deabeab9
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/eiffellex/eiffellex-tutorial.wiki
@@ -0,0 +1,567 @@
+[[Property:title|EiffelLex Tutorial]]
+[[Property:weight|0]]
+[[Property:uuid|9ea43bef-1483-fbf2-4791-2be6a31d394d]]
+==OVERVIEW==
+
+When analyzing a text by computer, it is usually necessary to split it into individual components or '''tokens'''. In human languages, the tokens are the words; in programming languages, tokens are the basic constituents of software texts, such as identifiers, constants and special symbols.
+
+The process of recognizing the successive tokens of a text is called lexical analysis. This chapter describes the EiffelLex library, a set of classes which make it possible to build and apply lexical analyzers to many different languages.
+
+Besides recognizing the tokens, it is usually necessary to recognize the deeper syntactic structure of the text. This process is called '''parsing''' or '''syntax analysis''' and is studied in the next chapter.
+
+Figure 1 shows the inheritance structure of the classes discussed in this chapter. Class [[ref:libraries/parse/reference/l_interface_chart|L_INTERFACE]] has also been included although we will only study it in the [[EiffelParse Tutorial]]; it belongs to the Parse library, where it takes care of the interface between parsing and lexical analysis.
+
+
+[[Image:figure1]]
+
+Figure 1: Lexical classes
+
+==AIMS AND SCOPE OF THE EIFFELLEX LIBRARY==
+
+To use the EiffelLex library it is necessary to understand the basic concepts and terminology of lexical analysis.
+
+===Basic terminology===
+
+The set of tokens accepted by a lexical analyzer is called a '''lexical grammar'''. For example, the basic constructs of Eiffel (identifiers, keywords, constants, special symbols) constitute a lexical grammar. For reasons that will be clear below, a lexical grammar is also known as a '''regular grammar'''.
+
+A lexical grammar defines a number of '''token types''', such as Identifier and Integer for Eiffel. A token that conforms to the structure defined for a certain token type is called a '''specimen''' of that token type. For example, the token my_identifier, which satisfies the rules for Eiffel tokens, is a specimen of the token type Identifier; 201 is a specimen of the token type Integer.
+
+To define a lexical grammar is to specify a number of token types by describing precisely, for each token type, the form of the corresponding specimens. For example a lexical grammar for Eiffel will specify that Identifier is the token type whose specimens are sequences of one or more characters, of which the first must be a letter (lower-case or upper-case) and any subsequent one is a letter, a digit (0 to 9) or an underscore. Actual grammar descriptions use a less verbose and more formal approach, studied below: regular expressions.
+
+A lexical analyzer is an object equipped with operations that enable it to read a text according to a known lexical grammar and to identify the text's successive tokens.
+
+The classes of the EiffelLex library make it possible to define lexical grammars for many different applications, and to produce lexical analyzers for these grammars.
+
+===Overview of the classes===
+
+For the user of the EiffelLex library, the classes of most direct interest are [[ref:libraries/lex/reference/token_chart|TOKEN]] , [[ref:libraries/lex/reference/lexical_chart|LEXICAL]] , [[ref:libraries/lex/reference/metalex_chart|METALEX]] and [[ref:libraries/lex/reference/scanning_chart|SCANNING]] .
+
+An instance of [[ref:libraries/lex/reference/token_chart|TOKEN]] describes a token read from an input file being analyzed, with such properties as the token type, the corresponding string and the position in the text (line, column) where it was found.
+
+An instance of [[ref:libraries/lex/reference/lexical_chart|LEXICAL]] is a lexical analyzer for a certain lexical grammar. Given a reference to such an instance, say analyzer, you may analyze an input text through calls to the features of class [[ref:libraries/lex/reference/lexical_chart|LEXICAL]] , for example:
+
+ analyzer.get_token
+
+
+Class [[ref:libraries/lex/reference/metalex_chart|METALEX]] defines facilities for building such lexical analyzers. In particular, it provides features for reading the grammar from a file and building the corresponding analyzer. Classes that need to build and use lexical analyzers may be written as descendants of [[ref:libraries/lex/reference/metalex_chart|METALEX]] to benefit from its general-purpose facilities.
+
+Class [[ref:libraries/lex/reference/scanning_chart|SCANNING]] is one such descendant of [[ref:libraries/lex/reference/metalex_chart|METALEX]] . It contains all the facilities needed to build an ordinary lexical analyzer and apply it to the analysis of input texts. Because these facilities are simpler to use and are in most cases sufficient, SCANNING will be discussed first; the finer-grain facilities of [[ref:libraries/lex/reference/metalex_chart|METALEX]] are described towards the end of this chapter.
+
+These classes internally rely on others, some of which may be useful for more advanced applications. [[ref:libraries/lex/reference/lex_builder_chart|LEX_BUILDER]] , one of the supporting classes, will be introduced after [[ref:libraries/lex/reference/metalex_chart|METALEX]] .
+
+===Library example===
+
+The EiffelStudio delivery includes (in the examples/library/lex subdirectory) a simple example using the EiffelLex library classes. The example applies EiffelLex library facilities to the analysis of a language which is none other than Eiffel itself.
+
+The root class of that example,
+ build (store_file_name, grammar_file_name: STRING)
+
+If no file of name store_file_name exists, then grammar_file_name, builds the corresponding lexical analyzer, and stores it into store_file_name.
+
+If there already exists a file of name grammar_file_name, grammar_file_name .
+===Lexical grammar files===
+
+A lexical grammar file (to be used as second argument to grammar_file_name) should conform to a simple structure, of which the file ''eiffel_regular'' in the examples directory provides a good illustration.
+
+Here is the general form:
+
+Token_type_1 Regular_expression_1
+Token_type_2 Regular_expression_2
+...
+Token_type_m Regular_expression_m
+
+
+-- Keywords
+
+Keyword_1
+Keyword_2
+...
+Keyword_n
+
+
+
+In other words: one or more lines, each containing the name of a token type and a '''regular expression'''; a line beginning with two dashes -- (the word '''Keywords''' may follow them to signal that this is the beginning of keywords); and one or more lines containing one keyword each.
+
+Each ''Token_type_i'' is the name of a token type, such as ''Identifier'' or ''Decimal_constant''. Each ''Regular_expression_i'' is a regular expression, built according to a precisely specified format. That format is defined later in this chapter, but even without having seen that definition it is not hard to understand the following small and typical example of lexical grammar file without keywords:
+
+Decimal '0'..'9'
+Natural +('0'..'9')
+Integer ['+'|'-'] '1'..'9' *('0'..'9')
+
+
+The first expression describes a token type whose specimens are tokens made of a single-letter decimal digit (any character between 0 and 9). In the second, the + sign denotes repetition (one or more); the specimens of the corresponding token type are all non-empty sequences of decimal digits - in other words, natural numbers, with leading zeroes permitted. In the third, the | symbol denotes alternation, and the asterisk denotes repetition (zero or more); the corresponding tokens are possibly signed integer constants, with no leading zeroes.
+
+As explained below, keywords are regular expressions which are treated separately for convenience and efficiency. If you are using lexical grammar files of the above form, all keywords must be specimens of the last regular expression given ( ''Regular_expression_m'' above). More details below.
+
+===Using a lexical analyzer===
+
+Once
+ analyze (input_file_name: STRING)
+
+This will read in and process successive input tokens. Procedure
+ analyzer.set_file ("my_file_name")
+
+
+===Creating, retrieving and storing an analyzer===
+
+To create a new analyzer, use
+
+ create analyzer.make_new
+
+
+You may also retrieve an analyzer from a previous session. [[ref:libraries/lex/reference/lexical_chart|LEXICAL]] is a descendant from [[ref:libraries/base/reference/storable_chart|STORABLE]] , so you can use feature retrieved for that purpose. In a descendant of [[ref:libraries/base/reference/storable_chart|STORABLE]] , simply write
+
+ analyzer ?= retrieved
+
+
+If you do not want to make the class a descendant of [[ref:libraries/base/reference/storable_chart|STORABLE]] , use the creation procedure
+ create analyzer.make
+ analyzer ?= analyzer.retrieved
+
+
+===Choosing a document===
+
+To analyze a text, call <, = and <= are all regular expressions in the grammar, the analyzer recognizes <= as one token, rather than < followed by =. You can use
+ from
+ set_file ("text_directory/text_to_be_parsed")
+ -- Or: set_string ("string to parse")
+ begin_analysis
+ until
+ end_of_text
+ loop
+ analyzer.get_token
+ if analyzer.token_type = No_token then
+ go_on
+ end
+ do_a_token (lexical.last_token)
+ end
+ end_analysis
+
+
+This scheme is used by procedure
+ '0'..'9'
+
+
+ "A Text"
+
+
+More generally, a string is written "a1 a2 ... an" for ''n >= 0'', where the "ai" are characters, and is an abbreviation for the concatenation 'a1' 'a2' ... 'an', representing a set containing a single token. In a string, the double quote character " is written \" and the backslash character \ is written \\. No other special characters are permitted; if you need special characters, use explicit concatenation. As a special case, "" represents the set containing a single empty token.
+
+A union, written exp1 | exp2 | ... | expn, describes the set of tokens which are specimens of exp1, or of exp2, etc. For example, the union ''('a'..'z') | ('A'..'Z')'' describes the set of single-letter tokens (lower-case or upper-case).
+
+===Predefined expressions===
+
+A joker, written '''$?''', describes the set of all tokens made of exactly one character. A joker is considered to be an interval expression, so that it may be the first operand of a difference operation.
+
+A printable, written '''$P''', describes the set of all tokens made of exactly one printable character.
+
+A blank, written '''$B''', describes the set of all tokens made of one or more specimens of the characters blank, new-line, carriage-return and tabulation.
+
+The following non-elementary forms are abbreviations for commonly needed regular expressions:
+{| border="1"
+|-
+| Code
+| Equivalent expression
+| Role
+|-
+| '''$L'''
+| '' '\n' ''
+| New-line character
+|-
+| '''$N'''
+| ''+('0'..'9')''
+| Natural integer constants
+|-
+| '''$R'''
+| '' class and Result.
+{{note|in Eiffel terminology reserved words include keywords; a keyword is a marker playing a purely syntactical role, such as class. Predefined entities and expressions such as Result and Current, which have an associated value, are considered reserved words but not keywords. The present discussion uses the term "keyword" although it can be applied to all reserved words. }}
+
+In principle, keywords could be handled just as other token types. In Eiffel, for example, one might treat each reserved words as a token type with only one specimen; these token types would have names such as Class or Then and would be defined in the lexical grammar file:
+
+''Class'' ''''c' 'l' 'a' 's' 's''''
+ ... Other token type definitions ...
+Identifier ~('a'..'z') *(~('a'..'z') | '_' | ('0'..'9'))
+
+-- Keywords
+alias
+all
+and
+as
+BIT
+BOOLEAN
+... Other reserved words ...
+
+
+{{caution|Every keyword in the keyword section must be a specimen of one of the token types defined for the grammar, and that token type must be the last one defined in the lexical grammar file, just before the '''Keywords''' line. So in Eiffel where the keywords have the same lexical structure as identifiers, the last line before the keywords must be the definition of the token type ''Identifier'', as shown above. }}
+
+{{note|The rule that all keywords must be specimens of one token type is a matter of convenience and simplicity, and only applies if you are using SCANNING and lexical grammar files. There is no such restriction if you rely directly on the more general facilities provided by [[ref:libraries/lex/reference/metalex_chart|METALEX]] or [[ref:libraries/lex/reference/lex_builder_chart|LEX_BUILDER]] . Then different keywords may be specimens of different regular expressions; you will have to specify the token type of every keyword, as explained later in this chapter. }}
+
+===Case sensitivity===
+
+By default, letter case is not significant for regular expressions and keywords. So if ''yes'' matches a token type defined by a regular expression, or is a keyword, the input values ''Yes'', ''yEs'' and ''yES'' will all yield the same token or keyword. This also means that '' 'a'..'z' '' and '' 'a'..'z' | 'A'..'Z' '' describe the same set of tokens.
+
+The regular expression syntax introduced above offers a special notation to specify that a particular expression is case-sensitive: ''~exp'', where ''exp'' is a regular expression. For example, ''~('A'..'Z')'' only covers single-upper-case-letter tokens. But for all other kinds of expression letter case is not taken into account.
+
+You may change this default behavior through a set of procedures introduced in class [[ref:libraries/lex/reference/lex_builder_chart|LEX_BUILDER]] and hence available in its descendants [[ref:libraries/lex/reference/metalex_chart|METALEX ]] and [[ref:libraries/lex/reference/scanning_chart|SCANNING]] .
+
+To make subsequent regular expressions case-sensitive, call the procedure
+
+ distinguish_case
+
+
+To revert to the default mode where case is not significant, call the procedure
+
+ ignore_case
+
+
+Each of these procedures remains in effect until the other one is called, so that you only need one call to define the desired behavior.
+
+For keywords, the policy is less tolerant. A single rule is applied to the entire grammar: keywords are either all case-sensitive or all case-insensitive. To make all keywords case-sensitive, call
+
+ keywords_distinguish_case
+
+
+The inverse call, corresponding to the default rule, is
+
+ keywords_ignore_case
+
+
+Either of these calls must be executed before you define any keywords; if you are using [[ref:libraries/lex/reference/scanning_chart|SCANNING]] , this means before calling procedure build. Once set, the keyword case-sensitivity policy cannot be changed.
+
+==USING METALEX TO BUILD A LEXICAL ANALYZER==
+
+(You may skip the rest of this chapter if you only need simple lexical facilities.)
+
+Class [[ref:libraries/lex/reference/scanning_chart|SCANNING]] , as studied above, relies on a class [[ref:libraries/lex/reference/metalex_chart|METALEX]] . In some cases, you may prefer to use the features of [[ref:libraries/lex/reference/metalex_chart|METALEX]] directly. Since [[ref:libraries/lex/reference/scanning_chart|SCANNING]] inherits from [[ref:libraries/lex/reference/metalex_chart|METALEX]] , anything you do with [[ref:libraries/lex/reference/metalex_chart|METALEX]] can in fact be done with [[ref:libraries/lex/reference/scanning_chart|SCANNING]] , but you may wish to stay with just [[ref:libraries/lex/reference/metalex_chart|METALEX]] if you do not need the additional features of [[ref:libraries/lex/reference/scanning_chart|SCANNING]] .
+
+===Steps in using METALEX===
+
+[[ref:libraries/lex/reference/metalex_chart|METALEX]] has an attribute analyzer which will be attached to a lexical analyzer. This class provides tools for building a lexical analyzer incrementally through explicit feature calls; you can still use a lexical grammar file, but do not have to.
+
+The following extract from a typical descendant of [[ref:libraries/lex/reference/metalex_chart|METALEX]] illustrates the process of building a lexical analyzer in this way:
+
+ Upper_identifier, Lower_identifier, Decimal_constant, Octal_constant, Word: INTEGER is unique
+
+ ...
+
+ distinguish_case
+ keywords_distinguish_case
+ put_expression("+('0'..'7'"), Octal_constant, "Octal")
+ put_expression ("'a'..'z' *('a'..'z'|'0'..'9'|'_')", Lower_identifier, "Lower")
+ put_expression ("'A'..'Z' *('A'..'Z'|'0'..'9'|'_' )", Upper_identifier, "Upper")
+
+
+ dollar_w (Word)
+ ...
+ put_keyword ("begin", Lower_identifier)
+ put_keyword ("end", Lower_identifier)
+ put_keyword ("THROUGH", Upper_identifier)
+ ...
+ make_analyzer
+
+
+This example follows the general scheme of building a lexical analyzer with the features of [[ref:libraries/lex/reference/metalex_chart|METALEX]] , in a class that will normally be a descendant of [[ref:libraries/lex/reference/metalex_chart|METALEX]] :
+# Set options, such as case sensitivity.
+# Record regular expressions.
+# Record keywords (this may be interleaved with step 2.)
+# "Freeze" the analyzer by a call to
+ read_grammar (grammar_file_name: STRING)
+
+
+In this case all the expressions and keywords are taken from the file of name grammar_file_name rather than passed explicitly as arguments to the procedures of the class. You do not need to call
+ put_nameless_expression ( "$W" ,Word )
+
+
+Procedure
+ make_analyzer
+
+
+After that call, you may not record any new regular expression or keyword. The analyzer is usable through attribute
+ interval ('a', 'z')
+ -- Create an interval tool
+
+ union (Letter, Underlined)
+ -- Create a union tool
+
+
+Every such procedure call also assigns an integer index to the tool it creates; this number is available through the attribute
+ Identifier, Letter, Digit, Underlined, Suffix, Suffix_list: INTEGER
+
+ build_identifier
+ do
+ interval ('a', 'z')
+ Letter := last_created_tool
+ interval ('0', '9')
+ Digit := last_created_tool
+ interval ('_', '_')
+ Underlined := last_created_tool
+ union (Digit, Underlined)
+ Suffix := last_created_tool
+ iteration (Suffix)
+ Suffix_list := last_created_tool
+ append (Letter, Suffix_list)
+ Identifier := last_created_tool
+ end
+
+
+Each token type is characterized by a number in the tool_list. Each tool has a name, recorded in
+ select_tool (Identifier)
+ associate (Identifier, 34)
+ put_keyword ("class", Identifier)
+ put_keyword ("end", Identifier)
+ put_keyword ("feature", Identifier)
+
+
+If the analysis encounters a token that belongs to two or more different selected regular expressions, the one entered last takes over. Others are recorded in the array if is a keyword of Eiffel. Keywords are described by class [[ref:libraries/parse/reference/keyword_chart|KEYWORD]] , an heir of [[ref:libraries/parse/reference/terminal_chart|TERMINAL]] .
+
+The rest of this section concentrates on the parsing-specific part: non-terminal constructs and productions. Terminals will be studied in the discussion of how to interface parsing with lexical analysis.
+
+===Varieties of non-terminal constructs and productions===
+
+An aggregate production defines a construct whose specimens are obtained by concatenating ("aggregating") specimens of a list of specified constructs, some of which may be optional. For example, the production for construct Conditional in an Eiffel grammar may read:
+
+Conditional [=] if Then_part_list [Else_part] end
+
+
+This means that a specimen of Conditional (a conditional instruction) is made of the keyword if, followed by a specimen of Then_part_list, followed by zero or one specimen of Else_part (the square brackets represent an optional component), followed by the keyword end.
+
+{{note|This notation for productions uses conventions similar to those of the book ''Eiffel: The Language''. Keywords are written in '''boldface italics''' and stand for themselves. Special symbols, such as the semicolon, are written in double quotes, as in ";". The
+Type [=] Class_type | Class_type_expanded | Formal_generic_name | Anchored | Bit_type
+
+
+This means that a specimen of Type is either a specimen of Class_type, or a specimen of Class_type_expanded etc.
+
+Finally, a repetition production defines a construct whose specimens are sequences of zero or more specimens of a given construct (called the '''base''' of the repetition construct), separated from each other by a '''separator'''. For example, the production for construct Compound in an Eiffel grammar may read
+
+Compound [=] {Instruction ";" ...}
+
+
+This means that a specimen of Compound is made of zero or more specimens of Instruction, each separated from the next (if any) by a semicolon.
+
+These three mechanisms - aggregate, choice and repetition - suffice to describe the structure of a wide array of practical languages. Properties which cannot be handled by them should be dealt with through '''semantic actions''', as explained below.
+
+===An example grammar===
+
+The example directory included in the delivery implements a processor for a grammar describing a simple language for expressing polynomials. A typical "document" in this language is the line
+
+x; y: x * (y + 8 - (2 * x))
+
+The beginning of the line, separated from the rest by a colon, is the list of variables used in the polynomial, separated by semicolons. The rest of the line is the expression defining the polynomial.
+
+Using the conventions defined above, the grammar may be written as:
+
+Line [=] Variables ":" Sum
+Variables [=] {Identifier ";" ...}
+Sum [=] {Diff "+" ...}
+Diff [=] {Product "-" ...}
+Product [=] {Term " * " ...}
+Term [=] Simple_var Int_constant Nested
+Nested [=] "(" Sum ")"
+
+
+This grammar assumes a terminal Identifier, which must be defined as a token type in the lexical grammar. The other terminals are keywords, shown as strings appearing in double quotes, for example "+".
+
+==PARSING CONCEPTS==
+
+The EiffelParse library supports a parsing mechanism based on the concepts of object-oriented software construction.
+
+===Class CONSTRUCT===
+
+The deferred class [[ref:libraries/parse/reference/construct_chart|CONSTRUCT]] describes the general notion of construct; instances of this class and its descendants are specimens of the constructs of a grammar.
+
+Deferred though it may be, [[ref:libraries/parse/reference/construct_chart|CONSTRUCT]] defines some useful general patterns; for example, its procedure process appears as:
+ parse
+ if parsed then
+ semantics
+ end
+
+
+ production: LINKED_LIST [CONSTRUCT]
+ -- Right-hand side of the production for the construct
+ deferred
+ end
+
+
+Function production remains deferred in classes [[ref:libraries/parse/reference/aggregate_chart|AGGREGATE]] , [[ref:libraries/parse/reference/choice_chart|CHOICE]] and [[ref:libraries/parse/reference/repetition_chart|REPETITION]] . Every effective construct class that you write must provide an effecting of that function. It is important for the efficiency of the parsing process that every effective version of production be a
+ construct_name: STRING
+ -- Symbolic name of the construct
+ once
+ Result := "INSTRUCTION"
+ end
+
+
+The examples of the next few sections, which explain how to write construct classes, are borrowed from the small "Polynomial" language mentioned above, which may be found in the examples directory in the ISE Eiffel delivery.
+
+==PREPARING GRAMMARS==
+
+Having studied the EiffelParse library principles, let us see how to write grammar productions for various kinds of construct. The main task is to write the production function for each construct class.
+
+The production function for a descendant of [[ref:libraries/parse/reference/aggregate_chart|AGGREGATE]] will describe how to build a specimen of the corresponding function from a sequence of specimens of each of the constituent constructs. Writing this function from the corresponding production is straightforward.
+
+As an example, consider the production function of class LINE for the Polynomial example language. The corresponding production is
+Line [=] Variables ":" Sum
+
+
+ production: LINKED_LIST [CONSTRUCT]
+ local
+ var: VARIABLES
+ sum: SUM
+ once
+ create Result.make
+ Result.forth
+ create var.make
+ put (var)
+ keyword (":")
+ create sum.make
+ put (sum)
+ end
+
+
+As shown by this example, the production function for an aggregate construct class should declare a local entity (here var and sum) for each non-keyword component of the right-hand side, the type of each entity being the corresponding construct class (here VARIABLES and SUM).
+
+The body of the function should begin with
+
+ create Result.make
+ Result.forth
+
+to create the object containing the result. Then for each non-keyword component, represented by the local entity component (this applies to var and sum in the example), there should be a sequence of two instructions, of the form
+
+ create component.make
+ put (component)
+
+
+For any keyword of associated string ''symbol'', such as the colon ":" in the example, there should be a call to
+
+ keyword (symbol)
+
+
+The order of the various calls to
+ component.set_optional
+
+
+This call may appear anywhere after the corresponding
+ create component
+ put (symbol)
+ component.set_optional
+
+
+===Choices===
+
+The
+Term [=] Simple_var Poly_integer Nested
+
+
+ production: LINKED_LIST [CONSTRUCT]
+ local
+ id: SIMPLE_VAR
+ val: POLY_INTEGER
+ nest: NESTED
+ once
+ create Result.make
+ Result.forth
+ createid.make
+ put (id)
+ create val.make
+ put (val)
+ create nest.make
+ put (nest)
+ end
+
+
+As shown by this example, the id, val and nest - for each alternative component of the right-hand side. The type of each entity is the corresponding construct class - here
+ create Result.make
+ Result.forth
+
+
+Then for each alternative component represented by a local entity component (in the example this applies to id, val and nest) there should be two instructions of the form
+
+ create component.make
+ put (component)
+
+
+{{caution|The order of the various calls to
+Variables [=] {Identifier ";" ...}
+
+
+ production: LINKED_LIST [IDENTIFIER]
+ local
+ base: VAR
+ once
+ create Result.make
+ Result.forth
+ create base.make
+ put (base)
+ end
+
+ separator: STRING = ";"
+
+
+
+As shown by this example, function base, is required; its type must be the class corresponding to the construct serving as the base of the repetition, VAR in the example.
+
+==INTERFACE TO LEXICAL ANALYSIS==
+
+One more type of construct class remains to be discussed: terminal construct classes. Since terminal constructs serve to elevate lexical tokens (regular expressions and keywords) to the dignity of syntactical construct, we must first take a look at how the EiffelParse library classes collaborate with their counterparts in the EiffelLex library.
+
+===The notion of lexical interface class===
+
+To parse a document, you need to get tokens from a lexical analyzer. This is achieved by making some construct classes, in particular those describing terminals, descendants of one of the lexical classes.
+
+The best technique is usually to write a class covering the lexical needs of the language at hand, from which all construct classes that have some lexical business will inherit. Such a class is called a lexical interface class.
+
+Lexical interface classes usually follow a common pattern. To take advantage of this uniformity, the EiffelParse library includes a deferred class L_INTERFACE which describes that pattern. Specific lexical interface classes may be written as descendants of L_INTERFACE.
+
+L_INTERFACE is a simple deferred class, with a deferred procedure
+indexing
+ description: "Lexical interface class for the Polynomial language"
+
+class
+ POLY_LEX
+
+inherit
+ L_INTERFACE
+
+ CONSTANTS
+ undefine
+ consistent,
+ copy,
+ is_equal,
+ setup
+ end
+
+feature {NONE}
+
+ obtain_analyzer
+ -- Create lexical analyzer for the Polynomial language
+ do
+ ignore_case
+ keywords_ignore_case
+ build_expressions
+ build_keywords
+ set_separator_type (blanks)
+ end
+
+ build_expressions
+ -- Define regular expressions
+ -- for the Polynomial language
+ do
+ put_expression (special_expression, special, "Special")
+ put_expression ("*('a'..'z')", simple_identifier, "Simple_identifier")
+ put_expression ("+('0'..'9')", integer_constant, "Integer_constant")
+ put_expression ("+('\t'|'\n'|' ')", blanks, "Blanks")
+ end
+
+ special_expression: STRING
+ -- Regular expression describing Special
+ once
+ create Result.make (80)
+ Result.append ("('\050'..'\057')|")
+ Result.append ("('\072'..'\076')|")
+ Result.append ("'['|']'|'|'|'{'|'}'|%"->%"|%":=%"")
+ end
+
+ build_keywords
+ -- Define keywords (special symbols)
+ -- for the Polynomial language
+ do
+ put_keyword ("+", special)
+ put_keyword ("-", special)
+ put_keyword (";", special)
+ put_keyword (":", special)
+ put_keyword ("(", special)
+ put_keyword (")", special)
+ put_keyword ("*", special)
+ end
+end
+
+
+This class illustrates the straightforward scheme for writing lexical interface classes. It introduces constants such as Special to represent the regular expressions supported, and effects procedure
+class
+ INT_CONSTANT
+
+inherit
+ TERMINAL
+
+ CONSTANTS
+
+feature
+
+ token_type: INTEGER
+ do
+ Result := integer_constant
+ end
+
+feature {NONE}
+
+ construct_name: STRING
+ once
+ Result := "INT_CONSTANT"
+ end
+end
+
+
+==SPECIFYING THE SEMANTICS==
+
+As mentioned at the beginning of this chapter, parsing is usually done not for itself but as a way to perform some semantic processing. The EiffelParse Library classes define the general framework for grafting such semantics onto a syntactical stem.
+
+===Semantic procedures===
+
+The principal procedures for defining semantic actions are
+ post_action
+ local
+ int_value: INTEGER
+ do
+ if not no_components then
+ from
+ child_start
+ if not child_after then
+ int_value := 1
+ end
+ until
+ child_after
+ loop
+ child.post_action
+ nt_value := int_value * info.child_value
+ child_forth
+ end
+ info.set_child_value (int_value)
+ end
+ end
+
+
+Here each relevant construct class has an attribute
+A [=] A ...
+
+
+A [=] B ...
+B [=] C ...
+...
+L [=] A ...
+
+
+
+Direct left recursion is easy to avoid, but indirect recursion may sneak in in less trivial ways.
+
+To determine whether the production for a construct is directly or indirectly left-recursive, use the query left_recursion from class (s)
+where ''s'' is a specimen of
+ production: LINKED_LIST [CONSTRUCT]
+ local
+ expression: SUM
+ once
+ create Result.make
+ Result.forth
+ keyword ("(")
+ commit
+ create expression.make
+ put (expression)
+ keyword (")")
+ end
+
+
+
+The commit after the recognition of the keyword "(" is there to use the following piece of higher-level knowledge:
+
+:''No choice production of the grammar that has NESTED as one of its alternatives has another alternative construct whose specimens could begin with an opening parenthesis "(".''
+
+
+Because of this property, if the parser goes so far as to recognize an opening parenthesis as part of parsing any construct
+ build (document)
+
+
+Although you may use this line as a recipe with no need for further justification, it is interesting to see what build does. Feature document describes the input document to be processed; it is introduced as a Once function in class
+ build (doc: INPUT)
+ -- Create lexical analyzer and set doc
+ -- to be the input document.
+ require
+ document_exists: doc /= void
+ do
+ metalex_make
+ obtain_analyzer
+ make_analyzer
+ doc.set_lexical (analyzer)
+ end
+
+
+The call to obtain_analyzer defines the regular grammar for the language at hand. Recall that obtain_analyzer is deferred in ( document takes care of steps [[#step_e1|1]] and [[#step_e2|2]] of the root's creation procedure. Step [[#step_e3|3]] selects the file containing the input document; this is achieved through the call
+ document.set_input_file (some_file_name)
+
+
+ parse
+ if parsed then
+ semantics
+ end
+
+
+ root_line: LINE
+
+ make
+ local
+ text_name: STRING
+ do
+ create root_line.make
+ build (root_line.document)
+
+ ... Instructions prompting the user for the name of the
+ file to be parsed, and assigning it to text_name ...
+
+ root_line.document.set_input_file (text_name)
+ root_line.process
+ end
+
+
+Although it covers a small language, this example may serve as a blueprint for most applications of the EiffelParse library.
+
+==FUTURE WORK==
+
+It was mentioned at the beginning of this chapter that further work is desirable to make the EiffelParse library reach its full bloom. Here is a glimpse of future improvements.
+
+===Expressions===
+
+Many languages include an expression construct having the properties of traditional arithmetic expressions:
+* An expression is a succession of basic operands and operators.
+* The basic operands are lexical elements, such as identifiers and constants.
+* Operators are used in prefix mode (as in ''- a'') or infix mode (as in ''b - a'').
+* Each operator has a precedence level; precedence levels determine the abstract syntactic structure of expressions and consequently their semantics. For example the abstract structure of ''a + b * c'' shows this expression to be the application of the operator ''+'' to ''a'' and to the application of the operator ''*'' to ''b'' and ''c''. That this is the correct interpretation of the instruction follows from the property that ''*'' has a higher precedence ("binds more tightly") than ''+''.
+* Parentheses pairs, such as ( ) or [ ], can be used to enforce a structure different from what the precedence rules would imply, as in ''(a + b) * c''.
+* Some infix operators may be applied to more than two arguments; in this case it must be clear whether they are right-associative (in other words, ''a ^ b ^ c'' means ''a ^ (b ^ c)'', the conventional interpretation if ^ denotes the power operator) or left-associative.
+
+
+It is of course possible to apply the EiffelParse library in its current state to support expressions, as illustrated by this extract from the Polynomial grammar given in full above:
+
+Variables [=] {Identifier ";" ...}
+Sum [=] {Diff "+" ...}
+Diff [=] {Product "-" ...}
+Product [=] {Term "*" ...}
+
+
+The problem then is not expressiveness but efficiency. For such expressions the recursive descent technique, however well adapted to the higher-level structures of a language, takes too much time and generates too many tree nodes. Efficient bottom-up parsing techniques are available for this case.
+
+The solution is straightforward: write a new heir
+Line [=] Variables ":" Sum
+
+
+class
+ LINE
+
+inherit
+ AGGREGATE
+
+feature
+ production: LINKED_LIST [CONSTRUCT]
+ local
+ var: VARIABLES
+ sum: SUM
+ once
+ create Result.make
+ Result.forth
+ create var.make
+ put (var)
+ keyword (":")
+ create sum.make
+ put (sum)
+ end
+
+ ...
+
+end
+
+
+This transformation of the textual description of the grammar into its equivalent Eiffel form is simple and unambiguous; but it is somewhat annoying to have to perform it manually.
+
+A tool complementing the EiffelParse library and known as YOOC ("Yes! an Object-Oriented Compiler", a name meant as an homage to the venerable Yacc) has been planned for future releases of EiffelParse. Yooc, a translator, will take a grammar specification as input and transform it into a set of parsing classes, all descendants of CONSTRUCT and built according to the rules defined above. The input format for syntax specification, similar to the conventions used throughout this chapter, is a variant of LDL (Language Description Language), a component of the ArchiText structural document processing system.
+
+===Further reading===
+
+The following article describes some advanced uses of the EiffelParse library as well as a Yooc-like translator called PG: Per Grape and Kim Walden: Automating the Development of Syntax Tree Generators for an Evolving Language, in Proceedings of TOOLS 8 (Technology of Object-Oriented Languages and Systems), Prentice Hall, 1992, pages 185-195.
+
+
+
+
+
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/eiffelparse/index.wiki b/documentation/18.11/solutions/text-processing/eiffelparse/index.wiki
new file mode 100644
index 00000000..08a2f26d
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/eiffelparse/index.wiki
@@ -0,0 +1,11 @@
+[[Property:title|EiffelParse]]
+[[Property:weight|5]]
+[[Property:uuid|0984d15a-6ee9-3bd4-71d6-31df2987af3a]]
+==EiffelParse Library==
+
+Type: Library
+x;y: x * (y + 8 - (2 * x))
+
+The beginning of the line, separated from the rest by a colon, is the list of variables used in the polynomial, separated by semicolons. The rest of the line is the expression defining the polynomial. The grammar can be described with the following grammar:
+
+LINE = VARIABLES ":" SUM
+VARIABLES = VAR .. ";"
+SUM = DIFF .. "+"
+DIFF = PRODUCT .. "-"
+PRODUCT = TERM .. "*"
+TERM = SIMPLE_VAR | INT_CONSTANT | NESTED
+NESTED = "(" SUM ")"
+This grammar assumes a terminal '''VAR''', which must be defined as a token type in the lexical grammar. The other terminals are keywords, shown as strings appearing in the double quotes, for example "+".
+When compiling the example, the executable '''process(.exe)''' is created. When executing the program, it will prompt for the name of a file with a polynomial description, reads a polynomial from the given file, prompts for integer values of the variables, and evaluates the polynomial.
+
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/eiffelparse/parse-sample/index.wiki b/documentation/18.11/solutions/text-processing/eiffelparse/parse-sample/index.wiki
new file mode 100644
index 00000000..d2b033b7
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/eiffelparse/parse-sample/index.wiki
@@ -0,0 +1,8 @@
+[[Property:title|Parse Sample]]
+[[Property:weight|2]]
+[[Property:uuid|ad48d4f5-a113-65f7-15fc-8c8fd3f5c284]]
+* [[Eiffel polynomial parser|Eiffel polynomial parser]]
+
+
+
+
diff --git a/documentation/18.11/solutions/text-processing/index.wiki b/documentation/18.11/solutions/text-processing/index.wiki
new file mode 100644
index 00000000..ea316e64
--- /dev/null
+++ b/documentation/18.11/solutions/text-processing/index.wiki
@@ -0,0 +1,6 @@
+[[Property:title|Text processing]]
+[[Property:weight|-6]]
+[[Property:uuid|e74b5b47-d87d-2eb0-49ba-981dae52d338]]
+== Text processing (lexical analysis and parsing) solutions==
+
+
diff --git a/documentation/18.11/solutions/web-technology/EiffelWeb-framework.wiki b/documentation/18.11/solutions/web-technology/EiffelWeb-framework.wiki
new file mode 100644
index 00000000..f54a307e
--- /dev/null
+++ b/documentation/18.11/solutions/web-technology/EiffelWeb-framework.wiki
@@ -0,0 +1,14 @@
+[[Property:uuid|5D7CBC54-D97A-4400-9335-9C8FB3CBE004]]
+[[Property:weight|0]]
+[[Property:title|EiffelWeb framework]]
+[[Property:link_title|EiffelWeb]]
+
+= The EiffelWeb Framework (EWF) =
+
+The EiffelWeb Framework provides a common framework to build easily web server application in Eiffel (portable on various connectors and platforms).
+
+* Project on github: [https://github.com/EiffelWebFramework/EWF]
+* Associated website [http://www.eiffelweb.org/]
+* Latest documentation [https://github.com/EiffelWebFramework/EWF/blob/master/docs/workbook/workbook.md]
+* Gitter.im room [https://gitter.im/EiffelWebFramework/EWF]
+* Forum [https://groups.google.com/forum/#!forum/eiffel-web-framework]
diff --git a/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-class-reference.wiki b/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-class-reference.wiki
new file mode 100644
index 00000000..26fd6263
--- /dev/null
+++ b/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-class-reference.wiki
@@ -0,0 +1,5 @@
+[[Property:title|EiffelWeb Class Reference]]
+[[Property:weight|1]]
+[[Property:uuid|70bb6b4d-7b0f-6317-4c2b-618a80ef042d]]
+==View the [[ref:libraries/web/reference/index|EiffelWeb Class Reference]]==
+
diff --git a/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-sample/eiffelweb-basic-sample.wiki b/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-sample/eiffelweb-basic-sample.wiki
new file mode 100644
index 00000000..d133344c
--- /dev/null
+++ b/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-sample/eiffelweb-basic-sample.wiki
@@ -0,0 +1,40 @@
+[[Property:title|EiffelWeb Basic Sample]]
+[[Property:weight|0]]
+[[Property:uuid|da8f72cb-0ecd-464a-a558-cbf7d24301e3]]
+This sample shows how to retrieve and display information from a basic form on a web page.
+
+
+{{note|This sample requires a web server supporting CGI in order to be run. Both the Internet Information Services web server from Microsoft and the GNU Apache server may be used. }}
+
+
+==Compiling==
+
+To compile the example:
+* Launch EiffelStudio.
+* Click '''Add project'''
+* Browse to ''$ISE_EIFFEL\examples\web\basic\''.
+* Choose ''web.ecf''
+* Choose the location where the project will be compiled, by default the same directory containing the configuration file.
+* Click '''OK'''.
+
+==Installing==
+
+You should copy the file ''web_demo.exe'' in the ''cgi_bin'' directory of your web server and the file ''sample.html'' in a directory on the web server.
+
+==Running==
+
+To run the example, access the page ''sample.html'' that you copied on the web server with a web browser (typically
+
+
+
+
+When the user presses the submit button, the browser will launch the application located at ''/cgi-bin/convert.exe'' on the server, will use the HTTP Post protocol, and will store among others the environment variable ''Celsius'' with the value entered by the user.
+
+==Advantages of using EiffelWeb==
+
+With EiffelWeb, you can:
+* Design object-oriented systems
+* Access and use the Eiffel libraries
+* Increase maintainability because your code is reusable and readable
+* Deal with complexity because you use a language particularly efficient in the Business Modeling.
+* Use one/a few big Eiffel Web applications, which allow for an easier maintenance and provide better code readability and reusability than having a huge number of scripts.
+* Use the ''Design by Contract'' methodology, thanks to the debugging facilities provided by EiffelWeb.
+
+
+
+
+
diff --git a/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-tutorial/index.wiki b/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-tutorial/index.wiki
new file mode 100644
index 00000000..aba636ca
--- /dev/null
+++ b/documentation/18.11/solutions/web-technology/eiffelweb/eiffelweb-tutorial/index.wiki
@@ -0,0 +1,9 @@
+[[Property:title|EiffelWeb Tutorial]]
+[[Property:weight|0]]
+[[Property:uuid|e2b93aea-ec1b-5897-0b0a-adc5681a1dcb]]
+The Common Gateway Interface (CGI) emerged as the first way to present dynamically generated information on the World Wide Web. It allows the computer to process forms filled by the user and return appropriate information. True in your root class (which should inherit from