Bimba.git

commit 4aa1f5dbef682a0259f442fda1e2f14fcc205a6c

Author: Adam Evyčędo <git@apiote.xyz>

merge develop into master for version 3.9.0-rc.1

%!v(PANIC=String method: strings: negative Repeat count)


diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index 752ca17fa23bfb6f4fe112ab5b255bf899742ada..4c4f412fafbcd7a61baecb8ed4e14734b604c450 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -14,6 +14,12 @@
 * Travel planning
 * Offline timetable
 
+== [3.9.0] – 2025-02-08
+
+=== Added
+
+* Travel planning based on Transitous
+
 == [3.6.1] – 2024-09-04
 
 === Fixed




diff --git a/LICENSES/AGPL-3.0-or-later.txt b/LICENSES/AGPL-3.0-or-later.txt
deleted file mode 100644
index 0c97efd25b5974b974ed9a8a18207bc4f55bb338..0000000000000000000000000000000000000000
--- a/LICENSES/AGPL-3.0-or-later.txt
+++ /dev/null
@@ -1,235 +0,0 @@
-GNU AFFERO GENERAL PUBLIC LICENSE
-Version 3, 19 November 2007
-
-Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
-
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-
-                            Preamble
-
-The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software.
-
-The licenses for most software and other practical works are designed to take away your freedom to share and change the works.  By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users.
-
-When we speak of free software, we are referring to freedom, not price.  Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
-
-Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software.
-
-A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate.  Many developers of free software are heartened and encouraged by the resulting cooperation.  However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public.
-
-The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community.  It requires the operator of a network server to provide the source code of the modified version running there to the users of that server.  Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version.
-
-An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals.  This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
-                       TERMS AND CONDITIONS
-
-0. Definitions.
-
-"This License" refers to version 3 of the GNU Affero General Public License.
-
-"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
-
-"The Program" refers to any copyrightable work licensed under this License.  Each licensee is addressed as "you".  "Licensees" and "recipients" may be individuals or organizations.
-
-To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy.  The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.
-
-A "covered work" means either the unmodified Program or a work based on the Program.
-
-To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy.  Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
-
-To "convey" a work means any kind of propagation that enables other parties to make or receive copies.  Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
-
-An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License.  If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
-
-1. Source Code.
-The "source code" for a work means the preferred form of the work for making modifications to it.  "Object code" means any non-source form of a work.
-
-A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
-
-The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form.  A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
-
-The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities.  However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work.  For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
-
-The Corresponding Source for a work in source code form is that same work.
-
-2. Basic Permissions.
-All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met.  This License explicitly affirms your unlimited permission to run the unmodified Program.  The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work.  This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
-
-You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force.  You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright.  Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
-
-Conveying under any other circumstances is permitted solely under the conditions stated below.  Sublicensing is not allowed; section 10 makes it unnecessary.
-
-3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
-
-When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
-
-4. Conveying Verbatim Copies.
-You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
-
-You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
-
-5. Conveying Modified Source Versions.
-You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7.  This requirement modifies the requirement in section 4 to "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy.  This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged.  This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
-
-A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit.  Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
-
-6. Conveying Non-Source Forms.
-You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source.  This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
-
-    d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge.  You need not require recipients to copy the Corresponding Source along with the object code.  If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source.  Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
-
-A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
-
-A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling.  In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage.  For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product.  A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
-
-"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source.  The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
-
-If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information.  But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
-
-The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed.  Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
-
-Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
-
-7. Additional Terms.
-"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law.  If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
-
-When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it.  (Additional permissions may be written to require their own removal in certain cases when you modify the work.)  You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
-
-Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
-
-All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10.  If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term.  If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
-
-If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
-
-Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
-
-8. Termination.
-
-You may not propagate or modify a covered work except as expressly provided under this License.  Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
-
-However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
-
-Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
-
-Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License.  If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
-
-9. Acceptance Not Required for Having Copies.
-
-You are not required to accept this License in order to receive or run a copy of the Program.  Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance.  However, nothing other than this License grants you permission to propagate or modify any covered work.  These actions infringe copyright if you do not accept this License.  Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
-
-10. Automatic Licensing of Downstream Recipients.
-
-Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License.  You are not responsible for enforcing compliance by third parties with this License.
-
-An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations.  If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
-
-You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License.  For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
-
-11. Patents.
-
-A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based.  The work thus licensed is called the contributor's "contributor version".
-
-A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version.  For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
-
-Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
-
-In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement).  To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
-
-If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
-
-If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
-
-A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License.  You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
-
-Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
-
-12. No Surrender of Others' Freedom.
-
-If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License.  If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
-
-13. Remote Network Interaction; Use with the GNU General Public License.
-
-Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software.  This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph.
-
-Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work.  The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License.
-
-14. Revised Versions of this License.
-
-The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time.  Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation.  If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation.
-
-If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
-
-Later license versions may give you additional or different permissions.  However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
-
-15. Disclaimer of Warranty.
-
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-16. Limitation of Liability.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-17. Interpretation of Sections 15 and 16.
-
-If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
-
-END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-To do so, attach the following notices to the program.  It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-     <one line to give the program's name and a brief idea of what it does.>
-     Copyright (C) <year>  <name of author>
-
-     This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
-
-     This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more details.
-
-     You should have received a copy of the GNU Affero General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source.  For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code.  There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements.
-
-You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see <http://www.gnu.org/licenses/>.




diff --git a/README.adoc b/README.adoc
index fe4569a3272a921f38a58dc15f2bb9419b79f70b..911bd206a8b9b12526d94e40597541b17bee5bb3 100644
--- a/README.adoc
+++ b/README.adoc
@@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later
 
 = Bimba
 Adam Evyčędo <me@apiote.xyz>
-v3.8.0 2025-01-21
+v3.9.0-rc.1 2025-02-08
 :toc:
 
 Bimba is a FLOSS public transport passenger companion; a timetable in your pocket.




diff --git a/REUSE.toml b/REUSE.toml
index 5fc28d21bbdaa5e70044fd318072dd332d0fc987..0b56dcc4821e29aee6c6742367be3fec19adace6 100644
--- a/REUSE.toml
+++ b/REUSE.toml
@@ -1,6 +1,6 @@
 # SPDX-FileCopyrightText: Adam Evyčędo
 #
-# SPDX-License-Identifier: AGPL-3.0-or-later
+# SPDX-License-Identifier: GPL-3.0-or-later
 
 version = 1
 SPDX-PackageName = "Bimba"




diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index fb4153400d1c18791feafd90c302dae996120efe..cef626c86995282d54924611ad1a8f66dce60045 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,4 +1,3 @@
-
 import com.android.build.gradle.internal.tasks.factory.dependsOn
 import com.android.build.gradle.tasks.ExtractDeepLinksTask
 import com.android.build.gradle.tasks.MergeResources
@@ -28,11 +27,11 @@ 	defaultConfig {
 		applicationId = "xyz.apiote.bimba.czwek"
 		minSdk = 21
 		targetSdk = 35
-		versionCode = 34
-		versionName = "3.8.0"
+		versionCode = 35
+		versionName = "3.9.0-rc.1"
 
 		testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
-		resourceConfigurations += listOf("en", "de", "en-rGB", "en-rUS", "et", "fr", "it", "pl")
+		resourceConfigurations += listOf("en", "de", "en-rGB", "en-rUS", "et", "fr", "it", "pl", "ru", "ta")
 	}
 
 	buildTypes {
@@ -64,6 +63,14 @@ 	dest("${layout.buildDirectory.get()}/motis2.yml")
 	overwrite(false)
 }
 
+tasks.register<Exec>("lintReuse") {
+	commandLine("reuse", "lint")
+}
+
+afterEvaluate {
+    tasks.named("preDebugBuild").dependsOn("lintReuse")
+}
+
 tasks.named("openApiGenerate").dependsOn("downloadFile")
 
 openApiGenerate {
@@ -94,30 +101,31 @@ 	implementation("com.google.android.material:material:1.12.0")
 	implementation("androidx.constraintlayout:constraintlayout:2.2.0")
 	implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.7")
 	implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
-	implementation("androidx.navigation:navigation-fragment-ktx:2.8.4")
-	implementation("androidx.navigation:navigation-ui-ktx:2.8.4")
+	implementation("androidx.navigation:navigation-fragment-ktx:2.8.6")
+	implementation("androidx.navigation:navigation-ui-ktx:2.8.6")
 	implementation("androidx.legacy:legacy-support-v4:1.0.0")
 	implementation("androidx.core:core-splashscreen:1.0.1")
 	implementation("com.google.openlocationcode:openlocationcode:1.0.4")
 	implementation("org.osmdroid:osmdroid-android:6.1.20")
 	implementation("org.yaml:snakeyaml:2.3")
-	implementation("androidx.activity:activity-ktx:1.9.3")
+	implementation("androidx.activity:activity-ktx:1.10.0")
 	implementation("com.otaliastudios:zoomlayout:1.9.0")
 	implementation("dev.bandb.graphview:graphview:0.8.1")
-	implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3")
+	implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0")
 	implementation("com.github.jershell:kbson:0.5.0")
 	implementation("androidx.preference:preference-ktx:1.2.1")
 	implementation("androidx.work:work-runtime-ktx:2.10.0")
 	implementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.10.0")
-	implementation("commons-io:commons-io:2.17.0")
-	implementation("com.google.guava:guava:33.3.1-android")
+	implementation("commons-io:commons-io:2.18.0")
+	implementation("com.google.guava:guava:33.4.0-android")
 	implementation(project(":fruchtfleisch"))
-	implementation("ch.acra:acra-http:5.11.4")
-	implementation("ch.acra:acra-notification:5.11.4")
+	implementation("ch.acra:acra-http:5.12.0")
+	implementation("ch.acra:acra-notification:5.12.0")
 	implementation("com.squareup.okhttp3:okhttp:4.12.0")
-	implementation("com.squareup.moshi:moshi-kotlin:1.15.1")
+	implementation("com.squareup.moshi:moshi-kotlin:1.15.2")
+	implementation("androidx.activity:activity:1.10.0")
 
-	coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.3")
+	coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
 
 	androidTestImplementation("androidx.test.ext:junit:1.2.1")
 	androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")




diff --git a/app/src/androidTest/java/xyz/apiote/bimba/czwek/units/TGMKtTest.kt b/app/src/androidTest/java/xyz/apiote/bimba/czwek/units/TGMKtTest.kt
index 4a2c9992ce3cee112261c8092a7f7c074a8bdc71..ac4a36b4debc942871b902960d6dfb821d6edcb8 100644
--- a/app/src/androidTest/java/xyz/apiote/bimba/czwek/units/TGMKtTest.kt
+++ b/app/src/androidTest/java/xyz/apiote/bimba/czwek/units/TGMKtTest.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.units
 




diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a841a0098342acf33be8ce9c99c169d9d4536bd5..a4cc503e470ba2a4a93f737d6c2b1273a9579d94 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,11 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <!--
 SPDX-FileCopyrightText: Adam Evyčędo
 
-SPDX-License-Identifier: AGPL-3.0-or-later
+SPDX-License-Identifier: GPL-3.0-or-later
 -->
-
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 	xmlns:tool="http://schemas.android.com/tools">
 
@@ -28,6 +26,9 @@ 		android:roundIcon="@mipmap/ic_launcher_round"
 		android:supportsRtl="true"
 		android:theme="@style/Theme.Bimba.Style"
 		tool:targetApi="33">
+		<activity
+			android:name=".journeys.JourneysActivity"
+			android:exported="false" />
 		<activity
 			android:name=".settings.SettingsActivity"
 			android:exported="false"




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/RoundedBackgroundSpan.kt b/app/src/main/java/xyz/apiote/bimba/czwek/RoundedBackgroundSpan.kt
index de62227e174ece207c25db47a323c7f22bc7a863..e38daad84e9aba836e3195be5c442c0abf6aa678 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/RoundedBackgroundSpan.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/RoundedBackgroundSpan.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousDepartures.kt b/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousDepartures.kt
index 67bbcb416081b6771ed5de98a157adff8460c249..40205c3752be1355ea0befc4871d3fc384879a1c 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousDepartures.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousDepartures.kt
@@ -1,11 +1,10 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.api
 
 import android.content.Context
-import android.util.Log
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
 import xyz.apiote.bimba.czwek.R
@@ -51,7 +50,6 @@ 		var longitude: BigDecimal = BigDecimal(0)
 		val departures = times.stopTimes.filter {
 			!exact || stop == it.place.stopId
 		}.map {
-			Log.i("stop", "stopID recvd: ${it.place.stopId}")
 			if ((it.place.departure ?: it.place.arrival) == null) {
 				null
 			} else {
@@ -89,7 +87,6 @@ 					terminusArrival = it.place.departure == null
 				)
 			}
 		}.filterNotNull()
-		Log.i("stop", "stopID asked: $stop")
 		StopEvents(
 			departures,
 			Stop(




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousJourney.kt b/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousJourney.kt
new file mode 100644
index 0000000000000000000000000000000000000000..99032bc0fe4282813440964a366394adfdc3148d
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousJourney.kt
@@ -0,0 +1,177 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.api
+
+import android.content.Context
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+import okhttp3.OkHttpClient
+import xyz.apiote.bimba.czwek.R
+import xyz.apiote.bimba.czwek.api.transitous.api.RoutingApi
+import xyz.apiote.bimba.czwek.api.transitous.model.PedestrianProfile
+import xyz.apiote.bimba.czwek.repo.Colour
+import xyz.apiote.bimba.czwek.repo.CongestionLevel
+import xyz.apiote.bimba.czwek.repo.Event
+import xyz.apiote.bimba.czwek.repo.Journey
+import xyz.apiote.bimba.czwek.repo.JourneyParams
+import xyz.apiote.bimba.czwek.repo.Leg
+import xyz.apiote.bimba.czwek.repo.LineStub
+import xyz.apiote.bimba.czwek.repo.LineType
+import xyz.apiote.bimba.czwek.repo.OccupancyStatus
+import xyz.apiote.bimba.czwek.repo.Place
+import xyz.apiote.bimba.czwek.repo.Position
+import xyz.apiote.bimba.czwek.repo.TimeReference
+import xyz.apiote.bimba.czwek.repo.TrafficResponseException
+import xyz.apiote.bimba.czwek.repo.Vehicle
+import xyz.apiote.bimba.czwek.units.Metre
+import xyz.apiote.bimba.czwek.units.Mps
+import xyz.apiote.bimba.czwek.units.Second
+import java.time.Duration
+import java.time.ZoneId
+import java.time.ZonedDateTime
+
+suspend fun getJourney(
+	from: Place,
+	to: Place,
+	params: JourneyParams,
+	context: Context
+): List<Journey> {
+	if (!isNetworkAvailable(context)) {
+		throw TrafficResponseException(0, "", Error(0, R.string.error_offline, R.drawable.error_net))
+	}
+
+	return withContext(Dispatchers.IO) {
+		val client = OkHttpClient.Builder()
+			.callTimeout(Duration.ofSeconds(60))
+			.readTimeout(Duration.ofSeconds(60))
+			.writeTimeout(Duration.ofSeconds(60))
+			.connectTimeout(Duration.ofSeconds(60)).build()
+		val response = RoutingApi(client = client).plan(
+			from.planString(),
+			to.planString(),
+			maxTransfers = null,
+			maxTravelTime = null,
+			time = ZonedDateTime.of(params.getSafeDate(), params.getSafeTime(), ZoneId.systemDefault())
+				.toOffsetDateTime(),
+			arriveBy = params.timeReference == TimeReference.ARRIVE_BY,
+			requireBikeTransport = params.bicycle,
+			pedestrianProfile = if (params.wheelchairAccessible) PedestrianProfile.WHEELCHAIR else PedestrianProfile.FOOT,
+		)
+		val journeys = response.itineraries.map {
+			val legs: List<Leg> = it.legs.map {
+				Leg(
+					Event(
+						it.tripId ?: "",
+						null,
+						Time.fromOffsetTime(it.startTime, ZoneId.systemDefault()),
+						0u,
+						it.realTime,
+						Vehicle(
+							it.tripId ?: "",
+							Position(0.0, 0.0),
+							0u,
+							Mps(0),
+							LineStub(
+								it.routeShortName ?: "",
+								LineType.fromTransitous2(it.mode),
+								Colour.fromHex(it.routeColor)
+							),
+							it.headsign ?: "",
+							CongestionLevel.UNKNOWN,
+							OccupancyStatus.UNKNOWN
+						),
+						boarding = 0xffu,
+						alerts = emptyList(),
+						exact = true,
+						terminusArrival = false
+					),
+					Event(
+						it.tripId ?: "",
+						Time.fromOffsetTime(it.endTime, ZoneId.systemDefault()),
+						null,
+						0u,
+						it.realTime,
+						Vehicle(
+							it.tripId ?: "",
+							Position(0.0, 0.0),
+							0u,
+							Mps(0),
+							LineStub(
+								it.routeShortName ?: "",
+								LineType.fromTransitous2(it.mode),
+								Colour.fromHex(it.routeColor)
+							),
+							it.headsign ?: "",
+							CongestionLevel.UNKNOWN,
+							OccupancyStatus.UNKNOWN
+						),
+						boarding = 0xffu,
+						alerts = emptyList(),
+						exact = true,
+						terminusArrival = false
+					),
+					Place(it.from),
+					Place(it.to),
+					it.agencyName,
+					it.distance?.toDouble()?.let { Metre(it) },
+					Second(it.duration),
+					(it.intermediateStops ?: emptyList()).map { Place(it) },
+					decode(it.legGeometry.points)
+					/*it.rental,
+					it.steps,*/
+				)
+			}
+			Journey(
+				it.startTime.atZoneSameInstant(ZoneId.systemDefault()), it.endTime.atZoneSameInstant(
+					ZoneId.systemDefault()
+				), legs
+			)
+		}
+		if (params.timeReference == TimeReference.ARRIVE_BY) {
+			journeys.reversed()
+		} else {
+			journeys
+		}
+	}
+}
+
+/*
+The following piece of code © Google, Apache License, Version 2.0
+from https://github.com/googlemaps/android-maps-utils/blob/main/library/src/main/java/com/google/maps/android/PolyUtil.java
+with changes to decode with precision 7
+*/
+fun decode(encodedPath: String): MutableList<Position> {
+	val len = encodedPath.length
+
+	val path: MutableList<Position> = ArrayList<Position>()
+	var index = 0
+	var lat = 0
+	var lng = 0
+
+	while (index < len) {
+		var result = 1
+		var shift = 0
+		var b: Int
+		do {
+			b = encodedPath[index++].code - 63 - 1
+			result += b shl shift
+			shift += 5
+		} while (b >= 0x1f)
+		lat += if ((result and 1) != 0) (result shr 1).inv() else (result shr 1)
+
+		result = 1
+		shift = 0
+		do {
+			b = encodedPath[index++].code - 63 - 1
+			result += b shl shift
+			shift += 5
+		} while (b >= 0x1f)
+		lng += if ((result and 1) != 0) (result shr 1).inv() else (result shr 1)
+
+		path.add(Position(lat * 1e-7, lng * 1e-7))
+	}
+
+	return path
+}




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousQueryables.kt b/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousQueryables.kt
index a3cbf1b7295607079700a2e1071fee8704558e31..6a595f1747e1e0dd469a3c5da37443d7a7c94b5a 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousQueryables.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/api/transitousQueryables.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.api
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/DashboardViewModel.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/DashboardViewModel.kt
new file mode 100644
index 0000000000000000000000000000000000000000..0905bcc2f6e39ba980ac16e495806cb697ed32ac
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/DashboardViewModel.kt
@@ -0,0 +1,69 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.dashboard
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import com.google.android.material.chip.Chip
+import com.google.android.material.chip.ChipGroup
+import com.google.android.material.textfield.TextInputEditText
+import xyz.apiote.bimba.czwek.repo.Place
+import xyz.apiote.bimba.czwek.repo.TimeReference
+import xyz.apiote.bimba.czwek.search.Query
+import java.time.LocalDate
+import java.time.LocalTime
+
+class DashboardViewModel : ViewModel() {
+	companion object {
+		const val ORIGIN_KEY = "ORIGIN"
+		const val DEST_KEY = "DESTINATION"
+
+		val keys = arrayOf(ORIGIN_KEY, DEST_KEY)
+		val indices = mapOf(ORIGIN_KEY to 0, DEST_KEY to 1)
+
+		fun otherSource(source: String): String = keys[(indices[source]!! + 1) % 2]
+	}
+
+	val mutableData = mapOf(
+		ORIGIN_KEY to MutableLiveData<Place>(),
+		DEST_KEY to MutableLiveData<Place>()
+	)
+
+	val data = mapOf<String, LiveData<Place>>(
+		ORIGIN_KEY to mutableData[ORIGIN_KEY]!!,
+		DEST_KEY to mutableData[DEST_KEY]!!
+	)
+
+	fun set(source: String, place: Place) {
+		mutableData[source]!!.value = place
+	}
+
+	fun unset(source: String) {
+		mutableData[source]!!.value = null
+	}
+
+	val spans = mutableMapOf(
+		ORIGIN_KEY to "",
+		DEST_KEY to ""
+	)
+
+	val positionQueries = mutableMapOf<String, Query?>(
+		ORIGIN_KEY to null,
+		DEST_KEY to null
+	)
+
+	val suggestions = mutableMapOf<String, ChipGroup>(
+	)
+
+	val textInputs = mutableMapOf<String, TextInputEditText>()
+
+	var timeReference: TimeReference = TimeReference.DEPART_AFTER
+	var date: Long? = null
+	var time: LocalTime? = null
+	var wheelchairAccessible: Boolean = false
+	var bicycle: Boolean = false
+
+}




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/MainActivity.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/MainActivity.kt
index ac05a4944b6d577160c3793997583c9c7126ccf1..214295e7e85b1689cee3619b321d67ae940e4642 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/MainActivity.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/MainActivity.kt
@@ -7,6 +7,7 @@
 import android.Manifest
 import android.content.Intent
 import android.content.pm.PackageManager
+import android.content.res.TypedArray
 import android.os.Build
 import android.os.Bundle
 import android.view.View
@@ -27,6 +28,7 @@ import androidx.drawerlayout.widget.DrawerLayout.DrawerListener
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentManager
 import androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks
+import androidx.lifecycle.ViewModelProvider
 import androidx.navigation.fragment.NavHostFragment
 import androidx.navigation.ui.setupWithNavController
 import androidx.preference.PreferenceManager
@@ -36,10 +38,11 @@ import com.google.openlocationcode.OpenLocationCode
 import xyz.apiote.bimba.czwek.AboutActivity
 import xyz.apiote.bimba.czwek.R
 import xyz.apiote.bimba.czwek.dashboard.ui.home.HomeFragment
+import xyz.apiote.bimba.czwek.dashboard.ui.journey.JourneyFragment
 import xyz.apiote.bimba.czwek.dashboard.ui.map.MapFragment
-import xyz.apiote.bimba.czwek.dashboard.ui.voyage.VoyageFragment
 import xyz.apiote.bimba.czwek.databinding.ActivityMainBinding
 import xyz.apiote.bimba.czwek.onboarding.FirstRunActivity
+import xyz.apiote.bimba.czwek.search.Query
 import xyz.apiote.bimba.czwek.search.ResultsActivity
 import xyz.apiote.bimba.czwek.settings.DownloadCitiesWorker
 import xyz.apiote.bimba.czwek.settings.ServerChooserActivity
@@ -53,6 +56,8 @@ 	private lateinit var locationPermissionRequest: ActivityResultLauncher>
 
 	private lateinit var permissionAsker: Fragment
 	private var locationPermissionDialogShown = false
+	private var lastFragment: Fragment? = null
+	lateinit var viewModel: DashboardViewModel
 
 	override fun onCreate(savedInstanceState: Bundle?) {
 		enableEdgeToEdge()
@@ -60,6 +65,8 @@ 		super.onCreate(savedInstanceState)
 		binding = ActivityMainBinding.inflate(layoutInflater)
 		setContentView(binding.root)
 
+		viewModel = ViewModelProvider(this)[DashboardViewModel::class.java]
+
 		FirstRunActivity.setFirstRunDone(this)
 
 		ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
@@ -137,7 +144,7 @@ 				permissions[Manifest.permission.ACCESS_FINE_LOCATION] ?: false ||
 					permissions[Manifest.permission.ACCESS_COARSE_LOCATION] ?: false -> {
 					when (permissionAsker) {
 						is HomeFragment -> {
-							showResults(ResultsActivity.Mode.MODE_LOCATION)
+							showResults(Query(Query.Mode.LOCATION))
 						}
 
 						is MapFragment -> {
@@ -191,7 +198,7 @@ 			binding.container.openDrawer(binding.navigationDrawer)
 		}
 	}
 
-	fun onGpsClicked(fragment: Fragment) {
+	fun onGpsClicked(fragment: Fragment): Boolean {
 		when (PackageManager.PERMISSION_GRANTED) {
 			ContextCompat.checkSelfPermission(
 				this,
@@ -199,13 +206,18 @@ 				Manifest.permission.ACCESS_COARSE_LOCATION
 			) -> {
 				when (fragment) {
 					is HomeFragment -> {
-						showResults(ResultsActivity.Mode.MODE_LOCATION)
+						showResults(Query(Query.Mode.LOCATION))
 					}
 
 					is MapFragment -> {
 						fragment.showLocation()
+					}
+
+					is JourneyFragment -> {
+
 					}
 				}
+				return true
 			}
 
 			else -> {
@@ -216,23 +228,13 @@ 						Manifest.permission.ACCESS_FINE_LOCATION,
 						Manifest.permission.ACCESS_COARSE_LOCATION
 					)
 				)
+				return false
 			}
 		}
 	}
 
-	fun onSearchClicked(text: CharSequence?) {
-		if (OpenLocationCode.isValidCode(text.toString())) {
-			val olc = OpenLocationCode(text.toString())
-			if (!olc.isFull) {
-				showResults(ResultsActivity.Mode.MODE_SHORT_CODE_LOCATION, text.toString())
-			} else {
-				val area = olc.decode()
-				showResults(olc.code, area.centerLatitude, area.centerLongitude)
-			}
-		} else if (OpenLocationCode.isValidCode(
-				text.toString().trim().split(" ").first().trim(',').trim()
-			)
-		) {
+	fun onSearchClicked(text: CharSequence) {
+		if (OpenLocationCode.isValidCode(text.toString().trim().split(" ").first().trim(',').trim())) {
 			if (PreferenceManager.getDefaultSharedPreferences(applicationContext)
 					.getLong(DownloadCitiesWorker.LAST_UPDATE_KEY, -1) < 0
 			) {
@@ -244,61 +246,79 @@ 						.setIcon(R.drawable.geocoding)
 						.setTitle(R.string.no_geocoding_data)
 						.setMessage(R.string.no_geocoding_data_description)
 						.setPositiveButton(R.string.ok) { _, _ ->
-							showResults(
-								ResultsActivity.Mode.MODE_SEARCH,
-								text.toString()
-							)
+							showResults(Query(text.toString(), Query.Mode.NAME))
 						}
 						.show()
-					PreferenceManager.getDefaultSharedPreferences(applicationContext).edit{
+					PreferenceManager.getDefaultSharedPreferences(applicationContext).edit {
 						putBoolean(NO_GEOCODING_DATA_SHOWN, true)
 					}
+				} else {
+					showResults(Query(text.toString(), Query.Mode.NAME))
 				}
 			} else {
-				showResults(ResultsActivity.Mode.MODE_SHORT_CODE, text.toString())
+				showResults(Query(text.toString()))
 			}
 		} else {
-			showResults(ResultsActivity.Mode.MODE_SEARCH, text.toString())
+			showResults(Query(text.toString()))
 		}
 	}
 
-	private fun showResults(query: String, centerLatitude: Double, centerLongitude: Double) {
+	private fun showResults(query: Query) {
 		/* todo [3.2] (ux,low) animation
 			https://developer.android.com/guide/fragments/animate
 			https://github.com/raheemadamboev/fab-explosion-animation-app
 		*/
-		startActivity(ResultsActivity.getIntent(this, ResultsActivity.Mode.MODE_POSITION, query, centerLatitude, centerLongitude))
+		startActivity(ResultsActivity.getIntent(this, query))
+	}
+
+	fun showBadge(complete: Boolean = false) {
+		val colourID = if (complete) {
+			com.google.android.material.R.attr.colorPrimary
+		} else {
+			com.google.android.material.R.attr.colorOnSurfaceVariant
+		}
+		val badge = binding.bottomNavigation.getOrCreateBadge(R.id.navigation_journey)
+		val a: TypedArray = theme.obtainStyledAttributes(
+			R.style.Theme_Bimba, intArrayOf(colourID)
+		)
+		val colour = a.getColor(0, 0)
+		a.recycle()
+		badge.backgroundColor = colour
+		badge.isVisible = true
 	}
 
-	private fun showResults(mode: ResultsActivity.Mode, query: String = "") {
-		/* todo [3.2] (ux,low) animation
-			https://developer.android.com/guide/fragments/animate
-			https://github.com/raheemadamboev/fab-explosion-animation-app
-		*/
-		startActivity(ResultsActivity.getIntent(this, mode, query))
+	fun hideBadge() {
+		val badge = binding.bottomNavigation.getBadge(R.id.navigation_journey)
+		badge?.isVisible = false
 	}
 
-	private fun setNavbarIcons(f: Fragment) {
-		// todo [voyage-planning]
-		// binding.bottomNavigation.menu[2].setIcon(R.drawable.voyage_outline)
+	private fun setNavbarIcons(f: Fragment?) {
+		binding.bottomNavigation.menu[2].setIcon(R.drawable.journey_outline)
 		binding.bottomNavigation.menu[1].setIcon(R.drawable.home_outline)
 		binding.bottomNavigation.menu[0].setIcon(R.drawable.map_outline)
 		when (f) {
 			is HomeFragment -> {
 				binding.bottomNavigation.menu[1].setIcon(R.drawable.home_black)
+				lastFragment = f
 			}
 
-			is VoyageFragment -> {
-				binding.bottomNavigation.menu[2].setIcon(R.drawable.voyage_black)
+			is JourneyFragment -> {
+				binding.bottomNavigation.menu[2].setIcon(R.drawable.journey_black)
+				lastFragment = f
 			}
 
 			is MapFragment -> {
 				binding.bottomNavigation.menu[0].setIcon(R.drawable.map_black)
+				lastFragment = f
 			}
 
-			else -> {
+			null -> {
 				binding.bottomNavigation.menu[1].setIcon(R.drawable.home_black)
 			}
+
+			else -> {
+				setNavbarIcons(lastFragment)
+			}
 		}
 	}
 
@@ -306,4 +326,4 @@ 	companion object {
 		const val NOTIFICATION_PERMISSION_ASKED = "notificationPermissionAsked"
 		const val NO_GEOCODING_DATA_SHOWN = "no_geocoding_data_shown"
 	}
-}
\ No newline at end of file
+}




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyFragment.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..eeed26a59263305d83f91c1defe7dc15a37e4768
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyFragment.kt
@@ -0,0 +1,625 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.dashboard.ui.journey
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.res.Configuration
+import android.graphics.RectF
+import android.graphics.drawable.LayerDrawable
+import android.location.Location
+import android.location.LocationListener
+import android.location.LocationManager
+import android.os.Build
+import android.os.Bundle
+import android.text.Editable
+import android.text.Spanned
+import android.text.TextWatcher
+import android.text.format.DateUtils
+import android.text.style.ImageSpan
+import android.util.Log
+import android.view.KeyEvent
+import android.view.LayoutInflater
+import android.view.Menu
+import android.view.MotionEvent.ACTION_UP
+import android.view.View
+import android.view.ViewGroup
+import android.widget.PopupMenu
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updateLayoutParams
+import androidx.core.view.updatePadding
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.ViewModelProvider
+import androidx.swiperefreshlayout.widget.CircularProgressDrawable
+import com.google.android.material.chip.Chip
+import com.google.android.material.chip.ChipDrawable
+import com.google.android.material.datepicker.MaterialDatePicker
+import com.google.android.material.timepicker.MaterialTimePicker
+import com.google.android.material.timepicker.TimeFormat
+import com.google.openlocationcode.OpenLocationCode
+import xyz.apiote.bimba.czwek.R
+import xyz.apiote.bimba.czwek.dashboard.DashboardViewModel
+import xyz.apiote.bimba.czwek.dashboard.MainActivity
+import xyz.apiote.bimba.czwek.databinding.FragmentJourneyBinding
+import xyz.apiote.bimba.czwek.dpToPixelI
+import xyz.apiote.bimba.czwek.journeys.JourneysActivity
+import xyz.apiote.bimba.czwek.repo.JourneyParams
+import xyz.apiote.bimba.czwek.repo.Place
+import xyz.apiote.bimba.czwek.repo.Position
+import xyz.apiote.bimba.czwek.repo.TimeReference
+import xyz.apiote.bimba.czwek.search.Query
+import xyz.apiote.bimba.czwek.search.Query.Mode
+import xyz.apiote.bimba.czwek.search.ResultsActivity
+import java.time.Instant
+import java.time.LocalDate
+import java.time.LocalTime
+import java.time.ZoneId
+
+class JourneyFragment : Fragment(), LocationListener {
+	companion object {
+		const val PLACE_KEY = "PLACE"
+	}
+
+	private var _binding: FragmentJourneyBinding? = null
+	private val binding get() = _binding!!
+
+	private lateinit var dashboard: MainActivity
+	private lateinit var viewModel: JourneyViewModel
+
+	private val activityLauncher =
+		registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
+			val place = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
+				it.data?.extras?.getParcelable(PLACE_KEY, Place::class.java)
+			} else {
+				@Suppress("DEPRECATION")
+				it.data?.extras?.getParcelable(PLACE_KEY)
+			}
+			place?.let {
+				dashboard.viewModel.set(viewModel.searchRequester!!, it)
+			}
+		}
+
+	override fun onCreateView(
+		inflater: LayoutInflater,
+		container: ViewGroup?,
+		savedInstanceState: Bundle?
+	): View {
+		viewModel = ViewModelProvider(this)[JourneyViewModel::class.java]
+
+		_binding = FragmentJourneyBinding.inflate(inflater, container, false)
+		val root: View = binding.root
+
+		dashboard = activity as MainActivity
+
+		dashboard.viewModel.textInputs[DashboardViewModel.ORIGIN_KEY] = binding.origin
+		dashboard.viewModel.textInputs[DashboardViewModel.DEST_KEY] = binding.destination
+
+		dashboard.viewModel.suggestions[DashboardViewModel.ORIGIN_KEY] = binding.originSuggestions
+		dashboard.viewModel.suggestions[DashboardViewModel.DEST_KEY] = binding.destinationSuggestions
+
+		ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
+			val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
+
+			binding.chipsParamsTime.updateLayoutParams<ViewGroup.MarginLayoutParams> {
+				if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
+					topMargin = insets.top + dpToPixelI(16f)
+				}
+			}
+
+			binding.originInput.updatePadding(left = insets.left, right = insets.right)
+			binding.originInput.updateLayoutParams<ViewGroup.MarginLayoutParams> {
+				topMargin = insets.top + dpToPixelI(16f)
+				windowInsets.displayCutout?.safeInsetLeft?.let {
+					leftMargin = it + dpToPixelI(16f)
+				}
+				windowInsets.displayCutout?.safeInsetRight?.let {
+					rightMargin = it + dpToPixelI(16f)
+				}
+			}
+			binding.originSuggestions.updatePadding(left = insets.left, right = insets.right)
+			binding.originSuggestions.updateLayoutParams<ViewGroup.MarginLayoutParams> {
+				windowInsets.displayCutout?.safeInsetLeft?.let {
+					leftMargin = it + dpToPixelI(16f)
+				}
+				windowInsets.displayCutout?.safeInsetRight?.let {
+					rightMargin = it + dpToPixelI(16f)
+				}
+			}
+			binding.destinationInput.updatePadding(left = insets.left, right = insets.right)
+			binding.destinationInput.updateLayoutParams<ViewGroup.MarginLayoutParams> {
+				windowInsets.displayCutout?.safeInsetLeft?.let {
+					leftMargin = it + dpToPixelI(16f)
+				}
+				windowInsets.displayCutout?.safeInsetRight?.let {
+					rightMargin = it + dpToPixelI(16f)
+				}
+			}
+			binding.destinationSuggestions.updatePadding(left = insets.left, right = insets.right)
+			binding.destinationSuggestions.updateLayoutParams<ViewGroup.MarginLayoutParams> {
+				windowInsets.displayCutout?.safeInsetLeft?.let {
+					leftMargin = it + dpToPixelI(16f)
+				}
+				windowInsets.displayCutout?.safeInsetRight?.let {
+					rightMargin = it + dpToPixelI(16f)
+				}
+			}
+			windowInsets
+		}
+
+		dashboard.hideBadge()
+		chipifyOrigin(dashboard.viewModel.data[DashboardViewModel.ORIGIN_KEY]!!.value)
+		chipifyDestination(dashboard.viewModel.data[DashboardViewModel.DEST_KEY]!!.value)
+
+		initSuggestions(DashboardViewModel.ORIGIN_KEY)
+		initSuggestions(DashboardViewModel.DEST_KEY)
+
+		binding.goButton.isEnabled =
+			dashboard.viewModel.data[DashboardViewModel.ORIGIN_KEY]!!.value != null && dashboard.viewModel.data[DashboardViewModel.DEST_KEY]!!.value != null
+
+		binding.goButton.setOnClickListener {
+			val intent = JourneysActivity.getIntent(
+				requireContext(),
+				dashboard.viewModel.data[DashboardViewModel.ORIGIN_KEY]!!.value!!,
+				dashboard.viewModel.data[DashboardViewModel.DEST_KEY]!!.value!!,
+				JourneyParams(
+					dashboard.viewModel.timeReference,
+					dashboard.viewModel.date?.let { epochMilli -> Instant.ofEpochMilli(epochMilli) }
+						?.atZone(ZoneId.systemDefault())?.toLocalDate(),
+					dashboard.viewModel.time,
+					dashboard.viewModel.wheelchairAccessible,
+					dashboard.viewModel.bicycle
+				)
+			)
+			startActivity(intent)
+		}
+
+		dashboard.viewModel.data[DashboardViewModel.ORIGIN_KEY]!!.observe(viewLifecycleOwner) {
+			chipifyOrigin(it)
+		}
+
+		dashboard.viewModel.data[DashboardViewModel.DEST_KEY]!!.observe(viewLifecycleOwner) {
+			chipifyDestination(it)
+		}
+
+		binding.origin.setOnKeyListener { v, keyCode, event ->
+			when (keyCode) {
+				KeyEvent.KEYCODE_ENTER -> {
+					if (event.action == KeyEvent.ACTION_UP) {
+						searchText(DashboardViewModel.ORIGIN_KEY)
+						true
+					} else {
+						false
+					}
+				}
+
+				else -> false
+			}
+		}
+
+		binding.destination.setOnKeyListener { v, keyCode, event ->
+			when (keyCode) {
+				KeyEvent.KEYCODE_ENTER -> {
+					if (event.action == KeyEvent.ACTION_UP) {
+						searchText(DashboardViewModel.DEST_KEY)
+						true
+					} else {
+						false
+					}
+				}
+
+				else -> false
+			}
+		}
+
+		binding.origin.addTextChangedListener(object : TextWatcher {
+			override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
+
+			override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
+
+			override fun afterTextChanged(s: Editable?) {
+				afterTextChanged(DashboardViewModel.ORIGIN_KEY, s)
+			}
+		})
+
+		binding.destination.addTextChangedListener(object : TextWatcher {
+			override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
+
+			override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
+
+			override fun afterTextChanged(s: Editable?) {
+				afterTextChanged(DashboardViewModel.DEST_KEY, s)
+			}
+		})
+
+		setTimeReference(dashboard.viewModel.timeReference.id())
+		binding.chipTimeReference.setOnClickListener {
+			val menu = PopupMenu(requireContext(), it)
+			menu.menu.add(
+				Menu.NONE,
+				TimeReference.DEPART_AFTER.id(),
+				TimeReference.DEPART_AFTER.ordinal,
+				R.string.depart_after
+			)
+			menu.menu.add(
+				Menu.NONE,
+				TimeReference.ARRIVE_BY.id(),
+				TimeReference.ARRIVE_BY.ordinal,
+				R.string.arrive_by
+			)
+			menu.setOnMenuItemClickListener {
+				setTimeReference(it.itemId)
+				true
+			}
+			menu.show()
+		}
+
+		if (dashboard.viewModel.date != null) {
+			binding.chipDate.text =
+				DateUtils.formatDateTime(
+					context,
+					dashboard.viewModel.date!!,
+					DateUtils.FORMAT_SHOW_DATE
+				)
+		} else {
+			binding.chipDate.setText(R.string.today)
+		}
+		binding.chipDate.setOnClickListener { _ ->
+			MaterialDatePicker.Builder.datePicker().setTitleText(R.string.title_select_date_journey)
+				.setNegativeButtonText(R.string.clear_date_selection)
+				.apply {
+					if (dashboard.viewModel.date != null) {
+						setSelection(dashboard.viewModel.date!!)
+					}
+				}
+				.build()
+				.apply {
+					addOnNegativeButtonClickListener { _ ->
+						dashboard.viewModel.date = null
+						binding.chipDate.setText(R.string.today)
+					}
+					addOnPositiveButtonClickListener { t ->
+						dashboard.viewModel.date = t
+						binding.chipDate.text =
+							DateUtils.formatDateTime(context, t, DateUtils.FORMAT_SHOW_DATE)
+					}
+				}.show((activity as MainActivity).supportFragmentManager, null)
+		}
+
+
+		if (dashboard.viewModel.date != null) {
+			binding.chipTime.text =
+				DateUtils.formatDateTime(
+					context,
+					dashboard.viewModel.time!!.atDate(LocalDate.now()).atZone(ZoneId.systemDefault())
+						.toEpochSecond() * 1000,
+					DateUtils.FORMAT_SHOW_TIME
+				)
+		} else {
+			binding.chipTime.setText(R.string.now)
+		}
+		binding.chipTime.setOnClickListener { _ ->
+			val picker = MaterialTimePicker.Builder().setTitleText(R.string.title_select_time_journey)
+				.setTimeFormat(TimeFormat.CLOCK_24H)
+				.setNegativeButtonText(R.string.clear_date_selection)
+				.apply {
+					if (dashboard.viewModel.time != null) {
+						setHour(dashboard.viewModel.time!!.hour)
+						setMinute(dashboard.viewModel.time!!.minute)
+					} else {
+						setHour(LocalTime.now().hour)
+						setMinute(LocalTime.now().minute)
+					}
+				}.build()
+
+			picker.apply {
+				addOnNegativeButtonClickListener { _ ->
+					dashboard.viewModel.time = null
+					binding.chipTime.setText(R.string.now)
+				}
+				addOnPositiveButtonClickListener { _ ->
+					dashboard.viewModel.time = LocalTime.of(picker.hour, picker.minute)
+					binding.chipTime.text =
+						DateUtils.formatDateTime(
+							context,
+							dashboard.viewModel.time!!.atDate(LocalDate.now()).atZone(ZoneId.systemDefault())
+								.toEpochSecond() * 1000,
+							DateUtils.FORMAT_SHOW_TIME
+						)
+				}
+			}.show((activity as MainActivity).supportFragmentManager, null)
+		}
+
+		binding.chipWheelchair.isChecked = dashboard.viewModel.wheelchairAccessible
+		binding.chipWheelchair.setOnClickListener {
+			dashboard.viewModel.wheelchairAccessible = binding.chipWheelchair.isChecked
+		}
+
+		binding.chipBike.isChecked = dashboard.viewModel.bicycle
+		binding.chipBike.setOnClickListener {
+			dashboard.viewModel.bicycle = binding.chipBike.isChecked
+		}
+
+		return root
+	}
+
+	private fun setTimeReference(option: Int) {
+		when (option) {
+			TimeReference.DEPART_AFTER.id() -> {
+				binding.chipTimeReference.setText(R.string.depart_after)
+				dashboard.viewModel.timeReference = TimeReference.DEPART_AFTER
+			}
+
+			TimeReference.ARRIVE_BY.id() -> {
+				binding.chipTimeReference.setText(R.string.arrive_by)
+				dashboard.viewModel.timeReference = TimeReference.ARRIVE_BY
+			}
+		}
+	}
+
+	private fun afterTextChanged(
+		source: String,
+		s: Editable?,
+	) {
+		val suggestions = dashboard.viewModel.suggestions[source]!!
+		if (s.isNullOrBlank()) {
+			dashboard.viewModel.spans[source] = ""
+			initSuggestions(source)
+			binding.goButton.isEnabled = false
+			return
+		}
+		binding.goButton.isEnabled =
+			s.toString().replace(
+				dashboard.viewModel.spans[source]!!,
+				""
+			) == "" && isOtherClean(source)
+
+		val q = Query(
+			dashboard.viewModel.textInputs[source]!!.text.toString()
+				.replace(dashboard.viewModel.spans[source]!!, "")
+		)
+		q.parse(requireContext())
+		if (q.mode in arrayOf(Mode.POSITION, Mode.LOCATION_PLUS_CODE)) {
+			val chip = layoutInflater.inflate(R.layout.chip_suggestion, suggestions, false) as Chip
+			chip.text = q.toString()
+			chip.isCheckable = false
+			chip.isChipIconVisible = true
+			chip.setChipIconResource(R.drawable.position)
+			chip.setOnClickListener {
+				if (q.mode == Mode.POSITION) {
+					dashboard.viewModel.set(
+						source,
+						Place(q.position!!.latitude, q.position!!.longitude)
+					)
+					initSuggestions(source)
+				} else {
+					setChipProgress(chip)
+					dashboard.viewModel.positionQueries[source] = q
+					viewModel.hereChipRequester = source
+					setHere(source)
+				}
+			}
+			initSuggestions(source)
+			suggestions.addView(chip)
+		} else if (q.mode == Mode.NAME) {
+			val chip = layoutInflater.inflate(R.layout.chip_suggestion, suggestions, false) as Chip
+			chip.text = q.toString()
+			chip.isCheckable = false
+			chip.isChipIconVisible = true
+			chip.setChipIconResource(R.drawable.search)
+			chip.setOnClickListener {
+				searchText(source)
+			}
+			initSuggestions(source)
+			suggestions.addView(chip)
+		} else {
+			initSuggestions(source)
+		}
+	}
+
+	fun initSuggestions(source: String) {
+		val suggestions = dashboard.viewModel.suggestions[source]!!
+		suggestions.removeAllViews()
+		val chip = layoutInflater.inflate(R.layout.chip_suggestion, suggestions, false) as Chip
+		chip.setText(R.string.here)
+		chip.isCheckable = false
+		chip.isChipIconVisible = true
+		chip.setChipIconResource(R.drawable.gps)
+		chip.setOnClickListener {
+			setChipProgress(chip)
+			setHere(source)
+		}
+		suggestions.addView(chip)
+	}
+
+	private fun getSearchText(source: String): String =
+		dashboard.viewModel.textInputs[source]!!.text.toString()
+			.replace(dashboard.viewModel.spans[source]!!, "")
+
+	private fun searchText(source: String) {
+		viewModel.searchRequester = source
+		val text = getSearchText(source)
+		if (text.isBlank()) {
+			return
+		}
+		activityLauncher.launch(
+			ResultsActivity.getIntent(
+				requireContext(),
+				Query(text),
+				true,
+				"transitous"
+			)
+		)
+	}
+
+	private fun isOriginClean(): Boolean = binding.origin.text.toString().let {
+		it.replace(dashboard.viewModel.spans[DashboardViewModel.ORIGIN_KEY]!!, "") == "" && it != ""
+	}
+
+	private fun isDestinationClean(): Boolean = binding.destination.text.toString().let {
+		it.replace(dashboard.viewModel.spans[DashboardViewModel.DEST_KEY]!!, "") == "" && it != ""
+	}
+
+	private fun isOtherClean(source: String): Boolean =
+		if (source == DashboardViewModel.ORIGIN_KEY) {
+			isDestinationClean()
+		} else if (source == DashboardViewModel.DEST_KEY) {
+			isOriginClean()
+		} else {
+			throw IllegalArgumentException("source must be one of ${DashboardViewModel.ORIGIN_KEY}, ${DashboardViewModel.DEST_KEY}. found $source")
+		}
+
+	private fun chipifyOrigin(place: Place?) {
+		val source = DashboardViewModel.ORIGIN_KEY
+		val otherSource = DashboardViewModel.otherSource(source)
+		if (place != null) {
+			chipify(place, source)
+			dashboard.viewModel.spans[source] = place.shortString()
+			if (dashboard.viewModel.data[otherSource]!!.value != null && isDestinationClean()) {
+				binding.goButton.isEnabled = true
+			}
+		} else {
+			binding.origin.setText("")
+			binding.goButton.isEnabled = false
+		}
+	}
+
+	private fun chipifyDestination(place: Place?) {
+		val source = DashboardViewModel.DEST_KEY
+		val otherSource = DashboardViewModel.otherSource(source)
+		if (place != null) {
+			chipify(place, source)
+			dashboard.viewModel.spans[source] = place.shortString()
+			if (dashboard.viewModel.data[otherSource]!!.value != null && isOriginClean()) {
+				binding.goButton.isEnabled = true
+			}
+		} else {
+			binding.destination.setText("")
+			binding.goButton.isEnabled = false
+		}
+	}
+
+	private fun chipify(place: Place, source: String) {
+		val textView = dashboard.viewModel.textInputs[source]!!
+		val text = place.shortString()
+		textView.setText(text)
+		var chip: ChipDrawable? = ChipDrawable.createFromResource(requireContext(), R.xml.journey_chip)
+		chip!!.text = text
+		val ld = LayerDrawable(arrayOf(chip)).apply {
+			setLayerInset(0, dpToPixelI(4f), 0, dpToPixelI(4f), 0)
+			setBounds(0, 0, chip.intrinsicWidth + 24, chip.intrinsicHeight)
+		}
+		val span = ImageSpan(ld)
+		textView.text?.setSpan(span, 0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+		@SuppressLint("ClickableViewAccessibility")
+		textView.setOnTouchListener { v, e ->
+			v.performClick()
+			if (chip != null) {
+				val chipContentRect = RectF()
+				val chipCloseRect = RectF()
+				chip!!.getChipTouchBounds(chipContentRect)
+				chip!!.getCloseIconTouchBounds(chipCloseRect)
+				if (e.x > textView.totalPaddingLeft && e.x < textView.totalPaddingLeft + chipContentRect.right
+					&& e.y > textView.totalPaddingTop && e.y < textView.totalPaddingTop + chipContentRect.bottom
+				) {
+					if (e.action == ACTION_UP) {
+						// TODO popup
+						Log.i("Touch", "content")
+					}
+					true
+				} else if (e.x > textView.totalPaddingLeft + chipContentRect.right && e.x < textView.totalPaddingLeft + chipCloseRect.right
+					&& e.y > textView.totalPaddingTop && e.y < textView.totalPaddingTop + chipCloseRect.bottom
+				) {
+					if (e.action == ACTION_UP) {
+						dashboard.viewModel.unset(source)
+						chip = null
+					}
+					true
+				} else {
+					false
+				}
+			} else {
+				false
+			}
+		}
+
+		initSuggestions(source)
+	}
+
+	private fun setHere(source: String) {
+		viewModel.hereChipRequester = source
+		if (dashboard.onGpsClicked(this)) {
+			try {
+				val locationManager =
+					requireContext().getSystemService(Context.LOCATION_SERVICE) as LocationManager
+				locationManager.requestLocationUpdates(
+					LocationManager.GPS_PROVIDER, 1000 * 60 * 10, 100f, this
+				)
+				locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
+					?.let { onLocationChanged(it) }
+			} catch (_: SecurityException) {
+				Log.wtf(
+					"locate",
+					"this shouldn’t happen because we don’t run this without location permission"
+				)
+			}
+		}
+	}
+
+	override fun onDestroyView() {
+		super.onDestroyView()
+		_binding = null
+	}
+
+	override fun onSaveInstanceState(outState: Bundle) {
+		super.onSaveInstanceState(outState)
+		outState.putString(DashboardViewModel.ORIGIN_KEY, getSearchText(DashboardViewModel.ORIGIN_KEY))
+		outState.putString(DashboardViewModel.DEST_KEY, getSearchText(DashboardViewModel.DEST_KEY))
+	}
+
+	override fun onViewStateRestored(savedInstanceState: Bundle?) {
+		super.onViewStateRestored(savedInstanceState)
+
+		if (savedInstanceState != null) {
+			arrayOf(DashboardViewModel.ORIGIN_KEY, DashboardViewModel.DEST_KEY).forEach { source ->
+				val searchString = savedInstanceState.getString(source) ?: ""
+				if (searchString != "") {
+					binding.origin.setText(searchString)
+				}
+			}
+		}
+	}
+
+	override fun onLocationChanged(location: Location) {
+		viewModel.hereChipRequester?.let {
+			val query = dashboard.viewModel.positionQueries[it]
+			val position = if (query != null && query.mode == Mode.LOCATION_PLUS_CODE) {
+				OpenLocationCode(query.raw).recover(location.latitude, location.longitude).decode().let {
+					viewModel.loadingChip?.setChipIconResource(R.drawable.position)
+					Position(it.centerLatitude, it.centerLatitude)
+				}
+			} else {
+				viewModel.loadingChip?.setChipIconResource(R.drawable.gps_black)
+				Position(location.latitude, location.longitude)
+			}
+			dashboard.viewModel.set(
+				it,
+				Place(position.latitude, position.longitude)
+			)
+			dashboard.viewModel.positionQueries[it] = null
+			initSuggestions(it)
+		}
+		viewModel.hereChipRequester = null
+	}
+
+	private fun setChipProgress(chip: Chip) {
+		viewModel.loadingChip = chip
+		chip.chipIcon = CircularProgressDrawable(requireContext()).apply {
+			setStyle(CircularProgressDrawable.DEFAULT)
+			start()
+		}
+	}
+}
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyViewModel.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyViewModel.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d26d70d8a50adccd3e5487d7a304369bcdd1ae7f
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyViewModel.kt
@@ -0,0 +1,19 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.dashboard.ui.journey
+
+import android.annotation.SuppressLint
+import androidx.lifecycle.ViewModel
+import com.google.android.material.chip.Chip
+
+class JourneyViewModel : ViewModel() {
+
+	var hereChipRequester: String? = null
+	var searchRequester: String? = null
+
+	@SuppressLint("StaticFieldLeak")
+	var loadingChip: Chip? = null
+
+}




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/map/MapFragment.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/map/MapFragment.kt
index 65339fd2b8ef9eed82359fd09bd00e3bea0bce44..84abcd97aaf73ca976eba8b0614e9ae59e24d8df 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/map/MapFragment.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/map/MapFragment.kt
@@ -34,12 +34,14 @@ import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProvider
 import com.google.android.material.snackbar.Snackbar
 import org.osmdroid.config.Configuration
+import org.osmdroid.events.MapEventsReceiver
 import org.osmdroid.events.MapListener
 import org.osmdroid.events.ScrollEvent
 import org.osmdroid.events.ZoomEvent
 import org.osmdroid.tileprovider.tilesource.TileSourceFactory
 import org.osmdroid.util.GeoPoint
 import org.osmdroid.views.CustomZoomButtonsController
+import org.osmdroid.views.overlay.MapEventsOverlay
 import org.osmdroid.views.overlay.Marker
 import org.osmdroid.views.overlay.TilesOverlay
 import org.osmdroid.views.overlay.gestures.RotationGestureOverlay
@@ -50,6 +52,7 @@ import xyz.apiote.bimba.czwek.dashboard.MainActivity
 import xyz.apiote.bimba.czwek.databinding.FragmentMapBinding
 import xyz.apiote.bimba.czwek.dpToPixelI
 import xyz.apiote.bimba.czwek.repo.ErrorLocatable
+import xyz.apiote.bimba.czwek.repo.Place
 import xyz.apiote.bimba.czwek.repo.Position
 import xyz.apiote.bimba.czwek.repo.Stop
 import xyz.apiote.bimba.czwek.repo.Vehicle
@@ -62,6 +65,7 @@ 		const val PREFERENCES_NAME = "shp"
 		const val ZOOM_KEY = "mapZoom"
 		const val CENTRE_LATITUDE_KEY = "mapCentreLat"
 		const val CENTRE_LONGITUDE_KEY = "mapCentreLon"
+		const val PLACE_MARKER = "PLACE"
 	}
 
 	private var maybeBinding: FragmentMapBinding? = null
@@ -74,6 +78,7 @@ 	private val handler = Handler(Looper.getMainLooper())
 	private var workRunnable = Runnable {}
 
 	private var snack: Snackbar? = null
+	private lateinit var placeMarker: Marker
 
 	@SuppressLint("ClickableViewAccessibility")
 	override fun onCreateView(
@@ -133,6 +138,38 @@ 				return true
 			}
 		})
 
+
+		placeMarker = Marker(binding.map)
+		placeMarker.id = PLACE_MARKER
+		placeMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
+		placeMarker.icon = AppCompatResources.getDrawable(requireContext(), R.drawable.pin)
+
+		binding.map.overlays.add(MapEventsOverlay(object : MapEventsReceiver {
+			override fun singleTapConfirmedHelper(p: GeoPoint?): Boolean {
+				return false
+			}
+
+			override fun longPressHelper(p: GeoPoint?): Boolean {
+				if (p == null) {
+					return false
+				}
+				binding.map.overlays.remove(placeMarker)
+				placeMarker.position = p
+				binding.map.overlays.add(placeMarker)
+				binding.map.invalidate()
+
+				val s = PlaceBottomSheet(requireContext(), Place(p.latitude, p.longitude)) {positionUsed ->
+					if (positionUsed) {
+						(activity as MainActivity).showBadge()
+					}
+					binding.map.overlays.remove(placeMarker)
+					binding.map.invalidate()
+				}
+				s.show((activity as MainActivity).supportFragmentManager, PlaceBottomSheet.TAG)
+				return true
+			}
+		}))
+
 		binding.map.setOnTouchListener { _, _ ->
 			binding.floatingActionButton.show()
 			false
@@ -188,7 +225,7 @@
 	private fun observeLocatables() {
 		mapViewModel.locatables.observe(viewLifecycleOwner) {
 			binding.map.overlays.removeAll { marker ->
-				marker is Marker
+				marker is Marker && marker.id != PLACE_MARKER
 			}
 
 			if (it.size == 1 && it[0] is ErrorLocatable) {




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/map/MapViewModel.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/map/MapViewModel.kt
index ceeb223f0fc4e4f66c0e9c81fda2a79c08c586f0..27534f233b5c82f43fc42cf487d0f21172bccefd 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/map/MapViewModel.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/map/MapViewModel.kt
@@ -6,6 +6,7 @@ package xyz.apiote.bimba.czwek.dashboard.ui.map
 
 import android.content.ActivityNotFoundException
 import android.content.Context
+import android.content.DialogInterface
 import android.content.Intent
 import android.net.Uri
 import android.os.Bundle
@@ -26,11 +27,14 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment
 import kotlinx.coroutines.launch
 import org.osmdroid.views.MapView
 import xyz.apiote.bimba.czwek.R
+import xyz.apiote.bimba.czwek.dashboard.DashboardViewModel
+import xyz.apiote.bimba.czwek.dashboard.MainActivity
 import xyz.apiote.bimba.czwek.departures.DeparturesActivity
 import xyz.apiote.bimba.czwek.repo.CongestionLevel
 import xyz.apiote.bimba.czwek.repo.Locatable
 import xyz.apiote.bimba.czwek.repo.OccupancyStatus
 import xyz.apiote.bimba.czwek.repo.OnlineRepository
+import xyz.apiote.bimba.czwek.repo.Place
 import xyz.apiote.bimba.czwek.repo.Position
 import xyz.apiote.bimba.czwek.repo.Stop
 import xyz.apiote.bimba.czwek.repo.TrafficResponseException
@@ -57,6 +61,40 @@ 		}
 	}
 }
 
+class PlaceBottomSheet(private val context: Context, private val place: Place, private val onDismiss: (Boolean) -> Unit) : BottomSheetDialogFragment() {
+	companion object {
+		const val TAG = "PlaceBottomSheet"
+	}
+
+	private var positionUsed = false
+
+	override fun onCreateView(
+		inflater: LayoutInflater,
+		container: ViewGroup?,
+		savedInstanceState: Bundle?
+	): View {
+		val view = inflater.inflate(R.layout.place_bottom_sheet, container, false)
+		view.findViewById<TextView>(R.id.coordinates).text = "${place.latitude}, ${place.longitude}"
+		view.findViewById<Button>(R.id.use_as_origin).setOnClickListener {
+			(activity as MainActivity).viewModel.set(DashboardViewModel.ORIGIN_KEY, place)
+			positionUsed = true
+			dismiss()
+		}
+		view.findViewById<Button>(R.id.use_as_destination).setOnClickListener {
+			(activity as MainActivity).viewModel.set(DashboardViewModel.DEST_KEY, place)
+			positionUsed = true
+			dismiss()
+		}
+
+		return view
+	}
+
+	override fun onDismiss(dialog: DialogInterface) {
+		onDismiss(positionUsed)
+		super.onDismiss(dialog)
+	}
+}
+
 class MapBottomSheet(private val locatable: Locatable) : BottomSheetDialogFragment() {
 	companion object {
 		const val TAG = "MapBottomSheet"
@@ -168,7 +206,15 @@ 	private fun showStop(content: View, stop: Stop) {
 		context?.let { ctx ->
 			content.findViewById<TextView>(R.id.stop_name).text = stop.name
 			content.findViewById<Button>(R.id.departures_button).setOnClickListener {
-				startActivity(DeparturesActivity.getIntent(requireContext(), stop.code, stop.name, stop.feedID!!, true))
+				startActivity(
+					DeparturesActivity.getIntent(
+						requireContext(),
+						stop.code,
+						stop.name,
+						stop.feedID!!,
+						true
+					)
+				)
 			}
 			content.findViewById<Button>(R.id.navigation_button).setOnClickListener {
 				try {
@@ -183,12 +229,32 @@ 					Toast.makeText(context, ctx.getString(R.string.no_map_app), Toast.LENGTH_SHORT).show()
 				}
 			}
 
+			content.findViewById<Button>(R.id.use_as_origin).setOnClickListener {
+				(activity as MainActivity).viewModel.set(DashboardViewModel.ORIGIN_KEY, Place(stop, stop.location().latitude, stop.location().longitude))
+				(ctx as MainActivity).showBadge()
+				dismiss()
+			}
+
+			content.findViewById<Button>(R.id.use_as_destination).setOnClickListener {
+				(activity as MainActivity).viewModel.set(DashboardViewModel.DEST_KEY, Place(stop, stop.location().latitude, stop.location().longitude))
+				(ctx as MainActivity).showBadge()
+				dismiss()
+			}
+
 			stop.changeOptions(ctx, Stop.LineDecoration.NONE).let { changeOptions ->
 				content.findViewById<TextView>(R.id.change_options).apply {
 					text = changeOptions.first
 					contentDescription = changeOptions.second
 				}
 			}
+		}
+
+		if (stop.feedID == "transitous") {
+			content.findViewById<Button>(R.id.use_as_destination).visibility = View.VISIBLE
+			content.findViewById<Button>(R.id.use_as_origin).visibility = View.VISIBLE
+		} else {
+			content.findViewById<Button>(R.id.use_as_destination).visibility = View.GONE
+			content.findViewById<Button>(R.id.use_as_origin).visibility = View.GONE
 		}
 	}
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/voyage/VoyageFragment.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/voyage/VoyageFragment.kt
deleted file mode 100644
index dd4e43a5b5dced04c16bdedb0ec15706f9b978bc..0000000000000000000000000000000000000000
--- a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/voyage/VoyageFragment.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-// SPDX-FileCopyrightText: Adam Evyčędo
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-package xyz.apiote.bimba.czwek.dashboard.ui.voyage
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import xyz.apiote.bimba.czwek.databinding.FragmentVoyageBinding
-
-class VoyageFragment : Fragment() {
-
-	private var _binding: FragmentVoyageBinding? = null
-
-	// This property is only valid between onCreateView and
-	// onDestroyView.
-	private val binding get() = _binding!!
-
-	override fun onCreateView(
-		inflater: LayoutInflater,
-		container: ViewGroup?,
-		savedInstanceState: Bundle?
-	): View {
-		val voyageViewModel =
-			ViewModelProvider(this)[VoyageViewModel::class.java]
-
-		_binding = FragmentVoyageBinding.inflate(inflater, container, false)
-		val root: View = binding.root
-
-		val textView: TextView = binding.textDashboard
-		voyageViewModel.text.observe(viewLifecycleOwner) {
-			textView.text = it
-		}
-		return root
-	}
-
-	override fun onDestroyView() {
-		super.onDestroyView()
-		_binding = null
-	}
-}
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/voyage/VoyageViewModel.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/voyage/VoyageViewModel.kt
deleted file mode 100644
index 7791ee8b3f17def24bd3200525907f396708e7a1..0000000000000000000000000000000000000000
--- a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/voyage/VoyageViewModel.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-// SPDX-FileCopyrightText: Adam Evyčędo
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-package xyz.apiote.bimba.czwek.dashboard.ui.voyage
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.ViewModel
-
-class VoyageViewModel : ViewModel() {
-
-	private val _text = MutableLiveData<String>().apply {
-		value = "This is voyage Fragment"
-	}
-	val text: LiveData<String> = _text
-}
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/journeys/Journeys.kt b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/Journeys.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ff1d71676d397e60dcf7203f80d6cfa180069dc9
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/Journeys.kt
@@ -0,0 +1,166 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.journeys
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView.ViewHolder
+import com.google.android.material.card.MaterialCardView
+import xyz.apiote.bimba.czwek.R
+import xyz.apiote.bimba.czwek.repo.Journey
+import xyz.apiote.bimba.czwek.units.UnitSystem
+
+class JourneysViewHolder(itemView: View) : ViewHolder(itemView) {
+	val root: MaterialCardView = itemView.findViewById(R.id.journey)
+	val startTime: TextView = itemView.findViewById(R.id.start_time)
+	val lines: TextView = itemView.findViewById(R.id.lines)
+	val endTime: TextView = itemView.findViewById(R.id.end_time)
+	val legs: LinearLayout = itemView.findViewById(R.id.legs)
+
+	companion object {
+		fun bind(
+			holder: JourneysViewHolder,
+			onClickListener: (Journey, Int) -> Unit,
+			journey: Journey,
+			context: Context,
+			inflater: LayoutInflater,
+			isOpen: Boolean,
+			position: Int
+		) {
+			holder.root.setOnClickListener {
+				onClickListener(journey, position)
+			}
+			holder.startTime.text =
+				context.getString(R.string.time, journey.startTime.hour, journey.startTime.minute)
+			holder.endTime.text =
+				context.getString(R.string.time, journey.endTime.hour, journey.endTime.minute)
+			holder.lines.text =
+				journey.legs.map { it.start.vehicle.Line.name }.filter { it.isNotBlank() }.joinToString()
+
+			holder.legs.removeAllViews()
+			journey.legs.forEach {
+				@SuppressLint("InflateParams")
+				val legView = inflater.inflate(R.layout.journey_leg, null, false)
+
+				val legOrigin = legView.findViewById<TextView>(R.id.leg_origin)
+				if (it.origin.stop.name.isBlank() || it.origin.stop.name in arrayOf("START", "END")) {
+					legOrigin.visibility = View.GONE
+				} else {
+					legOrigin.apply {
+						text = it.origin.stop.name
+						visibility = View.VISIBLE
+					}
+				}
+
+				val legOriginTime = legView.findViewById<TextView>(R.id.leg_origin_time)
+				legOriginTime.text = context.getString(
+					R.string.time,
+					it.start.departureTime!!.Hour.toInt(),
+					it.start.departureTime.Minute.toInt()
+				)
+
+				val legModeImage = legView.findViewById<ImageView>(R.id.leg_mode_image)
+				legModeImage.setImageDrawable(it.start.vehicle.Line.icon(context))
+				// TODO legModeImage.contentDescription = translate "leg mode: $mode"
+
+				val legLine = legView.findViewById<TextView>(R.id.leg_line)
+				legLine.apply {
+					if (it.start.vehicle.Line.name.isBlank()) {
+						visibility = View.GONE
+					} else {
+						visibility = View.VISIBLE
+						text = it.start.vehicle.Line.name
+					}
+				}
+
+				val distance = legView.findViewById<TextView>(R.id.leg_distance)
+				distance.text = if (it.start.vehicle.Line.name.isBlank() && it.distance != null) {
+					val us = UnitSystem.getSelected(context)
+					us.toString(context, it.distance)
+				} else {
+					val headsign = it.start.vehicle.Headsign
+					val stops = context.resources.getQuantityString(
+						R.plurals.number_stops,
+						it.intermediateStops.size + 1,
+						it.intermediateStops.size + 1
+					)
+
+					context.getString(R.string.journey_stops_headsign, stops, headsign)
+				}
+
+				val legDestination = legView.findViewById<TextView>(R.id.leg_destination)
+				if (it.destination.stop.name.isBlank() || it.destination.stop.name in arrayOf("START", "END")) {
+					legDestination.visibility = View.GONE
+				} else {
+					legDestination.apply {
+						text = it.destination.stop.name
+						visibility = View.VISIBLE
+					}
+				}
+
+				val legDestinationTime = legView.findViewById<TextView>(R.id.leg_destination_time)
+				legDestinationTime.text =
+					context.getString(
+						R.string.time,
+						it.end.arrivalTime!!.Hour.toInt(),
+						it.end.arrivalTime.Minute.toInt()
+					)
+
+				holder.legs.addView(legView)
+			}
+			holder.legs.visibility = if (isOpen) View.VISIBLE else View.GONE
+		}
+	}
+}
+
+class JourneysAdapter(
+	private val inflater: LayoutInflater,
+	private val context: Context,
+	private var items: List<Journey>,
+	private val onClickListener: ((Journey, Boolean) -> Unit),
+) :
+	RecyclerView.Adapter<JourneysViewHolder>() {
+	var openCard: Int = -1
+
+	val onClickListener2: ((Journey, Int) -> Unit) = { journey, position ->
+		val previouslyOpen = openCard
+		openCard = if (position == openCard) -1 else position
+		notifyItemChanged(previouslyOpen)
+		notifyItemChanged(position)
+		onClickListener(journey, openCard == -1)
+	}
+
+	override fun onCreateViewHolder(
+		parent: ViewGroup,
+		viewType: Int
+	): JourneysViewHolder {
+		val rowView = inflater.inflate(R.layout.journey, parent, false)
+		return JourneysViewHolder(rowView)
+	}
+
+	override fun onBindViewHolder(
+		holder: JourneysViewHolder,
+		position: Int
+	) {
+		JourneysViewHolder.bind(
+			holder,
+			onClickListener2,
+			items[position],
+			context,
+			inflater,
+			openCard == position,
+			position
+		)
+	}
+
+	override fun getItemCount(): Int = items.size
+}
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysActivity.kt b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ad9c1ea0427a21dabd5fbd54f144587e85f027dd
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysActivity.kt
@@ -0,0 +1,240 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.journeys
+
+import android.content.Context
+import android.content.Intent
+import android.content.res.Configuration
+import android.content.res.Configuration.UI_MODE_NIGHT_MASK
+import android.content.res.Configuration.UI_MODE_NIGHT_UNDEFINED
+import android.content.res.Configuration.UI_MODE_NIGHT_YES
+import android.graphics.DashPathEffect
+import android.os.Build
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.content.res.AppCompatResources
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.doOnPreDraw
+import androidx.core.view.updateLayoutParams
+import androidx.core.view.updatePadding
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.google.android.material.sidesheet.SideSheetBehavior
+import org.osmdroid.tileprovider.tilesource.TileSourceFactory
+import org.osmdroid.util.BoundingBox
+import org.osmdroid.util.GeoPoint
+import org.osmdroid.views.CustomZoomButtonsController
+import org.osmdroid.views.overlay.Marker
+import org.osmdroid.views.overlay.Polyline
+import org.osmdroid.views.overlay.TilesOverlay
+import org.osmdroid.views.overlay.gestures.RotationGestureOverlay
+import xyz.apiote.bimba.czwek.R
+import xyz.apiote.bimba.czwek.databinding.ActivityJourneysBinding
+import xyz.apiote.bimba.czwek.dpToPixelI
+import xyz.apiote.bimba.czwek.repo.Colour
+import xyz.apiote.bimba.czwek.repo.JourneyParams
+import xyz.apiote.bimba.czwek.repo.Place
+import xyz.apiote.bimba.czwek.repo.Position
+import kotlin.math.max
+import kotlin.math.min
+
+
+class JourneysActivity : AppCompatActivity() {
+	private lateinit var binding: ActivityJourneysBinding
+	private lateinit var journeysViewModel: JourneysViewModel
+
+	companion object {
+		const val ORIGIN_PARAM = "origin"
+		const val DESTINATION_PARAM = "destination"
+		const val PARAMS_PARAM = "params"
+
+		fun getIntent(
+			context: Context, origin: Place, destination: Place, params: JourneyParams
+		) = Intent(context, JourneysActivity::class.java).apply {
+			putExtra(ORIGIN_PARAM, origin)
+			putExtra(DESTINATION_PARAM, destination)
+			putExtra(PARAMS_PARAM, params)
+		}
+	}
+
+	private fun getOrigin(): Place = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
+		intent.getParcelableExtra(ORIGIN_PARAM, Place::class.java)
+	} else {
+		@Suppress("DEPRECATION") intent.getParcelableExtra(ORIGIN_PARAM)
+	} ?: throw Exception("Origin not given")
+
+	private fun getDestination(): Place = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
+		intent.getParcelableExtra(DESTINATION_PARAM, Place::class.java)
+	} else {
+		@Suppress("DEPRECATION") intent.getParcelableExtra(DESTINATION_PARAM)
+	} ?: throw Exception("Destination not given")
+
+	private fun getJourneyParams(): JourneyParams =
+		if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
+			intent.getParcelableExtra(PARAMS_PARAM, JourneyParams::class.java)
+		} else {
+			@Suppress("DEPRECATION") intent.getParcelableExtra(PARAMS_PARAM)
+		} ?: throw Exception("Params not given")
+
+	override fun onCreate(savedInstanceState: Bundle?) {
+		enableEdgeToEdge()
+		super.onCreate(savedInstanceState)
+		binding = ActivityJourneysBinding.inflate(layoutInflater)
+		setContentView(binding.root)
+		journeysViewModel = ViewModelProvider(this)[JourneysViewModel::class.java]
+
+		ViewCompat.setOnApplyWindowInsetsListener(binding.journeys) { v, windowInsets ->
+			val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
+			val l = windowInsets.displayCutout?.safeInsetLeft?.takeIf { it > 0 } ?: insets.left
+			v.updatePadding(bottom = insets.bottom + dpToPixelI(16f), left = l)
+			v.updateLayoutParams<ViewGroup.MarginLayoutParams> {
+				if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
+					topMargin = insets.top + dpToPixelI(16f)
+				}
+			}
+			WindowInsetsCompat.CONSUMED
+		}
+
+		binding.map.setTileSource(TileSourceFactory.MAPNIK)
+		if (((resources?.configuration?.uiMode
+				?: UI_MODE_NIGHT_UNDEFINED) and UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES
+		) {
+			binding.map.overlayManager.tilesOverlay.setColorFilter(TilesOverlay.INVERT_COLORS)
+		}
+		binding.map.zoomController.setVisibility(CustomZoomButtonsController.Visibility.NEVER)
+		binding.map.maxZoomLevel = 21.5
+		binding.map.minZoomLevel = 5.5
+		binding.map.setMultiTouchControls(true)
+		binding.map.overlays.add(RotationGestureOverlay(binding.map).apply { isEnabled = true })
+
+		binding.journeys.layoutManager = LinearLayoutManager(this)
+
+		val origin = getOrigin()
+		val destination = getDestination()
+		val params = getJourneyParams()
+
+		journeysViewModel.journeys.observe(this) {
+			binding.journeysProgress.visibility = View.GONE
+			if (it.isEmpty()) {
+				binding.emptyText.visibility = View.VISIBLE
+				binding.emptyImage.visibility = View.VISIBLE
+			} else {
+				showMarkers(origin.position(), destination.position())
+
+				binding.journeys.visibility = View.VISIBLE
+
+				binding.journeys.adapter = JourneysAdapter(layoutInflater, this, it) { journey, hide ->
+					binding.map.overlays.removeAll { true }
+
+					if (hide) {
+						showMarkers(origin.position(), destination.position())
+						binding.map.invalidate()
+						return@JourneysAdapter
+					}
+
+					showMarkers(journey.legs[0].origin.position(), journey.legs[0].origin.position())
+					showMarkers(
+						journey.legs.last().destination.position(), journey.legs.last().destination.position()
+					)
+
+					journey.legs.forEachIndexed { i, leg ->
+						val shapePoints = leg.shape.map {
+							GeoPoint(it.latitude, it.longitude)
+						}
+						val contrastShape = Polyline()
+						val contrastPaint = contrastShape.outlinePaint
+						contrastPaint.color =
+							Colour.getThemeColour(com.google.android.material.R.attr.colorOnBackground, this)
+						contrastPaint.strokeWidth = contrastPaint.strokeWidth * 1.5f
+						contrastShape.setPoints(shapePoints)
+						binding.map.overlays.add(contrastShape)
+
+						val shape = Polyline()
+						val paint = shape.outlinePaint
+						paint.color = leg.start.vehicle.Line.colour.toInt()
+						if (leg.start.vehicle.Line.kind.isActive()) {
+							paint.setPathEffect(DashPathEffect(floatArrayOf(10f, 10f), 0f))
+							paint.color = Colour.getThemeColour(
+								com.google.android.material.R.attr.colorSurfaceContainer, this
+							)
+						}
+						shape.setPoints(shapePoints)
+						binding.map.overlays.add(shape)
+					}
+					binding.map.invalidate()
+					zoomMap(
+						dpToPixelI(100f),
+						BoundingBox(
+							max(journey.legs[0].origin.latitude, journey.legs.last().destination.latitude),
+							max(journey.legs[0].origin.longitude, journey.legs.last().destination.longitude),
+							min(journey.legs[0].origin.latitude, journey.legs.last().destination.latitude),
+							min(journey.legs[0].origin.longitude, journey.legs.last().destination.longitude),
+						)
+					)
+				}
+			}
+		}
+		journeysViewModel.getJourneys(this, origin, destination, params)
+
+		val ssb = binding.journeysSideSheet?.let {
+			SideSheetBehavior.from<ConstraintLayout>(it)
+		}
+		ssb?.expand()
+	}
+
+	override fun onResume() {
+		super.onResume()
+		binding.map.doOnPreDraw {
+			zoomMap(dpToPixelI(100f))
+			val origin = getOrigin()
+			val destination = getDestination()
+			showMarkers(origin.position(), destination.position())
+			binding.map.invalidate()
+		}
+	}
+
+	fun zoomMap(margin: Int = 0, box: BoundingBox? = null) {
+		val origin = getOrigin()
+		val destination = getDestination()
+		val bb = box ?: BoundingBox(
+			max(origin.latitude, destination.latitude),
+			max(origin.longitude, destination.longitude),
+			min(origin.latitude, destination.latitude),
+			min(origin.longitude, destination.longitude),
+		)
+		binding.map.zoomToBoundingBox(bb, false, margin)
+	}
+
+	fun showMarkers(origin: Position, destination: Position) {
+		val originMarker = Marker(binding.map).apply {
+			position = GeoPoint(origin.latitude, origin.longitude)
+			setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
+			icon = AppCompatResources.getDrawable(
+				this@JourneysActivity, R.drawable.pin
+			)
+			setOnMarkerClickListener { marker, map ->
+				true
+			}
+		}
+		binding.map.overlays.add(originMarker)
+
+		val destinationMarker = Marker(binding.map).apply {
+			position = GeoPoint(destination.latitude, destination.longitude)
+			setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM)
+			icon = AppCompatResources.getDrawable(
+				this@JourneysActivity, R.drawable.pin
+			)
+			setOnMarkerClickListener { marker, map ->
+				true
+			}
+		}
+		binding.map.overlays.add(destinationMarker)
+	}
+}
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysViewModel.kt b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysViewModel.kt
new file mode 100644
index 0000000000000000000000000000000000000000..961dd33b1e600b758ad71fb0098aeb8925628eb8
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysViewModel.kt
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+package xyz.apiote.bimba.czwek.journeys
+
+import android.content.Context
+import android.util.Log
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import kotlinx.coroutines.launch
+import xyz.apiote.bimba.czwek.repo.Journey
+import xyz.apiote.bimba.czwek.repo.JourneyParams
+import xyz.apiote.bimba.czwek.repo.Place
+import java.net.SocketTimeoutException
+
+class JourneysViewModel : ViewModel() {
+
+	private val _journeys = MutableLiveData<List<Journey>>()
+	val journeys: LiveData<List<Journey>> = _journeys
+
+	// FIXME when not in foreground, throws java.net.SocketException: Software caused connection abort
+	fun getJourneys(context: Context, origin: Place, destination: Place, params: JourneyParams) {
+		viewModelScope.launch {
+			try {
+				_journeys.value =
+					xyz.apiote.bimba.czwek.api.getJourney(origin, destination, params, context)
+			} catch (e: SocketTimeoutException) {
+				_journeys.value = emptyList<Journey>()
+				Log.e("Journeys", "timeout: $e")
+			}
+		}
+	}
+}




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/ChangeOption.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/ChangeOption.kt
index 110e85d8f3bea00613dcb3c89ed024dac1a4f4f4..0ada3ee4188402935fc57d74074377addb39ee71 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/ChangeOption.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/ChangeOption.kt
@@ -4,10 +4,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.repo
 
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
 import xyz.apiote.bimba.czwek.api.ChangeOptionV1
 import xyz.apiote.bimba.czwek.api.ChangeOptionV2
 
-data class ChangeOption(val line: LineStub, val headsigns: List<String>) {
+@Parcelize
+data class ChangeOption(val line: LineStub, val headsigns: List<String>): Parcelable {
 	constructor(c: ChangeOptionV1) : this(LineStub(c.line, LineType.UNKNOWN, Colour(0u,0u,0u)), listOf(c.headsign))
 	constructor(c: ChangeOptionV2) : this(LineStub(c.line), c.headsigns)
 }
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Colour.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Colour.kt
index 01fea09a4f4c194afb4d5092864db448f821989b..24d3cdd91d221e201e1e3ce228981dfb7ca29983 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Colour.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Colour.kt
@@ -4,9 +4,15 @@ // SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.repo
 
+import android.content.Context
+import android.content.res.TypedArray
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import xyz.apiote.bimba.czwek.R
 import xyz.apiote.bimba.czwek.api.ColourV1
 
-data class Colour(val R: UByte, val G: UByte, val B: UByte) {
+@Parcelize
+data class Colour(val R: UByte, val G: UByte, val B: UByte): Parcelable {
 	constructor(c: ColourV1) : this(c.R, c.G, c.B)
 
 	fun toInt(): Int {
@@ -30,6 +36,15 @@ 					val b = it.substring(4 until 6).toUByte(16)
 					Colour(r, g, b)
 				}
 			}
+		}
+
+		fun getThemeColour(resource: Int, context: Context): Int {
+			val a: TypedArray = context.theme.obtainStyledAttributes(
+				R.style.Theme_Bimba, intArrayOf(resource)
+			)
+			val intColor = a.getColor(0, 0)
+			a.recycle()
+			return intColor
 		}
 	}
 }
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Favourite.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Favourite.kt
index e646289182e4bc43f395baa22349625c864941a3..3b90d5b412f860dec4e0b7ca5472837de31d8dca 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Favourite.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Favourite.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.repo
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Interfaces.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Interfaces.kt
index 9b8b1da3afd0b34a1f9fb2d2812be70543d2c998..614947b9caab0f1785cb11f3e48363708c05156a 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Interfaces.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Interfaces.kt
@@ -54,7 +54,8 @@ 	): Line?
 
 	suspend fun queryQueryables(
 		query: String,
-		context: Context
+		context: Context,
+		feedID: String? = null
 	): List<Queryable>?
 
 	suspend fun locateQueryables(




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Journey.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Journey.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b12a8c50db61de66887a5322dbde71871070a92e
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Journey.kt
@@ -0,0 +1,66 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.repo
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import xyz.apiote.bimba.czwek.api.transitous.model.Place
+import xyz.apiote.bimba.czwek.units.DistanceUnit
+import xyz.apiote.bimba.czwek.units.TimeUnit
+import java.time.ZonedDateTime
+
+data class Journey(val startTime: ZonedDateTime, val endTime: ZonedDateTime, val legs: List<Leg>)
+
+data class Leg(
+	val start: Event,
+	val end: Event,
+	val origin: xyz.apiote.bimba.czwek.repo.Place,
+	val destination: xyz.apiote.bimba.czwek.repo.Place,
+	val agencyName: String?,
+	val distance: DistanceUnit?,
+	val duration: TimeUnit,
+	val intermediateStops: List<xyz.apiote.bimba.czwek.repo.Place>,
+	val shape: List<Position>,
+	/* TODO
+	val rental: Rental?,
+	val steps: List<StepInstruction>?,*/
+)
+
+@Parcelize
+class Place(val stop: Stop, val latitude: Double, val longitude: Double) : Parcelable {
+	constructor(place: Place) : this(
+		stop = Stop(place),
+		latitude = place.lat.toDouble(),
+		longitude = place.lon.toDouble()
+	)
+
+	constructor(latitude: Double, longitude: Double) : this(
+		Stop(
+			"", "",
+			"", "", null, Position(latitude, longitude), emptyList<ChangeOption>(), null
+		), latitude, longitude
+	)
+
+	constructor(stop: Stop) : this(stop, stop.position.latitude, stop.position.longitude)
+
+	fun position(): Position {
+		return Position(latitude, longitude)
+	}
+
+	fun planString(): String = if (stop.code == "") {
+		"${latitude},${longitude},0"
+	} else {
+		stop.code
+	}
+
+	fun shortString(): String = if (stop.name == "") {
+		"%.2f, %.2f".format(
+			latitude,
+			longitude
+		)
+	} else {
+		stop.name
+	}
+}




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/JourneyParams.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/JourneyParams.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6202c01e394e923f2dc5bac7e90ceb472b5499ed
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/JourneyParams.kt
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.repo
+
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+import java.time.Instant
+import java.time.LocalDate
+import java.time.LocalTime
+import java.time.ZoneId
+
+
+enum class TimeReference {
+	DEPART_AFTER, ARRIVE_BY;
+
+	fun id(): Int {
+		return when (this) {
+			DEPART_AFTER -> 1
+			ARRIVE_BY -> 2
+		}
+	}
+}
+
+@Parcelize
+data class JourneyParams(val timeReference: TimeReference, val date: LocalDate?, val time: LocalTime?, val wheelchairAccessible: Boolean, val bicycle: Boolean) : Parcelable {
+	fun getSafeDate(): LocalDate {
+		return date ?: Instant.now().atZone(ZoneId.systemDefault()).toLocalDate()
+	}
+
+	fun getSafeTime(): LocalTime {
+		return time ?: Instant.now().atZone(ZoneId.systemDefault()).toLocalTime()
+	}
+}
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineAbstract.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineAbstract.kt
index 8cfbfc83fdca77fbde3ae8077f613596bc0317cf..3073620c339606475ca5c6d963cc04a23966f30c 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineAbstract.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineAbstract.kt
@@ -73,6 +73,7 @@ 			LineType.FUNICULAR -> R.drawable.funicular_black
 			LineType.MONORAIL -> R.drawable.monorail_black
 			LineType.UNKNOWN -> R.drawable.vehicle_black
 			LineType.PLANE -> R.drawable.plane_black
+			LineType.WALK -> R.drawable.walk_black
 		}
 		val icon = AppCompatResources.getDrawable(context, iconID)?.mutate()?.apply {
 			setTint(textColour(colour))




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineStub.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineStub.kt
index d3bade3b09ff976a2ab0b60898a875359004e671..86565ae24cf1322fba82acae25063e71bb026d28 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineStub.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineStub.kt
@@ -7,11 +7,14 @@
 import android.content.Context
 import android.graphics.drawable.BitmapDrawable
 import android.graphics.drawable.Drawable
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
 import xyz.apiote.bimba.czwek.api.LineStubV1
 import xyz.apiote.bimba.czwek.api.LineStubV2
 import xyz.apiote.bimba.czwek.api.LineStubV3
 
-data class LineStub(val name: String, val kind: LineType, val colour: Colour) : LineAbstract {
+@Parcelize
+data class LineStub(val name: String, val kind: LineType, val colour: Colour) : LineAbstract, Parcelable {
 	constructor(l: LineStubV1) : this(l.name, LineType.of(l.kind), Colour(l.colour))
 	constructor(l: LineStubV2) : this(l.name, LineType.of(l.kind), Colour(l.colour))
 	constructor(l: LineStubV3) : this(l.name, LineType.of(l.kind), Colour(l.colour))




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineType.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineType.kt
index be76479081cc2763d596e2271e83e03096730d91..e8203ccf59987b50e216e07ced4f05e124ad2822 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineType.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/LineType.kt
@@ -10,7 +10,15 @@ import xyz.apiote.bimba.czwek.api.LineTypeV3
 import xyz.apiote.bimba.czwek.api.transitous.model.Mode
 
 enum class LineType {
-	UNKNOWN, TRAM, BUS, TROLLEYBUS, METRO, RAIL, FERRY, CABLE_TRAM, CABLE_CAR, FUNICULAR, MONORAIL, PLANE;
+	UNKNOWN, TRAM, BUS, TROLLEYBUS, METRO, RAIL, FERRY, CABLE_TRAM, CABLE_CAR, FUNICULAR, MONORAIL, PLANE, WALK;
+
+	fun isActive(): Boolean {
+		return this == WALK
+	}
+
+	fun isPasive(): Boolean {
+		return !isActive()
+	}
 
 	companion object {
 		fun of(t: LineTypeV1): LineType {
@@ -47,7 +55,7 @@
 		fun fromTransitous2(mode: Mode): LineType {
 			return when(mode) {
 				Mode.AIRPLANE -> PLANE
-				Mode.WALK -> UNKNOWN
+				Mode.WALK -> WALK
 				Mode.BIKE -> UNKNOWN
 				Mode.CAR -> UNKNOWN
 				Mode.RENTAL -> UNKNOWN




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/OfflineRepository.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/OfflineRepository.kt
index 07850536570dac297712700dc046d3805f2912c7..2906b7096f0283669d3c38ab9c82ae4e94e96838 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/OfflineRepository.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/OfflineRepository.kt
@@ -226,7 +226,8 @@ 	}
 
 	override suspend fun queryQueryables(
 		query: String,
-		context: Context
+		context: Context,
+		feedID: String?
 	): List<Queryable>? {
 		TODO("Not yet implemented")
 	}




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/OnlineRepository.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/OnlineRepository.kt
index 3f078daac0a5c69f2679a0e00142d3172234aae9..fa1dcca8a770916ab39206fa0dbf10fff6ab0995 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/OnlineRepository.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/OnlineRepository.kt
@@ -274,14 +274,14 @@ 		}
 	}
 
 	override suspend fun queryQueryables(
-		query: String, context: Context
+		query: String, context: Context, feedID: String?
 	): List<Queryable>? {
-		val transitousQueryables = if (Server.get(context).feeds.transitousEnabled()) {
+		val transitousQueryables = if (Server.get(context).feeds.transitousEnabled() || feedID == "transitous") {
 			getTransitousQueryables(query, context)
 		} else {
 			null
 		}
-		val bimbaQueryables = if (Server.get(context).feeds.bimbaEnabled()) {
+		val bimbaQueryables = if (Server.get(context).feeds.bimbaEnabled() && feedID == null) {  // TODO select bimba feed
 			getQueryables(query, null, context, "query")
 		} else {
 			null




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Position.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Position.kt
index 39ec428637d1165e0c41b12da12f7420de27a8e9..0ae7950e054ec3418325a78844809821aa13602f 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Position.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Position.kt
@@ -5,9 +5,18 @@
 package xyz.apiote.bimba.czwek.repo
 
 import android.location.Location
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
 import xyz.apiote.bimba.czwek.api.PositionV1
 
-data class Position(val latitude: Double, val longitude: Double) {
+@Parcelize
+data class Position(val latitude: Double, val longitude: Double): Parcelable {
+	init {
+		if (latitude > 90 || latitude < -90 || longitude > 180 || longitude < -180) {
+			throw IllegalArgumentException("$latitude must be [-90, 90], $longitude must be [-180, 180]")
+		}
+	}
+
 	constructor(p: PositionV1) : this(p.latitude, p.longitude)
 
 	fun isZero(): Boolean {




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Stop.kt b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Stop.kt
index 8448bc7210a18e9e0d352a657e4ef0db6139848a..1f0f19b8282e80f48a826ec163380a09b270afc6 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/repo/Stop.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/repo/Stop.kt
@@ -7,6 +7,7 @@
 import android.content.Context
 import android.graphics.Typeface
 import android.graphics.drawable.Drawable
+import android.os.Parcelable
 import android.text.Annotation
 import android.text.Spannable
 import android.text.SpannableStringBuilder
@@ -14,6 +15,7 @@ import android.text.Spanned
 import android.text.SpannedString
 import android.text.style.StyleSpan
 import androidx.preference.PreferenceManager
+import kotlinx.parcelize.Parcelize
 import xyz.apiote.bimba.czwek.R
 import xyz.apiote.bimba.czwek.RoundedBackgroundSpan
 import xyz.apiote.bimba.czwek.api.StopV1
@@ -23,6 +25,7 @@ import xyz.apiote.bimba.czwek.api.transitous.model.Match
 import xyz.apiote.bimba.czwek.api.transitous.model.Place
 
 
+@Parcelize
 data class Stop(
 	val code: String,
 	val name: String,
@@ -32,7 +35,7 @@ 	val feedID: String?,
 	val position: Position,
 	val changeOptions: List<ChangeOption>,
 	val description: String?
-) : Queryable, Locatable, StopAbstract {
+) : Queryable, Locatable, StopAbstract, Parcelable {
 	companion object {
 		fun distanceComparator(centre: Position) = object : Comparator<Stop> {
 			override fun compare(
@@ -61,7 +64,8 @@ 		s.zone,
 		null,
 		Position(s.position),
 		s.changeOptions.map { ChangeOption(it) },
-		null)
+		null
+	)
 
 	constructor(s: StopV2) : this(
 		s.code,
@@ -71,7 +75,8 @@ 		s.zone,
 		s.feedID,
 		Position(s.position),
 		s.changeOptions.map { ChangeOption(it) },
-		null)
+		null
+	)
 
 	constructor(s: StopV3) : this(
 		s.code,
@@ -81,9 +86,10 @@ 		s.zone,
 		s.feedID,
 		Position(s.position),
 		s.changeOptions.map { ChangeOption(it) },
-		null)
+		null
+	)
 
-	constructor(s: Match): this(
+	constructor(s: Match) : this(
 		s.id,
 		s.name,
 		s.areas.sortedBy { it.adminLevel }.map { it.name }.distinct().joinToString() + s.name,
@@ -94,8 +100,8 @@ 		emptyList(),
 		s.areas.sortedBy { it.adminLevel }.map { it.name }.distinct().joinToString()
 	)
 
-	constructor(s: Place): this(
-		s.stopId!!,
+	constructor(s: Place) : this(
+		s.stopId ?: "",
 		s.name,
 		s.name,
 		"",
@@ -173,7 +179,12 @@ 							Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
 						)
 
 						LineDecoration.COLOUR -> {
-							str.setSpan(background, str.getSpanStart(it), str.getSpanEnd(it), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+							str.setSpan(
+								background,
+								str.getSpanStart(it),
+								str.getSpanEnd(it),
+								Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+							)
 							// str.setSpan(foreground, str.getSpanStart(it), str.getSpanEnd(it), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
 						}
 
@@ -199,6 +210,7 @@ 	}
 
 	enum class LineDecoration {
 		NONE, ITALICS, COLOUR;
+
 		companion object {
 			fun fromPreferences(context: Context) =
 				when (PreferenceManager.getDefaultSharedPreferences(context)




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/search/Query.kt b/app/src/main/java/xyz/apiote/bimba/czwek/search/Query.kt
new file mode 100644
index 0000000000000000000000000000000000000000..9689087311b225976332852aed41ea5cd2e5bf2a
--- /dev/null
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/search/Query.kt
@@ -0,0 +1,117 @@
+// SPDX-FileCopyrightText: Adam Evyčędo
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package xyz.apiote.bimba.czwek.search
+
+import android.content.Context
+import android.location.Location
+import android.os.Parcelable
+import android.util.Log
+import com.google.openlocationcode.OpenLocationCode
+import kotlinx.parcelize.Parcelize
+import xyz.apiote.bimba.czwek.repo.Position
+
+@Parcelize
+class Query(var raw: String, var mode: Mode, var position: Position?) : Parcelable {
+	@Parcelize
+	enum class Mode : Parcelable {
+		LOCATION, POSITION, NAME, LOCATION_PLUS_CODE, UNKNOWN
+	}
+
+	constructor(raw: String) : this(raw, Mode.UNKNOWN, null)
+
+	constructor(raw: String, mode: Mode) : this(raw, mode, null)
+
+	constructor(mode: Mode) : this("", mode, null) {
+		if (mode != Mode.LOCATION) {
+			throw Exception("Cannot initialise Query from bare Mode other than LOCATION")
+		}
+	}
+
+	constructor(position: Position) : this(position.toString(), Mode.POSITION, position)
+
+	private constructor(mode: Mode, raw: String, position: Position?) : this(raw, mode, position)
+
+	fun parse(context: Context) {
+		if (mode != Mode.UNKNOWN) {
+			return
+		}
+		if (OpenLocationCode.isValidCode(raw)) {
+			val olc = OpenLocationCode(raw)
+			if (!olc.isFull) {
+				mode = Mode.LOCATION_PLUS_CODE
+			} else {
+				val area = olc.decode()
+				mode = Mode.POSITION
+				position = Position(area.centerLatitude, area.centerLongitude)
+			}
+		} else if (OpenLocationCode.isValidCode(raw.trim().split(" ").first().trim(',').trim())) {
+			mode = Mode.POSITION
+			geocode(context)
+		} else if (seemsCoordinatesDegrees(raw)) {
+			val coords = raw.split(", ", ",", " ")
+			try {
+				position = Position(Location.convert(coords[0]), Location.convert(coords[1]))
+				mode = Mode.POSITION
+			} catch (e: Exception) {
+				Log.i("Query", "while parsing degrees: $e")
+				mode = Mode.NAME
+			}
+		} else if (seemsCoordinatesDegreesMinutesSeconds(raw)) {
+			val coords =
+				raw.replace(Regex("° ?"), ":").replace(Regex("' ?"), ":").replace(Regex("""" ?"""), "")
+					.split(" ").map { it.replace(",", "") }.toMutableList()
+			try {
+				val northSouth = if (coords[0].last() == 'N') 1 else -1
+				val eastWest = if (coords[1].last() == 'E') 1 else -1
+				coords[0] = coords[0].replace(Regex("[NS]"), "")
+				coords[1] = coords[1].replace(Regex("[EW]"), "")
+				position =
+					Position(Location.convert(coords[0]) * northSouth, Location.convert(coords[1]) * eastWest)
+				mode = Mode.POSITION
+			} catch (e: Exception) {
+				Log.i("Query", "while parsing deg min sec: $e")
+				mode = Mode.NAME
+			}
+		} else {
+			mode = Mode.NAME
+		}
+	}
+
+	private fun seemsCoordinatesDegrees(s: String): Boolean {
+		return Regex("""[+-]?[0-9]+(\.[0-9]+)?(,| |, )[+-]?[0-9]+(\.[0-9]+)?""").matches(s)
+	}
+
+	private fun seemsCoordinatesDegreesMinutesSeconds(s: String): Boolean {
+		return Regex("""[0-9]+° ?[0-9]+' ?[0-9]+(\.[0-9]+)?" ?[NS] [0-9]+° ?[0-9]+' ?[0-9]+(\.[0-9]+)?" ?[EW]""").matches(
+			s
+		)
+	}
+
+	private fun geocode(context: Context) {
+		val split = raw.trim().split(" ")
+		val code = split.first().trim(',').trim()
+		val freePart = split.drop(1).joinToString(" ")
+		val location = findPlace(context, freePart)
+		if (location == null) {
+			throw GeocodingException()
+		} else {
+			val area = OpenLocationCode(code).recover(location.latitude, location.longitude).decode()
+			position = Position(area.centerLatitude, area.centerLongitude)
+		}
+	}
+
+	override fun toString(): String {
+		return when (mode) {
+			Mode.UNKNOWN -> raw
+			Mode.LOCATION -> "here"
+			Mode.POSITION -> "%.2f, %.2f".format(
+				position!!.latitude,
+				position!!.longitude
+			)  // TODO settings for position format
+			Mode.NAME -> raw
+			Mode.LOCATION_PLUS_CODE -> raw
+		}
+	}
+}
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/search/Results.kt b/app/src/main/java/xyz/apiote/bimba/czwek/search/Results.kt
index 2df5391da9da2b9bb1eddecfc5ba8bc2c4568ef9..36356cbe7e32da37a1451ea20fbfc507bc65292f 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/search/Results.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/search/Results.kt
@@ -215,7 +215,8 @@ 	private val context: Context?,
 	private var queryables: List<Queryable>,
 	private var position: Location?,
 	private var heading: Float?,
-	private var showArrow: Boolean
+	private var showArrow: Boolean,
+	private val returnResult: Boolean = false
 ) :
 	RecyclerView.Adapter<BimbaViewHolder>() {
 	class DiffUtilCallback(
@@ -291,15 +292,20 @@ 	var feedsSettings: FeedsSettings? = null
 	private val onClickListener: ((Queryable) -> Unit) = {
 		when (it) {
 			is Stop -> {
-				val intent = Intent(context, DeparturesActivity::class.java).apply {
-					putExtra("code", it.code)
-					putExtra("name", it.name)
-					putExtra("feedID", it.feedID)
+				if (returnResult) {
+					(context as ResultsActivity).returnResult(it)
+				} else {
+					val intent = Intent(context, DeparturesActivity::class.java).apply {
+						putExtra("code", it.code)
+						putExtra("name", it.name)
+						putExtra("feedID", it.feedID)
+					}
+					context!!.startActivity(intent)
 				}
-				context!!.startActivity(intent)
 			}
 
 			is Line -> {
+				// TODO if returnResult -> shouldn't show lines
 				val intent = Intent(context, LineGraphActivity::class.java).apply {
 					putExtra("lineName", it.name)
 					putExtra("lineID", it.id)




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/search/ResultsActivity.kt b/app/src/main/java/xyz/apiote/bimba/czwek/search/ResultsActivity.kt
index 0c87cba970f5cce61d4d0d45aec18eef3015dfa7..e6fb31af640bbf1aabfe3ddf0d9095cd5551b3e3 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/search/ResultsActivity.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/search/ResultsActivity.kt
@@ -35,44 +35,34 @@ import kotlinx.coroutines.launch
 import org.openapitools.client.infrastructure.ServerException
 import xyz.apiote.bimba.czwek.R
 import xyz.apiote.bimba.czwek.api.Error
+import xyz.apiote.bimba.czwek.dashboard.MainActivity
 import xyz.apiote.bimba.czwek.databinding.ActivityResultsBinding
 import xyz.apiote.bimba.czwek.repo.OfflineRepository
 import xyz.apiote.bimba.czwek.repo.OnlineRepository
+import xyz.apiote.bimba.czwek.repo.Place
 import xyz.apiote.bimba.czwek.repo.Position
 import xyz.apiote.bimba.czwek.repo.Queryable
+import xyz.apiote.bimba.czwek.repo.Stop
 import xyz.apiote.bimba.czwek.repo.TrafficResponseException
+import xyz.apiote.bimba.czwek.search.Query.Mode
 import xyz.apiote.bimba.czwek.settings.feeds.FeedsSettings
 
 class ResultsActivity : AppCompatActivity(), LocationListener, SensorEventListener {
-	enum class Mode {
-		MODE_LOCATION, MODE_SEARCH, MODE_POSITION, MODE_SHORT_CODE_LOCATION, MODE_SHORT_CODE
-	}
-
 	companion object {
-		const val MODE_KEY = "mode"
 		const val QUERY_KEY = "query"
-		const val LATITUDE_KEY = "lat"
-		const val LONGITUDE_KEY = "lon"
+		const val RETURN_KEY = "ret"
+		const val FEED_KEY = "feed"
 		fun getIntent(
 			context: Context,
-			mode: Mode,
-			query: String,
-			latitude: Double,
-			longitude: Double
+			query: Query,
+			ret: Boolean = false,
+			feedID: String? = null
 		) =
 			Intent(context, ResultsActivity::class.java).apply {
-				putExtra(MODE_KEY, mode)
 				putExtra(QUERY_KEY, query)
-				putExtra(LATITUDE_KEY, latitude)
-				putExtra(LONGITUDE_KEY, longitude)
-			}
-
-		fun getIntent(context: Context, mode: Mode, query: String) =
-			Intent(context, ResultsActivity::class.java).apply {
-				putExtra(MODE_KEY, mode)
-				putExtra(QUERY_KEY, query)
+				putExtra(RETURN_KEY, ret)
+				putExtra(FEED_KEY, feedID)
 			}
-
 	}
 
 	private var _binding: ActivityResultsBinding? = null
@@ -85,6 +75,7 @@ 	private var runnable = Runnable {}
 	private var gravity: FloatArray? = null
 	private var geomagnetic: FloatArray? = null
 	private var shortOLC: OpenLocationCode? = null
+	private lateinit var query: Query
 
 	override fun onCreate(savedInstanceState: Bundle?) {
 		enableEdgeToEdge()
@@ -110,67 +101,62 @@ 			windowInsets
 		}
 
 		binding.resultsRecycler.layoutManager = LinearLayoutManager(this)
-		adapter = BimbaResultsAdapter(layoutInflater, this, listOf(), null, null, false)
+		adapter =
+			BimbaResultsAdapter(layoutInflater, this, listOf(), null, null, false, getReturnResults())
 		binding.resultsRecycler.adapter = adapter
 
-		when (getMode()) {
-			Mode.MODE_LOCATION -> {
+		query = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+			intent.getParcelableExtra(QUERY_KEY, Query::class.java)!!
+		} else {
+			@Suppress("DEPRECATION")
+			intent.getParcelableExtra(QUERY_KEY)!!
+		}
+
+		useQuery()
+	}
+
+	private fun useQuery() {
+		when (query.mode) {
+			Mode.LOCATION -> {
 				binding.topAppBar.title = getString(R.string.stops_nearby)
 				locate()
 			}
 
-			Mode.MODE_SHORT_CODE_LOCATION -> {
-				val query = intent.extras?.getString(QUERY_KEY)
-				binding.topAppBar.title = getString(R.string.stops_near_code, query)
-				shortOLC = OpenLocationCode(query)
+			Mode.LOCATION_PLUS_CODE -> {
+				binding.topAppBar.title = getString(R.string.stops_near_code, query.raw)
+				shortOLC = OpenLocationCode(query.raw)
 				locate()
 			}
 
-			Mode.MODE_SHORT_CODE -> {
-				val query = intent.extras?.getString(QUERY_KEY)
-				binding.topAppBar.title = getString(R.string.stops_near_code, query)
-				val split = query!!.trim().split(" ")
-				val code = split.first().trim(',').trim()
-				val freePart = split.drop(1).joinToString(" ")
-				val location = findPlace(this, freePart)
-				if (location == null) {
+			Mode.UNKNOWN -> {
+				try {
+					query.parse(this)
+					if (query.mode != Mode.UNKNOWN) {
+						useQuery()
+					} else {
+						showError(Error(0, R.string.error_unknown, R.drawable.error_other))
+					}
+				} catch (_: GeocodingException) {
 					showError(Error(0, R.string.error_geocoding, R.drawable.geocoding))
-				} else {
-					val area = OpenLocationCode(code).recover(location.latitude, location.longitude).decode()
-					getQueryablesByLocation(Location(null).apply {
-						latitude = area.centerLatitude
-						longitude = area.centerLongitude
-					}, this)
 				}
 			}
 
-			Mode.MODE_POSITION -> {
-				val query = intent.extras?.getString(QUERY_KEY)
-				val lat = intent.extras?.getDouble(LATITUDE_KEY)
-				val lon = intent.extras?.getDouble(LONGITUDE_KEY)
-				binding.topAppBar.title = getString(R.string.stops_near_code, query)
+			Mode.POSITION -> {
+				binding.topAppBar.title = getString(R.string.stops_near_code, query.raw)
 				getQueryablesByLocation(Location(null).apply {
-					latitude = lat!!
-					longitude = lon!!
+					latitude = query.position!!.latitude
+					longitude = query.position!!.longitude
 				}, this)
 			}
 
-			Mode.MODE_SEARCH -> {
-				val query = intent.extras?.getString(QUERY_KEY)!!
-				binding.topAppBar.title = getString(R.string.results_for, query)
-				getQueryablesByQuery(query, this)
+			Mode.NAME -> {
+				binding.topAppBar.title = getString(R.string.results_for, query.raw)
+				getQueryablesByQuery(query.raw, this)
 			}
 		}
 	}
 
-	private fun getMode(): Mode {
-		return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
-			intent.extras!!.getSerializable(MODE_KEY, Mode::class.java)!!
-		} else {
-			@Suppress("DEPRECATION")
-			intent.extras!!.get(MODE_KEY) as Mode
-		}
-	}
+	private fun getReturnResults(): Boolean = intent.extras?.getBoolean(RETURN_KEY) == true
 
 	private fun locate() {
 		val sensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
@@ -229,7 +215,7 @@ 	}
 
 	override fun onResume() {
 		super.onResume()
-		if (getMode() == Mode.MODE_LOCATION) {
+		if (query.mode == Mode.LOCATION) {
 			locate()
 		}
 	}
@@ -265,7 +251,7 @@ 	private fun getQueryablesByQuery(query: String, context: Context) {
 		MainScope().launch {
 			try {
 				val repository = OnlineRepository()
-				val result = repository.queryQueryables(query, context)
+				val result = repository.queryQueryables(query, context, intent.getStringExtra(FEED_KEY))
 				getFeeds()
 				updateItems(result, null, false)
 			} catch (e: TrafficResponseException) {
@@ -326,7 +312,7 @@ 					R.drawable.error_search
 				)
 			)
 		} else {
-			if (queryables.size == 1 && getMode() == Mode.MODE_SEARCH) {
+			if (queryables.size == 1 && query.mode == Query.Mode.NAME && !getReturnResults()) {
 				adapter.click(0)
 			}
 			binding.resultsOverlay.visibility = View.GONE
@@ -334,5 +320,12 @@ 			binding.errorImage.visibility = View.GONE
 			binding.errorText.visibility = View.GONE
 			binding.resultsRecycler.visibility = View.VISIBLE
 		}
+	}
+
+	fun returnResult(stop: Stop) {
+		setResult(RESULT_OK, Intent(this, MainActivity::class.java).apply {
+			putExtra("PLACE", Place(stop))
+		})
+		finish()
 	}
 }




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/search/geocoder.kt b/app/src/main/java/xyz/apiote/bimba/czwek/search/geocoder.kt
index 2eedfa8ae0b4b12f54659981d15aac8f1ce531a8..98c152f66af7260e13c063ea7a2f1035595d216e 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/search/geocoder.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/search/geocoder.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.search
 
@@ -28,4 +28,6 @@ 	}
 	cursor.close()
 	db.close()
 	return location
-}
\ No newline at end of file
+}
+
+class GeocodingException : Exception()
\ No newline at end of file




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/search/ui/LineGraphFragment.kt b/app/src/main/java/xyz/apiote/bimba/czwek/search/ui/LineGraphFragment.kt
index ffb32d9486fbf7056c3629add6fdf2d58550898e..6cfe3be6d45ada1868d0abdd9b635815c77a2719 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/search/ui/LineGraphFragment.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/search/ui/LineGraphFragment.kt
@@ -26,6 +26,7 @@ import dev.bandb.graphview.layouts.layered.SugiyamaLayoutManager
 import xyz.apiote.bimba.czwek.R
 import xyz.apiote.bimba.czwek.databinding.FragmentLineGraphBinding
 import xyz.apiote.bimba.czwek.departures.DeparturesActivity
+import xyz.apiote.bimba.czwek.repo.Colour
 import xyz.apiote.bimba.czwek.repo.LineGraph
 import xyz.apiote.bimba.czwek.repo.StopStub
 import xyz.apiote.bimba.czwek.search.BimbaViewHolder
@@ -57,7 +58,12 @@ 		_binding = FragmentLineGraphBinding.inflate(inflater, container, false)
 
 		ViewCompat.setOnApplyWindowInsetsListener(binding.recycler) { v, windowInsets ->
 			val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
-			v.updatePadding(right = insets.right, left = insets.left, top = insets.top, bottom = insets.bottom)
+			v.updatePadding(
+				right = insets.right,
+				left = insets.left,
+				top = insets.top,
+				bottom = insets.bottom
+			)
 			windowInsets
 		}
 
@@ -68,12 +74,9 @@
 		binding.recycler.layoutManager = SugiyamaLayoutManager(requireContext(), configuration)
 		binding.recycler.addItemDecoration(SugiyamaArrowEdgeDecoration(Paint(Paint.ANTI_ALIAS_FLAG).apply {
 			strokeWidth = 5f
-			val a: TypedArray? = context?.theme?.obtainStyledAttributes(
-				R.style.Theme_Bimba, intArrayOf(com.google.android.material.R.attr.colorOnBackground)
-			)
-			val intColor = a?.getColor(0, 0)
-			a?.recycle()
-			color = intColor ?: 0
+			color = context?.let {
+				Colour.getThemeColour(com.google.android.material.R.attr.colorOnBackground, it)
+			} ?: 0
 			style = Paint.Style.STROKE
 			strokeJoin = Paint.Join.ROUND
 			pathEffect = CornerPathEffect(10f)




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/settings/DownloadCitiesWorker.kt b/app/src/main/java/xyz/apiote/bimba/czwek/settings/DownloadCitiesWorker.kt
index 659958c825ea9c7190bf7ae9e42390cbacac2f06..35e4f14f7c1f81eb09b14442e47fa7a49b198227 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/settings/DownloadCitiesWorker.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/settings/DownloadCitiesWorker.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.settings
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/settings/SettingsActivity.kt b/app/src/main/java/xyz/apiote/bimba/czwek/settings/SettingsActivity.kt
index 574631882827027aab7db9264424a46b9f5ae01a..09e223bd5f9b218ec743a169bc4db9ba2ac2e04c 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/settings/SettingsActivity.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/settings/SettingsActivity.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.settings
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/units/TGM.kt b/app/src/main/java/xyz/apiote/bimba/czwek/units/TGM.kt
index e08dd2695c1885cb85355d300f2445554a184882..14f8d9e68e97b3ee640f33d669fd8c128c0c870d 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/units/TGM.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/units/TGM.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.units
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/units/UnitSystem.kt b/app/src/main/java/xyz/apiote/bimba/czwek/units/UnitSystem.kt
index 3e3f5045e23857de6a6155aceb3a681b7cc66ec3..f72c5ef632539d3f8571b734440a32676102e39d 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/units/UnitSystem.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/units/UnitSystem.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.units
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/units/imperial.kt b/app/src/main/java/xyz/apiote/bimba/czwek/units/imperial.kt
index 5938c9e483126a316bf0f75ded2db2892d9ab77f..5749d7afc5b28168792156185b962292c65bbdc5 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/units/imperial.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/units/imperial.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.units
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/units/metric.kt b/app/src/main/java/xyz/apiote/bimba/czwek/units/metric.kt
index 9ba9250282b2709ea0712489ccf6919f9592ea19..e06e0bcb246900e66a79bb766e2026b93e8299f2 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/units/metric.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/units/metric.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.units
 




diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/units/usCustomary.kt b/app/src/main/java/xyz/apiote/bimba/czwek/units/usCustomary.kt
index b9228f6fd2577b0d9c3eca067940b40e09a639bb..763047ce39f260f82fce6ea4f17c1ec3f40380bc 100644
--- a/app/src/main/java/xyz/apiote/bimba/czwek/units/usCustomary.kt
+++ b/app/src/main/java/xyz/apiote/bimba/czwek/units/usCustomary.kt
@@ -1,6 +1,6 @@
 // SPDX-FileCopyrightText: Adam Evyčędo
 //
-// SPDX-License-Identifier: AGPL-3.0-or-later
+// SPDX-License-Identifier: GPL-3.0-or-later
 
 package xyz.apiote.bimba.czwek.units
 




diff --git a/app/src/main/res/drawable/destination.xml b/app/src/main/res/drawable/destination.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d147ea48273e230b4ce11b0ccf2612db0bfa3c34
--- /dev/null
+++ b/app/src/main/res/drawable/destination.xml
@@ -0,0 +1,16 @@
+<!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?attr/colorOnSurface"
+    android:viewportWidth="6.35"
+    android:viewportHeight="6.35">
+  <path
+      android:fillColor="#000000"
+      android:pathData="m5.2917,3.1771 l-2.6797,-0.7959 0.5249,0.5884h-0.1185,-1.96v0.4233h1.9558,0.1228l-0.5334,0.5757z"
+      android:strokeWidth="2"/>
+</vector>




diff --git a/app/src/main/res/drawable/dropdown.xml b/app/src/main/res/drawable/dropdown.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4b0189872b09fbdaa0ce451485e8f41226e6ed15
--- /dev/null
+++ b/app/src/main/res/drawable/dropdown.xml
@@ -0,0 +1,17 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?attr/colorOnSurface"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M7,10l5,5 5,-5z" />
+
+</vector>




diff --git a/app/src/main/res/drawable/error_journeys.xml b/app/src/main/res/drawable/error_journeys.xml
new file mode 100644
index 0000000000000000000000000000000000000000..45256f408b44b2b2e9684242a2732b1e51175efd
--- /dev/null
+++ b/app/src/main/res/drawable/error_journeys.xml
@@ -0,0 +1,21 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+	android:width="24dp"
+	android:height="24dp"
+	android:tint="?attr/colorOnSurface"
+	android:viewportWidth="24"
+	android:viewportHeight="24">
+
+	<path
+		android:fillColor="@android:color/white"
+		android:pathData="M12.83,10h0.67V7.5L17,11l-1.59,1.59L18.83,16l2.59,-2.59c0.78,-0.78 0.78,-2.05 0,-2.83l-7.99,-8c-0.78,-0.78 -2.05,-0.78 -2.83,0L8,5.17L12.83,10z" />
+
+	<path
+		android:fillColor="@android:color/white"
+		android:pathData="M2.81,2.81L1.39,4.22L5.17,8l-2.59,2.59c-0.78,0.78 -0.78,2.05 0,2.83l8.01,8c0.78,0.78 2.05,0.78 2.83,0L16,18.83l3.78,3.78l1.41,-1.41L2.81,2.81zM10,15H8v-4c0,-0.05 0.02,-0.09 0.03,-0.14L10,12.83V15z" />
+
+</vector>




diff --git a/app/src/main/res/drawable/gps.xml b/app/src/main/res/drawable/gps.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6408c48bc2c87c88bc82a86c889136fad96678a1
--- /dev/null
+++ b/app/src/main/res/drawable/gps.xml
@@ -0,0 +1,16 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+	android:width="24dp"
+	android:height="24dp"
+	android:tint="?attr/colorOnSurface"
+	android:viewportWidth="24"
+	android:viewportHeight="24">
+	<path
+		android:fillColor="@android:color/white"
+		android:pathData="M12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94L13,1h-2v2.06C6.83,3.52 3.52,6.83 3.06,11L1,11v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94L11,23h2v-2.06c4.17,-0.46 7.48,-3.77 7.94,-7.94L23,13v-2h-2.06zM12,19c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z" />
+</vector>




diff --git a/app/src/main/res/drawable/inexact.xml b/app/src/main/res/drawable/inexact.xml
deleted file mode 100644
index d1ba0403097cbc7a980bc9d5ddfd921596069d04..0000000000000000000000000000000000000000
--- a/app/src/main/res/drawable/inexact.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<!--
-SPDX-FileCopyrightText: Michael Irigoyen
-
-SPDX-License-Identifier: Apache-2.0
-
-source: https://pictogrammers.com/library/mdi/icon/tilde/
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-	android:width="24dp"
-	android:height="24dp"
-	android:tint="?attr/colorOnSurface"
-	android:viewportWidth="24"
-	android:viewportHeight="24">
-	<path
-		android:fillColor="#000000"
-		android:pathData="M2,15C2,15 2,9 8,9C12,9 12.5,12.5 15.5,12.5C19.5,12.5 19.5,9 19.5,9H22C22,9 22,15 16,15C12,15 10.5,11.5 8.5,11.5C4.5,11.5 4.5,15 4.5,15H2" />
-</vector>
\ No newline at end of file




diff --git a/app/src/main/res/drawable/journey_black.xml b/app/src/main/res/drawable/journey_black.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ba01d2f83ee2e3bb7459a38620d6e475c8f74ffb
--- /dev/null
+++ b/app/src/main/res/drawable/journey_black.xml
@@ -0,0 +1,16 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+	android:width="24dp"
+	android:height="24dp"
+	android:tint="#000000"
+	android:viewportWidth="24"
+	android:viewportHeight="24">
+	<path
+		android:fillColor="@android:color/white"
+		android:pathData="M21.71,11.29l-9,-9c-0.39,-0.39 -1.02,-0.39 -1.41,0l-9,9c-0.39,0.39 -0.39,1.02 0,1.41l9,9c0.39,0.39 1.02,0.39 1.41,0l9,-9c0.39,-0.38 0.39,-1.01 0,-1.41zM14,14.5V12h-4v3H8v-4c0,-0.55 0.45,-1 1,-1h5V7.5l3.5,3.5 -3.5,3.5z" />
+</vector>




diff --git a/app/src/main/res/drawable/journey_outline.xml b/app/src/main/res/drawable/journey_outline.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e07a1469076965c87a79a332cb9404c050745e62
--- /dev/null
+++ b/app/src/main/res/drawable/journey_outline.xml
@@ -0,0 +1,16 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+	android:width="24dp"
+	android:height="24dp"
+	android:tint="#000000"
+	android:viewportWidth="24"
+	android:viewportHeight="24">
+	<path
+		android:fillColor="@android:color/white"
+		android:pathData="M22.43,10.59l-9.01,-9.01c-0.75,-0.75 -2.07,-0.76 -2.83,0l-9,9c-0.78,0.78 -0.78,2.04 0,2.82l9,9c0.39,0.39 0.9,0.58 1.41,0.58 0.51,0 1.02,-0.19 1.41,-0.58l8.99,-8.99c0.79,-0.76 0.8,-2.02 0.03,-2.82zM12.01,20.99l-9,-9 9,-9 9,9 -9,9zM8,11v4h2v-3h4v2.5l3.5,-3.5L14,7.5L14,10L9,10c-0.55,0 -1,0.45 -1,1z" />
+</vector>




diff --git a/app/src/main/res/drawable/mastodon.xml b/app/src/main/res/drawable/mastodon.xml
index 6e43eddefafe250dca70bc437e020ee281f1050b..877255c89e80f535d088d68dff3473934df3f1ff 100644
--- a/app/src/main/res/drawable/mastodon.xml
+++ b/app/src/main/res/drawable/mastodon.xml
@@ -1,7 +1,7 @@
 <!--
 SPDX-FileCopyrightText: Eugen Rochko & other Mastodon contributors
 
-SPDX-License-Identifier: AGPL-3.0-or-later
+SPDX-License-Identifier: GPL-3.0-or-later
 -->
 
 <vector xmlns:android="http://schemas.android.com/apk/res/android"




diff --git a/app/src/main/res/drawable/options.xml b/app/src/main/res/drawable/options.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fb0e685ef3cc625ec96a37d6a6ee328398dca2a3
--- /dev/null
+++ b/app/src/main/res/drawable/options.xml
@@ -0,0 +1,17 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+	android:width="24dp"
+	android:height="24dp"
+	android:tint="?attr/colorOnSurface"
+	android:viewportWidth="24"
+	android:viewportHeight="24">
+
+	<path
+		android:fillColor="@android:color/white"
+		android:pathData="M3,17v2h6v-2L3,17zM3,5v2h10L13,5L3,5zM13,21v-2h8v-2h-8v-2h-2v6h2zM7,9v2L3,11v2h4v2h2L9,9L7,9zM21,13v-2L11,11v2h10zM15,9h2L17,7h4L21,5h-4L17,3h-2v6z" />
+
+</vector>




diff --git a/app/src/main/res/drawable/origin.xml b/app/src/main/res/drawable/origin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5464d1c625af5f9c8ddf3746af5feaa232c1efb3
--- /dev/null
+++ b/app/src/main/res/drawable/origin.xml
@@ -0,0 +1,16 @@
+<!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?attr/colorOnSurface"
+    android:viewportWidth="6.35"
+    android:viewportHeight="6.35">
+  <path
+      android:pathData="m5.2874,3.3867v-0.4233h-1.3504l-0.5376,-0.5757h-0.5884l0.5376,0.5757h-0.2836l-0.5376,-0.5757h-0.5927l0.5419,0.5757h-0.2879l-0.5334,-0.5757h-0.5927l0.5419,0.5757h-0.2879,-0.254v0.4233h0.254,0.2879l-0.5419,0.5757h0.5927l0.5334,-0.5757h0.2879l-0.5419,0.5757h0.5927l0.5376,-0.5757h0.2836l-0.5376,0.5757h0.5884l0.5376,-0.5757z"
+      android:strokeWidth="2"
+      android:fillColor="#000000"/>
+</vector>




diff --git a/app/src/main/res/drawable/pin.xml b/app/src/main/res/drawable/pin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..372ded410e5b785c0af89e45edf50e9457981691
--- /dev/null
+++ b/app/src/main/res/drawable/pin.xml
@@ -0,0 +1,17 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:pathData="M12,2L12,2C8.13,2 5,5.13 5,9c0,1.74 0.5,3.37 1.41,4.84c0.95,1.54 2.2,2.86 3.16,4.4c0.47,0.75 0.81,1.45 1.17,2.26C11,21.05 11.21,22 12,22h0c0.79,0 1,-0.95 1.25,-1.5c0.37,-0.81 0.7,-1.51 1.17,-2.26c0.96,-1.53 2.21,-2.85 3.16,-4.4C18.5,12.37 19,10.74 19,9C19,5.13 15.87,2 12,2zM12,11.75c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5S13.38,11.75 12,11.75z"
+      android:fillColor="?attr/colorOnSurface"/>
+  <path
+      android:pathData="M12,3.361L12,3.361C8.67,3.361 5.977,6.054 5.977,9.384c0,1.497 0.43,2.9 1.213,4.164 0.817,1.325 1.893,2.461 2.719,3.786 0.404,0.645 0.697,1.248 1.007,1.945C11.14,19.752 11.32,20.569 12,20.569l0,0c0.68,0 0.86,-0.817 1.076,-1.291 0.318,-0.697 0.602,-1.299 1.007,-1.945 0.826,-1.316 1.902,-2.452 2.719,-3.786C17.593,12.283 18.023,10.881 18.023,9.384 18.023,6.054 15.33,3.361 12,3.361ZM12,11.75c-1.187,0 -2.151,-0.964 -2.151,-2.151 0,-1.187 0.964,-2.151 2.151,-2.151 1.187,0 2.151,0.964 2.151,2.151 0,1.187 -0.964,2.151 -2.151,2.151z"
+      android:fillColor="?attr/colorPrimary"/>
+</vector>




diff --git a/app/src/main/res/drawable/position.xml b/app/src/main/res/drawable/position.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2256cca5d494cdf165812525602e2011399b9fe5
--- /dev/null
+++ b/app/src/main/res/drawable/position.xml
@@ -0,0 +1,15 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+	android:width="24dp"
+	android:height="24dp"
+	android:tint="?attr/colorOnSurface"
+	android:viewportWidth="24"
+	android:viewportHeight="24">
+	<path
+		android:fillColor="@android:color/white"
+		android:pathData="M12,2L12,2C8.13,2 5,5.13 5,9c0,1.74 0.5,3.37 1.41,4.84c0.95,1.54 2.2,2.86 3.16,4.4c0.47,0.75 0.81,1.45 1.17,2.26C11,21.05 11.21,22 12,22h0c0.79,0 1,-0.95 1.25,-1.5c0.37,-0.81 0.7,-1.51 1.17,-2.26c0.96,-1.53 2.21,-2.85 3.16,-4.4C18.5,12.37 19,10.74 19,9C19,5.13 15.87,2 12,2zM12,11.75c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5S13.38,11.75 12,11.75z" />
+</vector>




diff --git a/app/src/main/res/drawable/search.xml b/app/src/main/res/drawable/search.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c22960ef9611bcfcfd5164564e088af45080949a
--- /dev/null
+++ b/app/src/main/res/drawable/search.xml
@@ -0,0 +1,16 @@
+<!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+	android:width="24dp"
+	android:height="24dp"
+	android:tint="?attr/colorOnSurface"
+	android:viewportWidth="24"
+	android:viewportHeight="24">
+	<path
+		android:fillColor="@android:color/white"
+		android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
+</vector>




diff --git a/app/src/main/res/drawable/send.xml b/app/src/main/res/drawable/send.xml
index 42caa11f3d69d9e70a3b73d5f03d617c349af2cc..db190a641930863725e6135f37f7a89a37fec9c5 100644
--- a/app/src/main/res/drawable/send.xml
+++ b/app/src/main/res/drawable/send.xml
@@ -8,7 +8,7 @@  	android:width="24dp"
 	android:height="24dp"
 	android:autoMirrored="true"
-	android:tint="#000000"
+	android:tint="?attr/colorOnSurface"
 	android:viewportWidth="24"
 	android:viewportHeight="24">
 




diff --git a/app/src/main/res/drawable/stop_alt.xml b/app/src/main/res/drawable/stop_alt.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b24023be0ee2e689d4e96e834dad9514c0a06786
--- /dev/null
+++ b/app/src/main/res/drawable/stop_alt.xml
@@ -0,0 +1,16 @@
+<!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?attr/colorOnSurface"
+    android:viewportWidth="6.35"
+    android:viewportHeight="6.35">
+  <path
+      android:fillColor="#000000"
+      android:pathData="m5.2938,3.4036v-0.4233h-0.5927c-0.0339,-0.1778 -0.0931,-0.3429 -0.1863,-0.5038 -0.0931,-0.1609 -0.2032,-0.3006 -0.3387,-0.4191 -0.1355,-0.1185 -0.2921,-0.2117 -0.4614,-0.2794 -0.1693,-0.0677 -0.3514,-0.1058 -0.5376,-0.1058 -0.2032,0 -0.3895,0.0381 -0.5673,0.1058 -0.1778,0.0677 -0.3344,0.1609 -0.4741,0.2794 -0.1355,0.1185 -0.2498,0.2582 -0.3429,0.4191 -0.0931,0.1609 -0.1524,0.326 -0.1863,0.5038h-0.5503v0.4233h0.5503c0.0339,0.1947 0.0931,0.3683 0.1863,0.5249 0.0931,0.1566 0.2074,0.2921 0.3429,0.4022 0.1397,0.1101 0.2963,0.199 0.4741,0.2582 0.1778,0.0593 0.3641,0.0889 0.5673,0.0889 0.1863,0 0.3683,-0.0296 0.5376,-0.0889 0.1693,-0.0593 0.326,-0.1482 0.4614,-0.2582 0.1355,-0.1101 0.2455,-0.2455 0.3387,-0.4022 0.0931,-0.1566 0.1524,-0.3302 0.1863,-0.5249zM4.2778,3.1962c0,0.1524 -0.0296,0.2921 -0.0889,0.4233 -0.0593,0.1355 -0.1397,0.2498 -0.2413,0.3514 -0.1016,0.1016 -0.2159,0.1778 -0.3514,0.2371 -0.1355,0.0593 -0.2752,0.0889 -0.4233,0.0889 -0.1355,0 -0.2667,-0.0212 -0.3937,-0.0677 -0.1228,-0.0423 -0.2328,-0.1058 -0.3344,-0.1863 -0.1016,-0.0762 -0.1863,-0.1736 -0.2582,-0.2836 -0.072,-0.1101 -0.1228,-0.2286 -0.1566,-0.3556h1.1472v-0.4233h-1.1472c0.0339,-0.127 0.0847,-0.2413 0.1566,-0.3514 0.072,-0.1058 0.1566,-0.199 0.2582,-0.2794 0.1016,-0.0762 0.2117,-0.1397 0.3344,-0.1863 0.127,-0.0423 0.2582,-0.0677 0.3937,-0.0677 0.1482,0 0.2879,0.0296 0.4233,0.0889 0.1355,0.0593 0.2498,0.1397 0.3514,0.2413 0.1016,0.1016 0.182,0.2159 0.2413,0.3514 0.0593,0.1355 0.0889,0.2752 0.0889,0.4191z"
+      android:strokeWidth="2"/>
+</vector>




diff --git a/app/src/main/res/drawable/voyage_black.xml b/app/src/main/res/drawable/voyage_black.xml
deleted file mode 100644
index ba01d2f83ee2e3bb7459a38620d6e475c8f74ffb..0000000000000000000000000000000000000000
--- a/app/src/main/res/drawable/voyage_black.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--
-SPDX-FileCopyrightText: Google
-
-SPDX-License-Identifier: Apache-2.0
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-	android:width="24dp"
-	android:height="24dp"
-	android:tint="#000000"
-	android:viewportWidth="24"
-	android:viewportHeight="24">
-	<path
-		android:fillColor="@android:color/white"
-		android:pathData="M21.71,11.29l-9,-9c-0.39,-0.39 -1.02,-0.39 -1.41,0l-9,9c-0.39,0.39 -0.39,1.02 0,1.41l9,9c0.39,0.39 1.02,0.39 1.41,0l9,-9c0.39,-0.38 0.39,-1.01 0,-1.41zM14,14.5V12h-4v3H8v-4c0,-0.55 0.45,-1 1,-1h5V7.5l3.5,3.5 -3.5,3.5z" />
-</vector>




diff --git a/app/src/main/res/drawable/voyage_outline.xml b/app/src/main/res/drawable/voyage_outline.xml
deleted file mode 100644
index e07a1469076965c87a79a332cb9404c050745e62..0000000000000000000000000000000000000000
--- a/app/src/main/res/drawable/voyage_outline.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!--
-SPDX-FileCopyrightText: Google
-
-SPDX-License-Identifier: Apache-2.0
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-	android:width="24dp"
-	android:height="24dp"
-	android:tint="#000000"
-	android:viewportWidth="24"
-	android:viewportHeight="24">
-	<path
-		android:fillColor="@android:color/white"
-		android:pathData="M22.43,10.59l-9.01,-9.01c-0.75,-0.75 -2.07,-0.76 -2.83,0l-9,9c-0.78,0.78 -0.78,2.04 0,2.82l9,9c0.39,0.39 0.9,0.58 1.41,0.58 0.51,0 1.02,-0.19 1.41,-0.58l8.99,-8.99c0.79,-0.76 0.8,-2.02 0.03,-2.82zM12.01,20.99l-9,-9 9,-9 9,9 -9,9zM8,11v4h2v-3h4v2.5l3.5,-3.5L14,7.5L14,10L9,10c-0.55,0 -1,0.45 -1,1z" />
-</vector>




diff --git a/app/src/main/res/drawable/walk_black.xml b/app/src/main/res/drawable/walk_black.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ae56cca4f7a58709c49b5f78ddb5306168f1ed65
--- /dev/null
+++ b/app/src/main/res/drawable/walk_black.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Google
+
+SPDX-License-Identifier: Apache-2.0
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:autoMirrored="true"
+    android:tint="#000000"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M13.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM9.8,8.9L7,23h2.1l1.8,-8 2.1,2v6h2v-7.5l-2.1,-2 0.6,-3C14.8,12 16.8,13 19,13v-2c-1.9,0 -3.5,-1 -4.3,-2.4l-1,-1.6c-0.4,-0.6 -1,-1 -1.7,-1 -0.3,0 -0.5,0.1 -0.8,0.1L6,8.3V13h2V9.6l1.8,-0.7" />
+</vector>




diff --git a/app/src/main/res/layout/activity_journeys.xml b/app/src/main/res/layout/activity_journeys.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b1124d955dc98e2b9d1bdcc66051f11bb3b59701
--- /dev/null
+++ b/app/src/main/res/layout/activity_journeys.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	xmlns:tools="http://schemas.android.com/tools"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent"
+	tools:context=".journeys.JourneysActivity">
+
+	<org.osmdroid.views.MapView
+		android:id="@+id/map"
+		android:layout_marginBottom="200dp"
+		android:layout_width="match_parent"
+		android:layout_height="match_parent" />
+
+	<androidx.constraintlayout.widget.ConstraintLayout
+		android:id="@+id/journeys_bottom_sheet"
+		style="@style/Widget.Material3.BottomSheet"
+		android:layout_width="match_parent"
+		android:layout_height="640dp"
+		app:behavior_hideable="false"
+		app:behavior_peekHeight="256dp"
+		app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
+
+		<com.google.android.material.bottomsheet.BottomSheetDragHandleView
+			android:id="@+id/drag_handle"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			app:layout_constraintEnd_toEndOf="parent"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toTopOf="parent" />
+
+		<androidx.recyclerview.widget.RecyclerView
+			android:id="@+id/journeys"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:clipToPadding="false"
+			android:visibility="gone"
+			app:layout_behavior="@string/appbar_scrolling_view_behavior"
+			app:layout_constraintTop_toBottomOf="@+id/drag_handle" />
+
+		<com.google.android.material.progressindicator.CircularProgressIndicator
+			android:id="@+id/journeys_progress"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:layout_marginTop="48dp"
+			android:indeterminate="true"
+			app:layout_constraintEnd_toEndOf="parent"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toBottomOf="@+id/drag_handle" />
+
+		<ImageView
+			android:id="@+id/empty_image"
+			android:layout_width="92dp"
+			android:layout_height="92dp"
+			android:layout_marginTop="36dp"
+			android:src="@drawable/error_journeys"
+			android:visibility="gone"
+			app:layout_constraintEnd_toEndOf="parent"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toBottomOf="@+id/drag_handle"
+			tools:ignore="ContentDescription" />
+
+		<com.google.android.material.textview.MaterialTextView
+			android:id="@+id/empty_text"
+			android:layout_width="0dp"
+			android:layout_height="wrap_content"
+			android:layout_marginStart="16dp"
+			android:layout_marginTop="8dp"
+			android:layout_marginEnd="16dp"
+			android:text="@string/no_journeys_found"
+			android:textAlignment="center"
+			android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall"
+			android:visibility="gone"
+			app:layout_constraintEnd_toEndOf="parent"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toBottomOf="@+id/empty_image" />
+
+	</androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file




diff --git a/app/src/main/res/layout/alert.xml b/app/src/main/res/layout/alert.xml
index a1488e4efc5bd06fdb4e6d8f23f1636b9ad07e0a..007fff0466804089567b32b3d8256e4ca1eb1a9a 100644
--- a/app/src/main/res/layout/alert.xml
+++ b/app/src/main/res/layout/alert.xml
@@ -3,7 +3,7 @@
 <!--
 SPDX-FileCopyrightText: Adam Evyčędo
 
-SPDX-License-Identifier: AGPL-3.0-or-later
+SPDX-License-Identifier: GPL-3.0-or-later
 -->
 
 <com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"




diff --git a/app/src/main/res/layout/chip_suggestion.xml b/app/src/main/res/layout/chip_suggestion.xml
new file mode 100644
index 0000000000000000000000000000000000000000..49e80e69de34bb4afbb18e68fdcaad7ac00904d5
--- /dev/null
+++ b/app/src/main/res/layout/chip_suggestion.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+
+<com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android"
+	style="@style/Theme.Bimba.Chip.Suggestion"
+	android:textAppearance="@style/Theme.Bimba.Chip.Text"
+	android:layout_width="wrap_content"
+	android:layout_height="wrap_content">
+
+</com.google.android.material.chip.Chip>
\ No newline at end of file




diff --git a/app/src/main/res/layout/fragment_journey.xml b/app/src/main/res/layout/fragment_journey.xml
new file mode 100644
index 0000000000000000000000000000000000000000..946d88abf3855b76dc3519c27509f646a2ba1031
--- /dev/null
+++ b/app/src/main/res/layout/fragment_journey.xml
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	xmlns:tool="http://schemas.android.com/tools"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent"
+	tool:context="xyz.apiote.bimba.czwek.dashboard.ui.journey.JourneyFragment">
+
+	<com.google.android.material.textfield.TextInputLayout
+		android:id="@+id/origin_input"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginLeft="16dp"
+		android:layout_marginTop="16dp"
+		android:layout_marginRight="16dp"
+		android:hint="@string/origin_input_hint"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toTopOf="parent"
+		app:startIconDrawable="@drawable/origin">
+
+		<com.google.android.material.textfield.TextInputEditText
+			android:id="@+id/origin"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:imeOptions="actionSearch"
+			android:inputType="text" />
+	</com.google.android.material.textfield.TextInputLayout>
+
+	<com.google.android.material.chip.ChipGroup
+		android:id="@+id/origin_suggestions"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginLeft="16dp"
+		android:layout_marginTop="4dp"
+		android:layout_marginRight="16dp"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/origin_input" />
+
+	<!--  via
+				required: false
+					List of via stops to visit (only stop IDs, no coordinates allowed for now).
+					maxItems: 2
+
+				viaMinimumStay
+				required: false
+					Optional. If not set, the default is `0,0` - no stay required.
+					For each `via` stop a minimum stay duration in minutes.
+
+					The value `0` signals that it's allowed to stay in the same trip.
+					This enables via stays without counting a transfer and can lead
+					to better connections with less transfers. Transfer connections can
+					still be found with `viaMinimumStay=0`.
+					default: [ 0, 0 ]
+					type: array
+					maxItems: 2
+				-->
+
+	<com.google.android.material.textfield.TextInputLayout
+		android:id="@+id/destination_input"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginLeft="16dp"
+		android:layout_marginTop="16dp"
+		android:layout_marginRight="16dp"
+		android:hint="@string/destination_input_hint"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/origin_suggestions"
+		app:startIconDrawable="@drawable/destination">
+
+		<com.google.android.material.textfield.TextInputEditText
+			android:id="@+id/destination"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:imeOptions="actionSearch"
+			android:inputType="text" />
+	</com.google.android.material.textfield.TextInputLayout>
+
+	<com.google.android.material.chip.ChipGroup
+		android:id="@+id/destination_suggestions"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginLeft="16dp"
+		android:layout_marginTop="4dp"
+		android:layout_marginRight="16dp"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/destination_input" />
+
+
+	<com.google.android.material.divider.MaterialDivider
+		android:id="@+id/materialDivider"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="16dp"
+		app:dividerInsetEnd="16dp"
+		app:dividerInsetStart="16dp"
+		app:layout_constraintTop_toBottomOf="@id/destination_suggestions" />
+
+	<com.google.android.material.chip.ChipGroup
+		android:id="@+id/chips_params_time"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="16dp"
+		android:paddingStart="16dp"
+		android:paddingEnd="16dp"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@+id/materialDivider">
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_time_reference"
+			style="@style/Theme.Bimba.Chip.Filter"
+			android:textAppearance="@style/Theme.Bimba.Chip.Text"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:checkable="false"
+			android:text="@string/depart_after"
+			app:checkedIconEnabled="false"
+			app:closeIcon="@drawable/dropdown"
+			app:closeIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_date"
+			style="@style/Theme.Bimba.Chip.Filter"
+			android:textAppearance="@style/Theme.Bimba.Chip.Text"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:checkable="false"
+			android:text="@string/today"
+			app:checkedIconEnabled="false"
+			app:closeIcon="@drawable/dropdown"
+			app:closeIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_time"
+			style="@style/Theme.Bimba.Chip.Filter"
+			android:textAppearance="@style/Theme.Bimba.Chip.Text"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:checkable="false"
+			android:text="@string/now"
+			app:checkedIconEnabled="false"
+			app:closeIcon="@drawable/dropdown"
+			app:closeIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+	</com.google.android.material.chip.ChipGroup>
+
+	<com.google.android.material.chip.ChipGroup
+		android:id="@+id/chips_params_accessible"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="8dp"
+		android:paddingStart="16dp"
+		android:paddingEnd="16dp"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/chips_params_time">
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_wheelchair"
+			style="@style/Theme.Bimba.Chip.Filter"
+			android:textAppearance="@style/Theme.Bimba.Chip.Text"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:text="@string/wheelchair_accessible"
+			app:chipIcon="@drawable/wheelchair"
+			app:chipIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_bike"
+			style="@style/Theme.Bimba.Chip.Filter"
+			android:textAppearance="@style/Theme.Bimba.Chip.Text"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:text="@string/bike_transport"
+			app:chipIcon="@drawable/bike"
+			app:chipIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+		<!--<com.google.android.material.chip.Chip
+			android:id="@+id/chip_options"
+			style="@style/Theme.Bimba.Chip.Filter"
+			android:textAppearance="@style/Theme.Bimba.Chip.Filter.Text"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:text="@string/other_options"
+			app:chipIcon="@drawable/options"
+			app:chipIconEnabled="true"
+			tool:ignore="MissingConstraints" />-->
+
+	</com.google.android.material.chip.ChipGroup>
+
+	<Button
+		android:id="@+id/goButton"
+		style="@style/Widget.Material3.Button.Icon"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_margin="16dp"
+		android:text="@string/go"
+		app:icon="@drawable/journey_outline"
+		app:layout_constraintBottom_toBottomOf="parent"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent" />
+
+	<!--
+			- name: maxTransfers
+				required: false
+					The maximum number of allowed transfers.
+					If not provided, the routing uses the server-side default value
+					which is hardcoded and very high to cover all use cases.
+				schema:
+					type: integer
+
+			- name: maxHours
+				required: false
+					The maximum travel time in hours.
+					If not provided, the routing to uses the value
+					hardcoded in the server which is usually quite high.
+				schema:
+					type: number
+
+			- name: minTransferTime
+				required: false
+					Minimum transfer time for each transfer in minutes.
+				schema:
+					type: integer
+					default: 0
+
+			- name: additionalTransferTime
+				required: false
+					Additional transfer time reserved for each transfer in minutes.
+				schema:
+					type: integer
+					default: 0
+
+			- name: transferTimeFactor
+				required: false
+					Factor to multiply minimum required transfer times with.
+					Values smaller than 1.0 are not supported.
+				schema:
+					type: number
+					default: 1.0
+
+			- name: maxMatchingDistance
+				required: true
+					Maximum matching distance in meters to match geo coordinates to the street network.
+				schema:
+					type: number
+					default: 25
+
+			- name: transitModes
+				required: false
+					Optional. Default is `TRANSIT` which allows all transit modes (no restriction).
+					Allowed modes for the transit part. If empty, no transit connections will be computed.
+					For example, this can be used to allow only `METRO,SUBWAY,TRAM`.
+				schema:
+					default:
+						- TRANSIT
+					type: array
+
+			- name: directModes
+				required: false
+					Optional. Default is `WALK` which will compute walking routes as direct connections.
+					Modes used for direction connections from start to destination without using transit.
+					Results will be returned on the `direct` key.
+					Note: Direct connections will only be returned on the first call. For paging calls, they can be omitted.
+					Note: Transit connections that are slower than the fastest direct connection will not show up.
+					This is being used as a cut-off during transit routing to speed up the search.
+					To prevent this, it's possible to send two separate requests (one with only `transitModes` and one with only `directModes`).
+					Only non-transit modes such as `WALK`, `BIKE`, `CAR`, `BIKE_SHARING`, etc. can be used.
+				schema:
+					default:
+						- WALK
+					type: array
+
+			- name: preTransitModes
+				required: false
+					Optional. Default is `WALK`. Only applies if the `from` place is a coordinate (not a transit stop). Does not apply to direct connections (see `directModes`).
+					A list of modes that are allowed to be used from the `from` coordinate to the first transit stop. Example: `WALK,BIKE_SHARING`.
+				schema:
+					default:
+						- WALK
+					type: array
+
+			- name: postTransitModes
+				required: false
+					Optional. Default is `WALK`. Only applies if the `to` place is a coordinate (not a transit stop). Does not apply to direct connections (see `directModes`).
+					A list of modes that are allowed to be used from the last transit stop to the `to` coordinate. Example: `WALK,BIKE_SHARING`.
+				schema:
+					default:
+						- WALK
+					type: array
+
+			- name: numItineraries
+				required: false
+					The minimum number of itineraries to compute.
+					This is only relevant if `timetableView=true`.
+				schema:
+					type: integer
+					default: 5
+
+			- name: pageCursor
+				required: false
+					Use the cursor to go to the next "page" of itineraries.
+					Copy the cursor from the last response and keep the original request as is.
+					This will enable you to search for itineraries in the next or previous time-window.
+
+			- name: timetableView
+				required: false
+					Search for the best trip options within a time window.
+					If true two itineraries are considered optimal
+					if one is better on arrival time (earliest wins)
+					and the other is better on departure time (latest wins).
+					In combination with arriveBy this parameter cover the following use cases:
+					`timetable=false` = waiting for the first transit departure/arrival is considered travel time:
+						- `arriveBy=true`: event (e.g. a meeting) starts at 10:00 am,
+							compute the best journeys that arrive by that time (maximizes departure time)
+						- `arriveBy=false`: event (e.g. a meeting) ends at 11:00 am,
+							compute the best journeys that depart after that time
+					`timetable=true` = optimize "later departure" + "earlier arrival" and give all options over a time window:
+						- `arriveBy=true`: the time window around `date` and `time` refers to the arrival time window
+						- `arriveBy=false`: the time window around `date` and `time` refers to the departure time window
+				schema:
+					type: boolean
+					default: true
+
+			- name: searchWindow
+				required: false
+					Optional. Default is 2 hours which is `7200`.
+					The length of the search-window in seconds. Default value two hours.
+						- `arriveBy=true`: number of seconds between the earliest departure time and latest departure time
+						- `arriveBy=false`: number of seconds between the earliest arrival time and the latest arrival time
+				schema:
+					type: integer
+					default: 7200
+					minium: 0
+
+			- name: maxPreTransitTime
+				required: false
+					Maximum time in seconds for the first street leg.
+				schema:
+					type: integer
+					default: 900
+					minimum: 0
+
+			- name: maxPostTransitTime
+				required: false
+					Maximum time in seconds for the last street leg.
+				schema:
+					type: integer
+					default: 900
+					minimum: 0
+
+			- name: maxDirectTime
+				required: false
+					Maximum time in seconds for direct connections.
+				schema:
+					type: integer
+					default: 1800
+					minimum: 0
+					-->
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file




diff --git a/app/src/main/res/layout/fragment_voyage.xml b/app/src/main/res/layout/fragment_voyage.xml
deleted file mode 100644
index d203fb59097298684b55267db3e3f7250717b285..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/fragment_voyage.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-SPDX-FileCopyrightText: Adam Evyčędo
-
-SPDX-License-Identifier: GPL-3.0-or-later
--->
-
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-	xmlns:app="http://schemas.android.com/apk/res-auto"
-	xmlns:tool="http://schemas.android.com/tools"
-	android:layout_width="match_parent"
-	android:layout_height="match_parent"
-	tool:context="xyz.apiote.bimba.czwek.dashboard.ui.voyage.VoyageFragment">
-
-	<com.google.android.material.textview.MaterialTextView
-		android:id="@+id/text_dashboard"
-		android:layout_width="match_parent"
-		android:layout_height="wrap_content"
-		android:layout_marginStart="8dp"
-		android:layout_marginTop="8dp"
-		android:layout_marginEnd="8dp"
-		android:textAlignment="center"
-		android:textSize="20sp"
-		app:layout_constraintBottom_toBottomOf="parent"
-		app:layout_constraintEnd_toEndOf="parent"
-		app:layout_constraintStart_toStartOf="parent"
-		app:layout_constraintTop_toTopOf="parent" />
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file




diff --git a/app/src/main/res/layout/journey.xml b/app/src/main/res/layout/journey.xml
new file mode 100644
index 0000000000000000000000000000000000000000..be5120d120ac8514a2a112c47feef904733d0a6b
--- /dev/null
+++ b/app/src/main/res/layout/journey.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	xmlns:tools="http://schemas.android.com/tools"
+	android:id="@+id/journey"
+	android:layout_margin="8dp"
+	android:layout_width="match_parent"
+	android:layout_height="wrap_content">
+
+	<androidx.constraintlayout.widget.ConstraintLayout
+		android:layout_width="match_parent"
+		android:layout_height="match_parent"
+		android:padding="16dp">
+
+		<com.google.android.material.textview.MaterialTextView
+			android:id="@+id/start_time"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toTopOf="parent"
+			tools:text="11:25" />
+
+		<com.google.android.material.textview.MaterialTextView
+			android:id="@+id/lines"
+			android:layout_width="0dp"
+			android:layout_height="wrap_content"
+			android:layout_marginStart="16dp"
+			android:layout_marginEnd="16dp"
+			android:textAlignment="center"
+			android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall"
+			app:layout_constraintEnd_toStartOf="@+id/end_time"
+			app:layout_constraintStart_toEndOf="@+id/start_time"
+			app:layout_constraintTop_toTopOf="@+id/start_time"
+			tools:text="Metropolitan, Circle, Hammersmith&amp;City" />
+
+		<com.google.android.material.textview.MaterialTextView
+			android:id="@+id/end_time"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall"
+			app:layout_constraintEnd_toEndOf="parent"
+			app:layout_constraintTop_toTopOf="@+id/lines"
+			tools:text="12:30" />
+
+		<LinearLayout
+			android:id="@+id/legs"
+			android:visibility="gone"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:layout_margin="8dp"
+			android:orientation="vertical"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toBottomOf="@+id/lines" />
+
+
+	</androidx.constraintlayout.widget.ConstraintLayout>
+
+</com.google.android.material.card.MaterialCardView>
\ No newline at end of file




diff --git a/app/src/main/res/layout/journey_leg.xml b/app/src/main/res/layout/journey_leg.xml
new file mode 100644
index 0000000000000000000000000000000000000000..72d8f2d222507dbde33fb613c7c7f37e9e888818
--- /dev/null
+++ b/app/src/main/res/layout/journey_leg.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+	android:layout_width="wrap_content"
+	android:layout_height="wrap_content"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	android:paddingStart="8dp"
+	android:paddingEnd="8dp"
+	android:paddingTop="16dp"
+	android:paddingBottom="16dp"
+	xmlns:tool="http://schemas.android.com/tools">
+	<ImageView
+		android:id="@+id/leg_origin_image"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:src="@drawable/origin"
+		android:contentDescription="@string/beginning_of_journey_s_leg"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toTopOf="parent" />
+
+	<com.google.android.material.textview.MaterialTextView
+		android:id="@+id/leg_origin"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_marginStart="8dp"
+		android:textAppearance="@style/TextAppearance.Material3.BodyLarge"
+		app:layout_constraintBottom_toBottomOf="@+id/leg_origin_image"
+		app:layout_constraintStart_toEndOf="@+id/leg_origin_image"
+		app:layout_constraintTop_toTopOf="@+id/leg_origin_image"
+		tool:text="Polna" />
+
+	<com.google.android.material.textview.MaterialTextView
+		android:id="@+id/leg_origin_time"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_marginStart="8dp"
+		android:textAppearance="@style/TextAppearance.Material3.BodyLarge"
+		app:layout_constraintBottom_toBottomOf="@+id/leg_origin"
+		app:layout_constraintStart_toEndOf="@+id/leg_origin"
+		app:layout_constraintTop_toTopOf="@+id/leg_origin"
+		tool:text="11:25" />
+
+	<ImageView
+		android:id="@+id/leg_mode_image"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="8dp"
+		android:src="@drawable/bike"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@+id/leg_origin_image"
+        tool:ignore="ContentDescription" />
+
+	<com.google.android.material.textview.MaterialTextView
+		android:id="@+id/leg_line"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:paddingEnd="8dp"
+		android:paddingStart="8dp"
+		android:textAppearance="@style/TextAppearance.Material3.BodyLarge"
+		app:layout_constraintBottom_toBottomOf="@+id/leg_mode_image"
+		app:layout_constraintStart_toEndOf="@+id/leg_mode_image"
+		app:layout_constraintTop_toTopOf="@+id/leg_mode_image"
+		tool:text="610" />
+
+	<com.google.android.material.textview.MaterialTextView
+		android:id="@+id/leg_distance"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_marginStart="8dp"
+		android:textAppearance="@style/TextAppearance.Material3.LabelSmall"
+		app:layout_constraintBottom_toBottomOf="@+id/leg_line"
+		app:layout_constraintStart_toEndOf="@+id/leg_line"
+		app:layout_constraintTop_toTopOf="@+id/leg_line"
+		tool:text="12 stops" />
+
+	<ImageView
+		android:id="@+id/leg_destination_image"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="8dp"
+		android:src="@drawable/destination"
+		android:contentDescription="@string/end_of_journey_s_leg"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@+id/leg_mode_image" />
+
+	<com.google.android.material.textview.MaterialTextView
+		android:id="@+id/leg_destination"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_marginStart="8dp"
+		android:textAppearance="@style/TextAppearance.Material3.BodyLarge"
+		app:layout_constraintBottom_toBottomOf="@+id/leg_destination_image"
+		app:layout_constraintStart_toEndOf="@+id/leg_destination_image"
+		app:layout_constraintTop_toTopOf="@+id/leg_destination_image"
+		tool:text="Dębiec" />
+
+	<com.google.android.material.textview.MaterialTextView
+		android:id="@+id/leg_destination_time"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_marginStart="8dp"
+		android:textAppearance="@style/TextAppearance.Material3.BodyLarge"
+		app:layout_constraintBottom_toBottomOf="@+id/leg_destination"
+		app:layout_constraintStart_toEndOf="@+id/leg_destination"
+		app:layout_constraintTop_toTopOf="@+id/leg_destination"
+		tool:text="11:30" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file




diff --git a/app/src/main/res/layout/place_bottom_sheet.xml b/app/src/main/res/layout/place_bottom_sheet.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8f32c1a27fd4d8f57a94510b0167f3ea8af24c4f
--- /dev/null
+++ b/app/src/main/res/layout/place_bottom_sheet.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	android:layout_width="match_parent"
+	android:paddingBottom="16dp"
+	android:layout_height="match_parent"
+	xmlns:tool="http://schemas.android.com/tools">
+
+	<com.google.android.material.bottomsheet.BottomSheetDragHandleView
+		android:id="@+id/drag_handle"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		app:layout_constraintTop_toTopOf="parent" />
+
+	<com.google.android.material.textview.MaterialTextView
+		android:id="@+id/coordinates"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="8dp"
+		android:textAlignment="center"
+		android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@+id/drag_handle"
+		tool:text="17.151864867, 52.215648641" />
+
+	<androidx.constraintlayout.helper.widget.Flow
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="16dp"
+		app:constraint_referenced_ids="use_as_origin,use_as_destination"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/coordinates" />
+
+	<Button
+		android:id="@+id/use_as_origin"
+		style="@style/Widget.Material3.Button.Icon"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:text="@string/use_as_origin"
+		app:icon="@drawable/origin" />
+
+	<Button
+		android:id="@+id/use_as_destination"
+		style="@style/Widget.Material3.Button.Icon"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:text="@string/use_as_destination"
+		app:icon="@drawable/destination" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file




diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml
index d214c5dac728ebb9433d8cc381641595ffa3c6fe..7d38e25b7bd507b5f939bcd9e6ab38ee1e055725 100644
--- a/app/src/main/res/layout/settings_activity.xml
+++ b/app/src/main/res/layout/settings_activity.xml
@@ -1,7 +1,7 @@
 <!--
 SPDX-FileCopyrightText: Adam Evyčędo
 
-SPDX-License-Identifier: AGPL-3.0-or-later
+SPDX-License-Identifier: GPL-3.0-or-later
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"




diff --git a/app/src/main/res/layout/stop_bottom_sheet.xml b/app/src/main/res/layout/stop_bottom_sheet.xml
index 8b7419d9a9dfa5803e59a1c207e287a826656b2b..75a659e26de9b39f20a20c47da6839484a749294 100644
--- a/app/src/main/res/layout/stop_bottom_sheet.xml
+++ b/app/src/main/res/layout/stop_bottom_sheet.xml
@@ -66,4 +66,29 @@ 		app:layout_constraintEnd_toEndOf="parent"
 		app:layout_constraintStart_toStartOf="parent"
 		app:layout_constraintTop_toBottomOf="@+id/departures_button" />
 
+	<androidx.constraintlayout.helper.widget.Flow
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="8dp"
+		app:constraint_referenced_ids="use_as_origin,use_as_destination"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/navigation_button" />
+
+	<Button
+		android:id="@+id/use_as_origin"
+		style="@style/Widget.Material3.Button.TextButton.Icon"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:text="@string/use_as_origin"
+		app:icon="@drawable/origin" />
+
+	<Button
+		android:id="@+id/use_as_destination"
+		style="@style/Widget.Material3.Button.TextButton.Icon"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:text="@string/use_as_destination"
+		app:icon="@drawable/destination" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>




diff --git a/app/src/main/res/layout-land/activity_journeys.xml b/app/src/main/res/layout-land/activity_journeys.xml
new file mode 100644
index 0000000000000000000000000000000000000000..56817e15e5b87abec07b36f669d67786832b9e14
--- /dev/null
+++ b/app/src/main/res/layout-land/activity_journeys.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	xmlns:tools="http://schemas.android.com/tools"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent"
+	tools:context=".journeys.JourneysActivity">
+
+	<org.osmdroid.views.MapView
+		android:id="@+id/map"
+		android:layout_marginStart="350dp"
+		android:layout_width="match_parent"
+		android:layout_height="match_parent" />
+
+	<androidx.constraintlayout.widget.ConstraintLayout
+		app:behavior_draggable="false"
+		android:background="?attr/colorSurface"
+		android:id="@+id/journeys_side_sheet"
+		android:layout_width="384dp"
+		android:layout_height="match_parent"
+		android:layout_gravity="start"
+		app:layout_behavior="com.google.android.material.sidesheet.SideSheetBehavior">
+
+		<androidx.recyclerview.widget.RecyclerView
+			android:id="@+id/journeys"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:clipToPadding="false"
+			android:visibility="gone"
+			app:layout_behavior="@string/appbar_scrolling_view_behavior"
+			app:layout_constraintTop_toTopOf="parent" />
+
+		<com.google.android.material.progressindicator.CircularProgressIndicator
+			android:id="@+id/journeys_progress"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:layout_marginTop="48dp"
+			android:indeterminate="true"
+			app:layout_constraintEnd_toEndOf="parent"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toTopOf="parent" />
+
+		<ImageView
+			android:id="@+id/empty_image"
+			android:layout_width="92dp"
+			android:layout_height="92dp"
+			android:layout_marginTop="36dp"
+			android:src="@drawable/error_journeys"
+			android:visibility="gone"
+			app:layout_constraintEnd_toEndOf="parent"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toTopOf="parent"
+			tools:ignore="ContentDescription" />
+
+		<com.google.android.material.textview.MaterialTextView
+			android:id="@+id/empty_text"
+			android:layout_width="0dp"
+			android:layout_height="wrap_content"
+			android:layout_marginStart="16dp"
+			android:layout_marginTop="8dp"
+			android:visibility="gone"
+			android:layout_marginEnd="16dp"
+			android:text="@string/no_journeys_found"
+			android:textAlignment="center"
+			android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall"
+			app:layout_constraintEnd_toEndOf="parent"
+			app:layout_constraintStart_toStartOf="parent"
+			app:layout_constraintTop_toBottomOf="@+id/empty_image" />
+
+	</androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.coordinatorlayout.widget.CoordinatorLayout>




diff --git a/app/src/main/res/layout-land/fragment_journey.xml b/app/src/main/res/layout-land/fragment_journey.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6d61f4ad266345f85b9bd2dc53b958c0531b3902
--- /dev/null
+++ b/app/src/main/res/layout-land/fragment_journey.xml
@@ -0,0 +1,369 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	xmlns:tool="http://schemas.android.com/tools"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent"
+	tool:context="xyz.apiote.bimba.czwek.dashboard.ui.journey.JourneyFragment">
+
+	<androidx.constraintlayout.widget.Guideline
+		android:id="@+id/middle"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:orientation="vertical"
+		app:layout_constraintGuide_percent=".5" />
+
+	<com.google.android.material.textfield.TextInputLayout
+		android:id="@+id/origin_input"
+		android:layout_width="0dp"
+		android:layout_height="wrap_content"
+		android:layout_marginLeft="16dp"
+		android:layout_marginTop="16dp"
+		android:layout_marginRight="16dp"
+		android:hint="@string/origin_input_hint"
+		app:layout_constraintEnd_toEndOf="@+id/middle"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toTopOf="parent"
+		app:startIconDrawable="@drawable/origin">
+
+		<com.google.android.material.textfield.TextInputEditText
+			android:id="@+id/origin"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:imeOptions="actionSearch"
+			android:inputType="text" />
+	</com.google.android.material.textfield.TextInputLayout>
+
+	<com.google.android.material.chip.ChipGroup
+		android:id="@+id/origin_suggestions"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginLeft="16dp"
+		android:layout_marginTop="4dp"
+		android:layout_marginRight="16dp"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/origin_input" />
+
+	<!--  via
+				required: false
+					List of via stops to visit (only stop IDs, no coordinates allowed for now).
+					maxItems: 2
+
+				viaMinimumStay
+				required: false
+					Optional. If not set, the default is `0,0` - no stay required.
+					For each `via` stop a minimum stay duration in minutes.
+
+					The value `0` signals that it's allowed to stay in the same trip.
+					This enables via stays without counting a transfer and can lead
+					to better connections with less transfers. Transfer connections can
+					still be found with `viaMinimumStay=0`.
+					default: [ 0, 0 ]
+					type: array
+					maxItems: 2
+				-->
+
+	<com.google.android.material.textfield.TextInputLayout
+		android:id="@+id/destination_input"
+		android:layout_width="0dp"
+		android:layout_height="wrap_content"
+		android:layout_marginLeft="16dp"
+		android:layout_marginTop="16dp"
+		android:layout_marginRight="16dp"
+		android:hint="@string/destination_input_hint"
+		app:layout_constraintEnd_toEndOf="@id/middle"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/origin_suggestions"
+		app:startIconDrawable="@drawable/destination">
+
+		<com.google.android.material.textfield.TextInputEditText
+			android:id="@+id/destination"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:imeOptions="actionSearch"
+			android:inputType="text" />
+	</com.google.android.material.textfield.TextInputLayout>
+
+	<com.google.android.material.chip.ChipGroup
+		android:id="@+id/destination_suggestions"
+		android:layout_width="match_parent"
+		android:layout_height="wrap_content"
+		android:layout_marginLeft="16dp"
+		android:layout_marginTop="4dp"
+		android:layout_marginRight="16dp"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="parent"
+		app:layout_constraintTop_toBottomOf="@id/destination_input" />
+
+
+	<com.google.android.material.chip.ChipGroup
+		android:id="@+id/chips_params_time"
+		android:layout_width="0dp"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="16dp"
+		android:paddingStart="16dp"
+		android:paddingEnd="16dp"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="@id/middle"
+		app:layout_constraintTop_toTopOf="parent">
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_time_reference"
+			style="@style/Widget.Material3.Chip.Filter"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:checkable="false"
+			android:text="@string/depart_after"
+			app:checkedIconEnabled="false"
+			app:closeIcon="@drawable/dropdown"
+			app:closeIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_date"
+			style="@style/Widget.Material3.Chip.Filter"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:checkable="false"
+			android:text="@string/today"
+			app:checkedIconEnabled="false"
+			app:closeIcon="@drawable/dropdown"
+			app:closeIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_time"
+			style="@style/Widget.Material3.Chip.Filter"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:checkable="false"
+			android:text="@string/now"
+			app:checkedIconEnabled="false"
+			app:closeIcon="@drawable/dropdown"
+			app:closeIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+	</com.google.android.material.chip.ChipGroup>
+
+	<com.google.android.material.chip.ChipGroup
+		android:id="@+id/chips_params_accessible"
+		android:layout_width="0dp"
+		android:layout_height="wrap_content"
+		android:layout_marginTop="8dp"
+		android:paddingStart="16dp"
+		android:paddingEnd="16dp"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="@id/middle"
+		app:layout_constraintTop_toBottomOf="@id/chips_params_time">
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_wheelchair"
+			style="@style/Widget.Material3.Chip.Filter"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:text="@string/wheelchair_accessible"
+			app:chipIcon="@drawable/wheelchair"
+			app:chipIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+		<com.google.android.material.chip.Chip
+			android:id="@+id/chip_bike"
+			style="@style/Widget.Material3.Chip.Filter"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:text="@string/bike_transport"
+			app:chipIcon="@drawable/bike"
+			app:chipIconEnabled="true"
+			tool:ignore="MissingConstraints" />
+
+		<!--<com.google.android.material.chip.Chip
+			android:id="@+id/chip_options"
+			style="@style/Widget.Material3.Chip.Filter"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:text="@string/other_options"
+			app:chipIcon="@drawable/options"
+			app:chipIconEnabled="true"
+			tool:ignore="MissingConstraints" />-->
+
+	</com.google.android.material.chip.ChipGroup>
+
+	<Button
+		android:id="@+id/goButton"
+		style="@style/Widget.Material3.Button.Icon"
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_margin="16dp"
+		android:text="@string/go"
+		app:icon="@drawable/journey_outline"
+		app:layout_constraintBottom_toBottomOf="parent"
+		app:layout_constraintEnd_toEndOf="parent"
+		app:layout_constraintStart_toStartOf="@id/middle" />
+
+	<!--
+			- name: maxTransfers
+				required: false
+					The maximum number of allowed transfers.
+					If not provided, the routing uses the server-side default value
+					which is hardcoded and very high to cover all use cases.
+				schema:
+					type: integer
+
+			- name: maxHours
+				required: false
+					The maximum travel time in hours.
+					If not provided, the routing to uses the value
+					hardcoded in the server which is usually quite high.
+				schema:
+					type: number
+
+			- name: minTransferTime
+				required: false
+					Minimum transfer time for each transfer in minutes.
+				schema:
+					type: integer
+					default: 0
+
+			- name: additionalTransferTime
+				required: false
+					Additional transfer time reserved for each transfer in minutes.
+				schema:
+					type: integer
+					default: 0
+
+			- name: transferTimeFactor
+				required: false
+					Factor to multiply minimum required transfer times with.
+					Values smaller than 1.0 are not supported.
+				schema:
+					type: number
+					default: 1.0
+
+			- name: maxMatchingDistance
+				required: true
+					Maximum matching distance in meters to match geo coordinates to the street network.
+				schema:
+					type: number
+					default: 25
+
+			- name: transitModes
+				required: false
+					Optional. Default is `TRANSIT` which allows all transit modes (no restriction).
+					Allowed modes for the transit part. If empty, no transit connections will be computed.
+					For example, this can be used to allow only `METRO,SUBWAY,TRAM`.
+				schema:
+					default:
+						- TRANSIT
+					type: array
+
+			- name: directModes
+				required: false
+					Optional. Default is `WALK` which will compute walking routes as direct connections.
+					Modes used for direction connections from start to destination without using transit.
+					Results will be returned on the `direct` key.
+					Note: Direct connections will only be returned on the first call. For paging calls, they can be omitted.
+					Note: Transit connections that are slower than the fastest direct connection will not show up.
+					This is being used as a cut-off during transit routing to speed up the search.
+					To prevent this, it's possible to send two separate requests (one with only `transitModes` and one with only `directModes`).
+					Only non-transit modes such as `WALK`, `BIKE`, `CAR`, `BIKE_SHARING`, etc. can be used.
+				schema:
+					default:
+						- WALK
+					type: array
+
+			- name: preTransitModes
+				required: false
+					Optional. Default is `WALK`. Only applies if the `from` place is a coordinate (not a transit stop). Does not apply to direct connections (see `directModes`).
+					A list of modes that are allowed to be used from the `from` coordinate to the first transit stop. Example: `WALK,BIKE_SHARING`.
+				schema:
+					default:
+						- WALK
+					type: array
+
+			- name: postTransitModes
+				required: false
+					Optional. Default is `WALK`. Only applies if the `to` place is a coordinate (not a transit stop). Does not apply to direct connections (see `directModes`).
+					A list of modes that are allowed to be used from the last transit stop to the `to` coordinate. Example: `WALK,BIKE_SHARING`.
+				schema:
+					default:
+						- WALK
+					type: array
+
+			- name: numItineraries
+				required: false
+					The minimum number of itineraries to compute.
+					This is only relevant if `timetableView=true`.
+				schema:
+					type: integer
+					default: 5
+
+			- name: pageCursor
+				required: false
+					Use the cursor to go to the next "page" of itineraries.
+					Copy the cursor from the last response and keep the original request as is.
+					This will enable you to search for itineraries in the next or previous time-window.
+
+			- name: timetableView
+				required: false
+					Search for the best trip options within a time window.
+					If true two itineraries are considered optimal
+					if one is better on arrival time (earliest wins)
+					and the other is better on departure time (latest wins).
+					In combination with arriveBy this parameter cover the following use cases:
+					`timetable=false` = waiting for the first transit departure/arrival is considered travel time:
+						- `arriveBy=true`: event (e.g. a meeting) starts at 10:00 am,
+							compute the best journeys that arrive by that time (maximizes departure time)
+						- `arriveBy=false`: event (e.g. a meeting) ends at 11:00 am,
+							compute the best journeys that depart after that time
+					`timetable=true` = optimize "later departure" + "earlier arrival" and give all options over a time window:
+						- `arriveBy=true`: the time window around `date` and `time` refers to the arrival time window
+						- `arriveBy=false`: the time window around `date` and `time` refers to the departure time window
+				schema:
+					type: boolean
+					default: true
+
+			- name: searchWindow
+				required: false
+					Optional. Default is 2 hours which is `7200`.
+					The length of the search-window in seconds. Default value two hours.
+						- `arriveBy=true`: number of seconds between the earliest departure time and latest departure time
+						- `arriveBy=false`: number of seconds between the earliest arrival time and the latest arrival time
+				schema:
+					type: integer
+					default: 7200
+					minium: 0
+
+			- name: maxPreTransitTime
+				required: false
+					Maximum time in seconds for the first street leg.
+				schema:
+					type: integer
+					default: 900
+					minimum: 0
+
+			- name: maxPostTransitTime
+				required: false
+					Maximum time in seconds for the last street leg.
+				schema:
+					type: integer
+					default: 900
+					minimum: 0
+
+			- name: maxDirectTime
+				required: false
+					Maximum time in seconds for direct connections.
+				schema:
+					type: integer
+					default: 1800
+					minimum: 0
+					-->
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file




diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml
index be717aeeddf1f9fb5849e9756457444ce8ea25d6..e9baee47d1ea7c40f76098f8346b95de30bc64c7 100644
--- a/app/src/main/res/menu/bottom_nav_menu.xml
+++ b/app/src/main/res/menu/bottom_nav_menu.xml
@@ -15,9 +15,8 @@ 	 		android:id="@+id/navigation_home"
 		android:icon="@drawable/home_outline"
 		android:title="@string/title_home" />
-	<!-- todo [voyage planning]
 	<item
-		android:id="@+id/navigation_voyage"
-		android:icon="@drawable/voyage_outline"
-		android:title="@string/title_voyage" />-->
-</menu>
\ No newline at end of file
+		android:id="@+id/navigation_journey"
+		android:icon="@drawable/journey_outline"
+		android:title="@string/title_journey" />
+</menu>




diff --git a/app/src/main/res/navigation/front_navigation.xml b/app/src/main/res/navigation/front_navigation.xml
index 1049aa1728a3a4a9591aad523c1527025415d860..95683393d7bae1885eeaebed7025477c2b0eebdc 100644
--- a/app/src/main/res/navigation/front_navigation.xml
+++ b/app/src/main/res/navigation/front_navigation.xml
@@ -25,8 +25,8 @@ 		android:label="@string/title_map"
 		tool:layout="@layout/fragment_map" />
 
 	<fragment
-		android:id="@+id/navigation_voyage"
-		android:name="xyz.apiote.bimba.czwek.dashboard.ui.voyage.VoyageFragment"
+		android:id="@+id/navigation_journey"
+		android:name="xyz.apiote.bimba.czwek.dashboard.ui.journey.JourneyFragment"
 		android:label="@string/title_journey"
-		tool:layout="@layout/fragment_voyage" />
-</navigation>
\ No newline at end of file
+		tool:layout="@layout/fragment_journey" />
+</navigation>




diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index c710126e20b4f019657300ecb9aa147f18ad8b19..1c3aa969c63b4e6ed7a89f14920676f8816b4643 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -1,7 +1,7 @@
 <!--
 SPDX-FileCopyrightText: Adam Evyčędo
 
-SPDX-License-Identifier: AGPL-3.0-or-later
+SPDX-License-Identifier: GPL-3.0-or-later
 -->
 
 <resources>




diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b00ba98ca26bb4cd3ff5911e98920bbbd4505df8..dce39381bead6ef1b66c86ce7bd003eaeb3d90e6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -131,6 +131,7 @@ 	towards %1$s
 	<string name="departure_momentarily">momentarily</string>
 	<string name="departure_departed">departed</string>
 	<string name="departure_now">now</string>
+	<string name="time">%1$02d:%2$02d</string>
 	<string name="at_time">at %1$02d:%2$02d</string>
 	<string name="about_time">about %1$02d:%2$02d</string>
 	<string name="at_time_realtime">at %1$02d:%2$02d:%3$02d</string>
@@ -287,10 +288,33 @@ 	A community-run provider-neutral international public transport routing service. Coverage is available at https://transitous.org/sources/
 	<string name="transitous_attribution">Transitous (https://transitous.org) API provided by Spline (https://routing.spline.de). Localities (https://github.com/public-transport/transitous/tree/main/feeds) maintained by the community.</string>
 	<string name="local_time">local time</string>
 	<string name="arrow">Arrow pointing to the stop</string>
-    <string name="departure_arrived">arrived</string>
+	<string name="departure_arrived">arrived</string>
 	<string name="arrival_approximate">approx. arr.</string>
 	<string name="arrival">arrival</string>
 	<string name="departure_approximate">approx. dep.</string>
 	<string name="departure">departure</string>
 	<string name="approximately">approximately</string>
+	<string name="origin_input_hint">Origin</string>
+	<string name="destination_input_hint">Destination</string>
+	<string name="depart_after">Depart after</string>
+	<string name="arrive_by">Arrive by</string>
+	<string name="today">Today</string>
+	<string name="now">Now</string>
+	<string name="wheelchair_accessible">Wheelchair accessible</string>
+	<string name="bike_transport">Bike transport</string>
+	<string name="go">Go</string>
+	<string name="beginning_of_journey_s_leg">beginning of journey’s leg</string>
+	<string name="end_of_journey_s_leg">end of journey’s leg</string>
+	<plurals name="number_stops">
+		<item quantity="one">%1$d stop</item>
+		<item quantity="other">%1$d stops</item>
+	</plurals>
+	<string name="use_as_origin">use as origin</string>
+	<string name="use_as_destination">use as destination</string>
+	<string name="here">here</string>
+	<string name="no_journeys_found">No journeys found</string>
+	<string name="title_select_date_journey">Select date of the journey</string>
+	<string name="title_select_time_journey">Select journey time</string>
+	<string name="other_options">Other options</string>
+	<string name="journey_stops_headsign">%1$s (» %2$s)</string>
 </resources>




diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 7bc3779f9823af620c497c26f8a3c661eb9a8d37..7ffd5f9ab587399fca106eb6ebf7de64138617bf 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -7,6 +7,7 @@
 <resources xmlns:tool="http://schemas.android.com/tools">
 
 	<style name="Theme.Bimba" parent="Theme.Material3.Light.NoActionBar">
+		<item name="fontFamily">@font/yellowcircle8</item>
 		<item name="android:fontFamily">@font/yellowcircle8</item>
 		<item name="colorPrimary">@color/md_theme_light_primary</item>
 		<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
@@ -42,6 +43,25 @@ 		true
 		<item name="randomColourLightness">.2</item>
 	</style>
 
+	<style name="Theme.Bimba.Chip.Suggestion" parent="Widget.Material3.Chip.Suggestion">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Input" parent="Widget.Material3.Chip.Input">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Filter" parent="Widget.Material3.Chip.Filter">
+		<item name="checkedIconVisible">false</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Text" parent="TextAppearance.MaterialComponents.Chip">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
 	<declare-styleable name="Theme.Bimba">
 		<attr name="randomColourLightness" format="float" />
 		<attr name="lightStatusBar" format="boolean" />
@@ -63,7 +83,7 @@ 		?attr/colorSurface
 		<item name="postSplashScreenTheme">@style/Theme.Bimba</item>
 	</style>
 
-	<style name="Theme.Bimba.Style" />
+	<style name="Theme.Bimba.Style" parent="Theme.Bimba" />
 
 	<style name="Theme.Bimba.Style.NoActionBar">
 		<item name="windowActionBar">false</item>




diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 7749d176db5065632765b6c4d761bdacdad151b5..1b73a6d65a1323723aff45b6bdf9025ba491f89f 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -1,191 +1,289 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
 SPDX-FileCopyrightText: Adam Evyčędo and contributors using Weblate
 
 SPDX-License-Identifier: GPL-3.0-or-later
---><resources>
-    <string name="filter_localities">Örtlichkeiten filtern</string>
-    <string name="title_map">Karte</string>
-    <string name="home_fab_description">GPS-Symbol</string>
-    <string name="title_activity_results">Ergebnisse</string>
-    <string name="continue_">Fortsetzen</string>
-    <string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
-    <string name="speed_in_km_per_h">%1$s km/h</string>
-    <string name="congestion_unknown">unbekannt</string>
-    <string name="congestion_congestion">Stau</string>
-    <string name="occupancy_unknown">unbekannt</string>
-    <string name="occupancy_empty">leer</string>
-    <string name="occupancy_few_seats">wenige Sitzplätze</string>
-    <string name="occupancy_many_seats">viele Sitzplätze</string>
-    <string name="occupancy_standing_only">nur Stehen</string>
-    <string name="occupancy_crowded">überfüllt</string>
-    <string name="occupancy_full">voll</string>
-    <string name="no_map_app">Keine Karten-App installiert</string>
-    <string name="departure_now">jetzt</string>
-    <string name="at_time">um %1$02d:%2$02d</string>
-    <string name="line_headsign">» %1$s</string>
-    <string name="line_headsigns">%1$s «» %2$s</string>
-    <string name="line_headsigns_content_description">zwischen %1$s und %2$s</string>
-    <string name="bimba_server_address_hint">Server</string>
-    <string name="bimba_server_token_hint">Token</string>
-    <string name="bicycles_allowed_content_description">Fahrräder erlaubt</string>
-    <string name="voice_announcements_content_description">Sprachansagen</string>
-    <string name="usb_charging_content_description">USB-Aufladen</string>
-    <string name="open_in_maps_app">In Karten-App öffnen</string>
-    <string name="onboarding_simple">Einfach</string>
-    <string name="onboarding_advanced_action">Server auswählen</string>
-    <string name="cancel">Abbrechen</string>
-    <string name="last_update">Letzte Aktualisierung: %1$s</string>
-    <string name="title_feeds">Fahrpläne</string>
-    <string name="title_cities">Örtlichkeiten</string>
-    <string name="ok">OK</string>
-    <string name="departure_headsign">» %1$s</string>
-    <string name="title_about">Über</string>
-    <string name="website_button_description">Link zu Webseite</string>
-    <string name="translation_button_description">Link zu Übersetzungsdienst</string>
-    <string name="code_button_description">Link zu Quellcode</string>
-    <string name="mastodon_button_description">Link zu Mastodon</string>
-    <string name="app_name">Bimba</string>
-    <string name="title_journey">Reise</string>
-    <string name="save">Speichern</string>
-    <string name="error_404">Nicht gefunden</string>
-    <string name="at_time_realtime">um %1$02d:%2$02d:%3$02d</string>
-    <string name="air_condition_content_description">Klimatisierung</string>
-    <string name="error">Fehler</string>
-    <string name="title_servers">Server</string>
-    <string name="time_in_s">%1$s s</string>
-    <string name="time_in_tm">%1$s %2$sTm</string>
-    <string name="time_in_tm_past">vor %1$s %2$sTm</string>
-    <string name="speed_in_m_per_s">%1$s m/s</string>
-    <string name="speed_in_mi_per_h">%1$s mph</string>
-    <string name="speed_in_vl">%1$s Vl</string>
-    <plurals name="speed_in_mi_per_h_cd">
-        <item quantity="one">%1$d meile pro stunde</item>
-        <item quantity="other">%1$d meilen pro stunde</item>
-    </plurals>
-    <plurals name="distance_in_3gf_12_cd">
-        <item quantity="one">%1$s trinagrafuß</item>
-        <item quantity="other">%1$s trinagrafüße</item>
-    </plurals>
-    <plurals name="distance_in_gf_12_cd">
-        <item quantity="one">%1$s grafuß</item>
-        <item quantity="other">%1$s grafüße</item>
-    </plurals>
-    <plurals name="time_in_s_cd">
-        <item quantity="one">%1$d sekunde</item>
-        <item quantity="other">%1$d sekunden</item>
-    </plurals>
-    <plurals name="time_in_tm_cd">
-        <item quantity="one">%1$d tim</item>
-        <item quantity="other">%1$d tims</item>
-    </plurals>
-    <plurals name="time_in_4tm_12_cd">
-        <item quantity="one">%1$s quedratim</item>
-        <item quantity="other">%1$s quedratims</item>
-    </plurals>
-    <plurals name="time_in_2tm_12_cd">
-        <item quantity="one">%1$s dunatim</item>
-        <item quantity="other">%1$s dunatims</item>
-    </plurals>
-    <plurals name="speed_in_m_per_s_cd">
-        <item quantity="one">%1$d meter pro sekunde</item>
-        <item quantity="other">%1$d meter pro sekunde</item>
-    </plurals>
-    <plurals name="speed_in_km_per_h_cd">
-        <item quantity="one">%1$d kilometer pro stunde</item>
-        <item quantity="other">%1$d kilometer pro stunde</item>
-    </plurals>
-    <plurals name="speed_in_vl_cd">
-        <item quantity="one">%1$d vlos</item>
-        <item quantity="other">%1$d vlos</item>
-    </plurals>
-    <plurals name="speed_in_vl_12_cd">
-        <item quantity="one">%1$s vlos</item>
-        <item quantity="other">%1$s vlos</item>
-    </plurals>
-    <string name="departure_momentarily">gleich</string>
-    <string name="departure_departed">abgefahren</string>
-    <string name="title_home">Start</string>
-    <string name="search_placeholder">Haltestellen, Linien oder Plus Codes</string>
-    <string name="occupancy_wont_let">wird nicht reinlassen</string>
-    <string name="stops_nearby">Haltestellen in der Nähe</string>
-    <string name="results_for">Ergebnisse für „%1$s“</string>
-    <string name="stop_content_description">Haltestelle</string>
-    <string name="stops_near_code">Haltestellen in der Nähe von %1$s</string>
-    <plurals name="distance_in_gf_cd">
-        <item quantity="one">%1$d grafuß</item>
-        <item quantity="other">%1$d grafüße</item>
-    </plurals>
-    <string name="distance_in_m">%1$s m</string>
-    <plurals name="distance_in_m_cd">
-        <item quantity="one">%1$d meter</item>
-        <item quantity="other">%1$d meter</item>
-    </plurals>
-    <string name="distance_in_km">%1$s km</string>
-    <plurals name="distance_in_km_cd">
-        <item quantity="one">%1$d kilometer</item>
-        <item quantity="other">%1$d kilometer</item>
-    </plurals>
-    <string name="distance_in_two_units_cd">%1$s und %2$s</string>
-    <string name="distance_in_yd">%1$s yd</string>
-    <plurals name="distance_in_yd_cd">
-        <item quantity="one">%1$d yard</item>
-        <item quantity="other">%1$d yard</item>
-    </plurals>
-    <string name="distance_in_ft">%1$s ft</string>
-    <plurals name="distance_in_ft_cd">
-        <item quantity="one">%1$d fuß</item>
-        <item quantity="other">%1$d füße</item>
-    </plurals>
-    <string name="distance_in_mi">%1$s mi</string>
-    <plurals name="distance_in_mi_cd">
-        <item quantity="one">%1$d meile</item>
-        <item quantity="other">%1$d meilen</item>
-    </plurals>
-    <string name="distance_in_gf">%1$s %2$sGf</string>
-    <string name="app_description">Fahrgastbegleiter FLOSS für öffentlichen Verkehr: ein Fahrplan in deine Tasche.</string>
-    <string name="error_44">keine Abfahrten</string>
-    <string name="loading">wird geladen…</string>
-    <string name="units_metric">Metrisches (SI)</string>
-    <string name="units_customary">US-amerikanisches</string>
-    <string name="units_imperial">Kaiserliches (VK)</string>
-    <string name="units_tgm10">TGM (basis 10)</string>
-    <string name="title_settings">Einstellungen</string>
-    <string name="zero">null</string>
-    <string name="six">sechs</string>
-    <string name="eight">acht</string>
-    <string name="nine">neun</string>
-    <string name="ten">zehn</string>
-    <string name="elv">elf</string>
-    <string name="zen">zend</string>
-    <string name="duna">duna</string>
-    <string name="quedra">quedra</string>
-    <string name="trin">trin</string>
-    <string name="quen">quen</string>
-    <string name="hes">hes</string>
-    <string name="sev">sev</string>
-    <string name="ak">ak</string>
-    <string name="neen">neen</string>
-    <string name="dex">dechs</string>
-    <string name="lef">lef</string>
-    <string name="more">Mehr</string>
-    <string name="error_429">Ratenlimit überschritten. Versuch später</string>
-    <string name="error_offline">Du bist offline. Mit dem Internet verbind</string>
-    <string name="no_departures">Keine Abfahrten</string>
-    <string name="departure_headsign_content_description">zu %1$s</string>
-    <string name="show_departures">Abfahrten anzeigen</string>
-    <string name="rate_limit">Ratenlimit</string>
-    <string name="seatbelts_everyone">Legt die Gurte an!</string>
-    <string name="onboarding_question">Wie möchtest du beginnen?</string>
-    <string name="units_locale_based">Systembasiert</string>
-    <string name="units_title">Einheitensystem</string>
-    <string name="units_tgm12">TGM (basis 12)</string>
-    <string name="one">ein</string>
-    <string name="two">zwei</string>
-    <string name="three">drei</string>
-    <string name="four">vier</string>
-    <string name="five">fünf</string>
-    <string name="seven">sieben</string>
-    <string name="send">Senden</string>
-    <string name="discard">Verwerfen</string>
+-->
+<resources>
+	<string name="filter_localities">Örtlichkeiten filtern</string>
+	<string name="title_map">Karte</string>
+	<string name="home_fab_description">GPS-Symbol</string>
+	<string name="title_activity_results">Ergebnisse</string>
+	<string name="continue_">Fortsetzen</string>
+	<string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
+	<string name="speed_in_km_per_h">%1$s km/h</string>
+	<string name="congestion_unknown">unbekannt</string>
+	<string name="congestion_congestion">Stau</string>
+	<string name="occupancy_unknown">unbekannt</string>
+	<string name="occupancy_empty">leer</string>
+	<string name="occupancy_few_seats">wenige Sitzplätze</string>
+	<string name="occupancy_many_seats">viele Sitzplätze</string>
+	<string name="occupancy_standing_only">nur Stehen</string>
+	<string name="occupancy_crowded">überfüllt</string>
+	<string name="occupancy_full">voll</string>
+	<string name="no_map_app">Keine Karten-App installiert</string>
+	<string name="departure_now">jetzt</string>
+	<string name="at_time">um %1$02d:%2$02d</string>
+	<string name="line_headsign">» %1$s</string>
+	<string name="line_headsigns">%1$s «» %2$s</string>
+	<string name="line_headsigns_content_description">zwischen %1$s und %2$s</string>
+	<string name="bimba_server_address_hint">Server</string>
+	<string name="bimba_server_token_hint">Token</string>
+	<string name="bicycles_allowed_content_description">Fahrräder erlaubt</string>
+	<string name="voice_announcements_content_description">Sprachansagen</string>
+	<string name="usb_charging_content_description">USB-Aufladen</string>
+	<string name="open_in_maps_app">In Karten-App öffnen</string>
+	<string name="onboarding_simple">Einfach</string>
+	<string name="onboarding_advanced_action">Server auswählen</string>
+	<string name="cancel">Abbrechen</string>
+	<string name="last_update">Letzte Aktualisierung: %1$s</string>
+	<string name="title_feeds">Fahrpläne</string>
+	<string name="title_cities">Örtlichkeiten</string>
+	<string name="ok">OK</string>
+	<string name="departure_headsign">» %1$s</string>
+	<string name="title_about">Über</string>
+	<string name="website_button_description">Link zu Webseite</string>
+	<string name="translation_button_description">Link zu Übersetzungsdienst</string>
+	<string name="code_button_description">Link zu Quellcode</string>
+	<string name="mastodon_button_description">Link zu Mastodon</string>
+	<string name="app_name">Bimba</string>
+	<string name="title_journey">Reise</string>
+	<string name="save">Speichern</string>
+	<string name="error_404">Nicht gefunden</string>
+	<string name="at_time_realtime">um %1$02d:%2$02d:%3$02d</string>
+	<string name="air_condition_content_description">Klimatisierung</string>
+	<string name="error">Fehler</string>
+	<string name="title_servers">Server</string>
+	<string name="time_in_s">%1$s s</string>
+	<string name="time_in_tm">%1$s %2$sTm</string>
+	<string name="time_in_tm_past">vor %1$s %2$sTm</string>
+	<string name="speed_in_m_per_s">%1$s m/s</string>
+	<string name="speed_in_mi_per_h">%1$s mph</string>
+	<string name="speed_in_vl">%1$s Vl</string>
+	<plurals name="speed_in_mi_per_h_cd">
+		<item quantity="one">%1$d meile pro stunde</item>
+		<item quantity="other">%1$d meilen pro stunde</item>
+	</plurals>
+	<plurals name="distance_in_3gf_12_cd">
+		<item quantity="one">%1$s trinagrafuß</item>
+		<item quantity="other">%1$s trinagrafüße</item>
+	</plurals>
+	<plurals name="distance_in_gf_12_cd">
+		<item quantity="one">%1$s grafuß</item>
+		<item quantity="other">%1$s grafüße</item>
+	</plurals>
+	<plurals name="time_in_s_cd">
+		<item quantity="one">%1$d sekunde</item>
+		<item quantity="other">%1$d sekunden</item>
+	</plurals>
+	<plurals name="time_in_tm_cd">
+		<item quantity="one">%1$d tim</item>
+		<item quantity="other">%1$d tims</item>
+	</plurals>
+	<plurals name="time_in_4tm_12_cd">
+		<item quantity="one">%1$s quedratim</item>
+		<item quantity="other">%1$s quedratims</item>
+	</plurals>
+	<plurals name="time_in_2tm_12_cd">
+		<item quantity="one">%1$s dunatim</item>
+		<item quantity="other">%1$s dunatims</item>
+	</plurals>
+	<plurals name="speed_in_m_per_s_cd">
+		<item quantity="one">%1$d meter pro sekunde</item>
+		<item quantity="other">%1$d meter pro sekunde</item>
+	</plurals>
+	<plurals name="speed_in_km_per_h_cd">
+		<item quantity="one">%1$d kilometer pro stunde</item>
+		<item quantity="other">%1$d kilometer pro stunde</item>
+	</plurals>
+	<plurals name="speed_in_vl_cd">
+		<item quantity="one">%1$d vlos</item>
+		<item quantity="other">%1$d vlos</item>
+	</plurals>
+	<plurals name="speed_in_vl_12_cd">
+		<item quantity="one">%1$s vlos</item>
+		<item quantity="other">%1$s vlos</item>
+	</plurals>
+	<string name="departure_momentarily">gleich</string>
+	<string name="departure_departed">abgefahren</string>
+	<string name="title_home">Start</string>
+	<string name="search_placeholder">Haltestellen, Linien oder Plus Codes</string>
+	<string name="occupancy_wont_let">wird nicht reinlassen</string>
+	<string name="stops_nearby">Haltestellen in der Nähe</string>
+	<string name="results_for">Ergebnisse für „%1$s“</string>
+	<string name="stop_content_description">Haltestelle</string>
+	<string name="stops_near_code">Haltestellen in der Nähe von %1$s</string>
+	<plurals name="distance_in_gf_cd">
+		<item quantity="one">%1$d grafuß</item>
+		<item quantity="other">%1$d grafüße</item>
+	</plurals>
+	<string name="distance_in_m">%1$s m</string>
+	<plurals name="distance_in_m_cd">
+		<item quantity="one">%1$d meter</item>
+		<item quantity="other">%1$d meter</item>
+	</plurals>
+	<string name="distance_in_km">%1$s km</string>
+	<plurals name="distance_in_km_cd">
+		<item quantity="one">%1$d kilometer</item>
+		<item quantity="other">%1$d kilometer</item>
+	</plurals>
+	<string name="distance_in_two_units_cd">%1$s und %2$s</string>
+	<string name="distance_in_yd">%1$s yd</string>
+	<plurals name="distance_in_yd_cd">
+		<item quantity="one">%1$d yard</item>
+		<item quantity="other">%1$d yard</item>
+	</plurals>
+	<string name="distance_in_ft">%1$s ft</string>
+	<plurals name="distance_in_ft_cd">
+		<item quantity="one">%1$d fuß</item>
+		<item quantity="other">%1$d füße</item>
+	</plurals>
+	<string name="distance_in_mi">%1$s mi</string>
+	<plurals name="distance_in_mi_cd">
+		<item quantity="one">%1$d meile</item>
+		<item quantity="other">%1$d meilen</item>
+	</plurals>
+	<string name="distance_in_gf">%1$s %2$sGf</string>
+	<string name="app_description">Fahrgastbegleiter FLOSS für öffentlichen Verkehr: ein Fahrplan in deine Tasche.</string>
+	<string name="error_44">keine Abfahrten</string>
+	<string name="loading">wird geladen…</string>
+	<string name="units_metric">Metrisches (SI)</string>
+	<string name="units_customary">US-amerikanisches</string>
+	<string name="units_imperial">Kaiserliches (VK)</string>
+	<string name="units_tgm10">TGM (basis 10)</string>
+	<string name="title_settings">Einstellungen</string>
+	<string name="zero">null</string>
+	<string name="six">sechs</string>
+	<string name="eight">acht</string>
+	<string name="nine">neun</string>
+	<string name="ten">zehn</string>
+	<string name="elv">elf</string>
+	<string name="zen">zend</string>
+	<string name="duna">duna</string>
+	<string name="quedra">quedra</string>
+	<string name="trin">trin</string>
+	<string name="quen">quen</string>
+	<string name="hes">hes</string>
+	<string name="sev">sev</string>
+	<string name="ak">ak</string>
+	<string name="neen">neen</string>
+	<string name="dex">dechs</string>
+	<string name="lef">lef</string>
+	<string name="more">Mehr</string>
+	<string name="error_429">Ratenlimit überschritten. Versuch später</string>
+	<string name="error_offline">Du bist offline. Mit dem Internet verbind</string>
+	<string name="no_departures">Keine Abfahrten</string>
+	<string name="departure_headsign_content_description">zu %1$s</string>
+	<string name="show_departures">Abfahrten anzeigen</string>
+	<string name="rate_limit">Ratenlimit</string>
+	<string name="seatbelts_everyone">Legt die Gurte an!</string>
+	<string name="onboarding_question">Wie möchtest du beginnen?</string>
+	<string name="units_locale_based">Systembasiert</string>
+	<string name="units_title">Einheitensystem</string>
+	<string name="units_tgm12">TGM (basis 12)</string>
+	<string name="one">ein</string>
+	<string name="two">zwei</string>
+	<string name="three">drei</string>
+	<string name="four">vier</string>
+	<string name="five">fünf</string>
+	<string name="seven">sieben</string>
+	<string name="send">Senden</string>
+	<string name="discard">Verwerfen</string>
+	<string name="use_online_feed">Verwende Online-Feed</string>
+	<string name="current_timetable_validity">Aktueller Fahrplan gültig: %1$s bis %2$s</string>
+	<string name="information_may_be_outdated">Informationen könnten veraltet sein</string>
+	<string name="onboarding_simple_action">Orte wählen</string>
+	<string name="saving_cities_list">Speichere Städteliste</string>
+	<string name="filtered_stop_question">Willst du einen Favoriten mit den ausgewählten Linien gefiltert speichern?</string>
+	<string name="congestion_stop_and_go">Stop and Go</string>
+	<string name="error_400">Die Anwendung hat eine fehlerhafte Anfrage gestellt</string>
+	<string name="error_401">Es wird ein Token benötigt um diesen Server zu verwenden</string>
+	<string name="congestion_jams">Staus</string>
+	<string name="error_403">Das eingegebene Token ist nicht korrekt</string>
+	<string name="error_50x">Es gab einen Fehler auf dem Server. Versuche es später erneut</string>
+	<string name="error_unknown">Unbekannter Fehler ist aufgetreten</string>
+	<string name="error_connecting">Fehler beim Verbinden zum Server. Versuche es später erneut</string>
+	<string name="error_gps">Kann die Position nicht beziehen</string>
+	<string name="waiting_position">warte auf Position</string>
+	<string name="congestion_smooth">reibungslos</string>
+	<string name="off_boarding">Nur Ausstieg</string>
+	<string name="boarding">Ein- und Ausstieg</string>
+	<string name="line_headsign_content_description">nach %1$s</string>
+	<string name="realtime_content_description">Abfahrt ist in Echtzeit</string>
+	<string name="on_demand">auf Haltewunsch</string>
+	<string name="no_boarding">Kein Ein- und Ausstieg</string>
+	<string name="on_boarding">Nur Einstieg</string>
+	<string name="wheelchair_content_description">Fahrzeug ist Rollstuhlgerecht</string>
+	<string name="tickets_sold_content_description">Tickets werden an Bord verkauft</string>
+	<string name="server_rate_limited_question">Dieser Server ist ratenbeschränkt und es wurde kein Token angegeben. Möchten Sie fortfahren?</string>
+	<string name="server_private_question">Dieser Server ist privat und kein Token wurde angegeben</string>
+	<string name="error_url">Fehlerhafte URL angegeben</string>
+	<string name="error_traffic_spec">Kann Server nicht überprüfen</string>
+	<string name="choose_server">Server-Variante wählen</string>
+	<string name="no_location_access">Standortzugriff nicht erlaubt</string>
+	<string name="no_location_message">Standortzugriff ist notwendig um Stationen in der Nähe zu finden und die aktuelle Position auf der Karte anzuzeigen. Die anderen Funktionen funktionieren auch ohne ihn. Er kann später in den Systemeinstellungen aktiviert und deaktiviert werden.</string>
+	<string name="stop_from_qr_code">QR-Code Halt</string>
+	<string name="clear_date_selection">Löschen</string>
+	<string name="title_filter">Filtern</string>
+	<string name="title_filter_byline">Filtern nach Linie</string>
+	<string name="title_filter_bytime">Filtern nach Zeit</string>
+	<string name="title_select_time_end">End-Zeit auswählen</string>
+	<string name="favourite_content_description">Als Favorit speichern</string>
+	<string name="favourite">Favorit</string>
+	<string name="filtered">Gefiltert</string>
+	<string name="cannot_save_favourite">Konnte Favorit nicht speichern</string>
+	<string name="favourite_deleted">Favorit gelöscht</string>
+	<string name="undo">Rückgängig</string>
+	<string name="cities_channel_name">Städteupdate-Kanal</string>
+	<string name="finished_updating_geocoding_data">Aktualisierung der Geocoding-Daten abgeschlossen</string>
+	<string name="line_decorations">Linienname-Dekoration</string>
+	<string name="acra_notification_channel">Absturzmeldungskanal</string>
+	<string name="acra_notification_title">Bimba ist abgestürzt</string>
+	<string name="send_with_comment">Mit Kommentar senden</string>
+	<string name="acra_notification_comment">Kommentar zu Absturzmeldung hinzugefügt</string>
+	<string name="filtered_departures">Abfahrten gefiltert</string>
+	<string name="grey_out">ausgrauen</string>
+	<string name="show">anzeigen</string>
+	<string name="terminus_arrival_showing">Ankünfte an Endstation</string>
+	<string name="email_button_description">Link zur E-Mail-Adresse</string>
+	<string name="local_time">Lokale Zeit</string>
+	<string name="departure_arrived">angekommen</string>
+	<string name="arrival">Ankunft</string>
+	<string name="departure_approximate">ungefähre Abfahrt</string>
+	<string name="arrival_approximate">ungefähre Ankunft</string>
+	<string name="approximately">ungefähr</string>
+	<string name="schedule_content_description">Abfahrtszeit ist aus Fahrplan</string>
+	<string name="onboarding_advanced">Fortgeschritten</string>
+	<string name="vehicle_headsign_content_description">%1$s nach %2$s</string>
+	<string name="stop_stub_on_demand">Halt auf Wunsch</string>
+	<string name="stop_stub_on_demand_in_zone">Halt auf Wunsch in Zone %1$s</string>
+	<string name="title_select_date">Wähle Tag der Abfahrt</string>
+	<string name="stop_stub_in_zone">Halt in Zone %1$s</string>
+	<string name="credits">Schriftart yellowcircle8 (https://git.apiote.xyz/yellowcircle8.git) basierend auf Railway Sans © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n Mastodon Icon (https://github.com/mastodon/joinmastodon) © Mastodon Beitragende, AGPL-3.0-or-later\n\n Bimba Logo erstellt von https://github.com/tebriz159\n\n Material icons © Google, Apache-2.0\n\n Map data © OpenStreetMap Beitragende (https://www.openstreetmap.org/copyright), ODbL-1.0\n\n Städteliste zum Geocoding von Plus-Codes © Geonames (https://geonames.org), CC BY\n\n Matrix Logo ™/® Matrix.org</string>
+	<string name="error_41">Dieser Ort wird nicht vom Server unterstützt</string>
+	<string name="title_select_line">Linie auswählen</string>
+	<string name="title_select_time_start">Startzeit auswählen</string>
+	<string name="alert_header">Status-Updates</string>
+	<string name="map_attribution"><![CDATA[© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> Mitwirkende]]></string>
+	<string name="unfiltered">Ungefiltert</string>
+	<string name="no_geocoding_data_description">Die Abfrage enthält einen kurzen Plus-Code, aber es sind keine Geokodierungsdaten vorhanden. Laden Sie Geokodierungsdaten herunter oder aktivieren Sie die automatische Aktualisierung in den Einstellungen.</string>
+	<string name="no_geocoding_data">Keine Geocoding-Informationen</string>
+	<string name="error_geocoding">Stadt nicht gefunden</string>
+	<string name="cities_channel_description">Benachrichtigung die den Fortschritt der Aktualisierung der lokalen Geocoding-Daten anzeigt</string>
+	<string name="updating_geocoding_data">Aktualisiere Geocoding-Daten</string>
+	<string name="updating_geocoding_data_failed">Aktualisierung der Geocoding-Daten fehlgeschlagen</string>
+	<string name="downloading_cities_list">Lade Städteliste herunter</string>
+	<string name="none">keine</string>
+	<string name="italics">kursiv</string>
+	<string name="colour">Farbe</string>
+	<string name="acra_notification_channel_description">Benachrichtigungen über Abstürze und die Möglichkeit, Absturzberichte zu senden</string>
+	<string name="acra_notification_text">Ein unerwartetes Hindernis ist auf dem Weg von Bimba aufgetaucht. Möchten Sie einen Bericht senden?</string>
+	<string name="alerts">Meldungen</string>
+	<string name="matrix_button_description">Link zum Matrix-Kanal</string>
+	<string name="hide">verstecken</string>
+	<string name="transitous_description">Ein von der Gemeinschaft betriebener, anbieterneutraler internationaler Routing-Dienst für den öffentlichen Verkehr. Die Abdeckung ist unter https://transitous.org/sources/ verfügbar</string>
+	<string name="transitous_attribution">Transitous (https://transitous.org) API bereitgestellt von Spline (https://routing.spline.de). Ortsabdeckung (https://github.com/public-transport/transitous/tree/main/feeds), wird von der Gemeinschaft gepflegt.</string>
+	<string name="departure">Abfahrt</string>
+	<string name="no_email_app">Keine E-Mail-App ist installiert</string>
+	<string name="about_time">ungefähr %1$02d:%2$02d</string>
+	<string name="error_406">App-Version ist nicht mit dem Server kompatibel</string>
 </resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml
index febf014d61a368f90e36f1774a2b1fbcf8f3baff..68ccb1a0918d8af2192cc15c04dec08e8931ab6d 100644
--- a/app/src/main/res/values-en-rGB/strings.xml
+++ b/app/src/main/res/values-en-rGB/strings.xml
@@ -285,10 +285,15 @@ 	A community-run provider-neutral international public transport routing service. Coverage is available at https://transitous.org/sources/
 	<string name="transitous_attribution">Transitous (https://transitous.org) API provided by Spline (https://routing.spline.de). Localities (https://github.com/public-transport/transitous/tree/main/feeds) maintained by the community.</string>
 	<string name="local_time">local time</string>
 	<string name="arrow">Arrow pointing to the stop</string>
-    <string name="departure_arrived">arrived</string>
+	<string name="departure_arrived">arrived</string>
 	<string name="arrival_approximate">approx. arr.</string>
 	<string name="arrival">arrival</string>
 	<string name="departure_approximate">approx. dep.</string>
 	<string name="departure">departure</string>
 	<string name="approximately">approximately</string>
+	<string name="depart_after">Depart after</string>
+	<string name="title_select_date_journey">Select date of the journey</string>
+	<string name="title_select_time_journey">Select journey time</string>
+	<string name="other_options">Other options</string>
+	<string name="journey_stops_headsign">%1$s (» %2$s)</string>
 </resources>




diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml
index 53b5db71611451c372af76e76bda67502c14d749..d4bc4fbef1a1e5295bf9e0618e391ab104cdd960 100644
--- a/app/src/main/res/values-en-rUS/strings.xml
+++ b/app/src/main/res/values-en-rUS/strings.xml
@@ -283,10 +283,15 @@ 	A community-run provider-neutral international public transport routing service. Coverage is available at https://transitous.org/sources/
 	<string name="transitous_attribution">Transitous (https://transitous.org) API provided by Spline (https://routing.spline.de). Localities (https://github.com/public-transport/transitous/tree/main/feeds) maintained by the community.</string>
 	<string name="local_time">local time</string>
 	<string name="arrow">Arrow pointing to the stop</string>
-    <string name="departure_arrived">arrived</string>
+	<string name="departure_arrived">arrived</string>
 	<string name="arrival_approximate">approx. arr.</string>
 	<string name="arrival">arrival</string>
 	<string name="departure_approximate">approx. dep.</string>
 	<string name="departure">departure</string>
 	<string name="approximately">approximately</string>
+	<string name="depart_after">Depart after</string>
+	<string name="title_select_date_journey">Select date of the journey</string>
+	<string name="title_select_time_journey">Select journey time</string>
+	<string name="other_options">Other options</string>
+	<string name="journey_stops_headsign">%1$s (» %2$s)</string>
 </resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 0480a5fed0a434e65ffaebf0d90a926db77025fe..3d8cc0b9823b0e2791b5ba3dee0d8cfc1ec6e1c5 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -1,278 +1,289 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Adam Evyčędo and contributors using Weblate
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
 <resources>
-    <string name="error_403">Sinu sisestatud ligipääsutunnus pole õige</string>
-    <string name="error_404">Otsitavat ei leidu</string>
-    <string name="error_50x">Serveris tekkis viga. Palun proovi hiljem uuesti</string>
-    <string name="error_unknown">Tekkis tundmatu viga</string>
-    <string name="error_connecting">Ühenduse loomisel serveriga tekkis viga. Palun proovi hiljem uuesti</string>
-    <string name="no_departures">Väljumisi pole</string>
-    <string name="error_gps">Praegust asukohta ei õnnestu tuvastada</string>
-    <string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
-    <plurals name="distance_in_m_cd">
-        <item quantity="one">%1$d meeter</item>
-        <item quantity="other">%1$d meetrit</item>
-    </plurals>
-    <string name="distance_in_two_units_cd">%1$s ja %2$s</string>
-    <plurals name="distance_in_yd_cd">
-        <item quantity="one">%1$d jard</item>
-        <item quantity="other">%1$d jardi</item>
-    </plurals>
-    <plurals name="distance_in_ft_cd">
-        <item quantity="one">%1$d jalg</item>
-        <item quantity="other">%1$d jalga</item>
-    </plurals>
-    <string name="distance_in_ft">%1$s jlg</string>
-    <plurals name="time_in_s_cd">
-        <item quantity="one">%1$d sekund</item>
-        <item quantity="other">%1$d sekundit</item>
-    </plurals>
-    <plurals name="time_in_2tm_12_cd">
-        <item quantity="one">%1$s dunatim</item>
-        <item quantity="other">%1$s dunatimmi</item>
-    </plurals>
-    <string name="speed_in_m_per_s">%1$s m/s</string>
-    <string name="time_in_tm">%1$s %2$sTm</string>
-    <string name="speed_in_km_per_h">%1$s km/h</string>
-    <plurals name="speed_in_vl_cd">
-        <item quantity="one">%1$d vlos</item>
-        <item quantity="other">%1$d vlos</item>
-    </plurals>
-    <string name="speed_in_mi_per_h">%1$s mt</string>
-    <string name="speed_in_vl">%1$s Vl</string>
-    <plurals name="speed_in_m_per_s_cd">
-        <item quantity="one">%1$d meeter sekundis</item>
-        <item quantity="other">%1$d meetrit sekundis</item>
-    </plurals>
-    <plurals name="speed_in_km_per_h_cd">
-        <item quantity="one">%1$d kilomeeter tunnis</item>
-        <item quantity="other">%1$d kilomeetrit tunnis</item>
-    </plurals>
-    <plurals name="speed_in_mi_per_h_cd">
-        <item quantity="one">%1$d miili tunnis</item>
-        <item quantity="other">%1$d miili tunnis</item>
-    </plurals>
-    <plurals name="speed_in_vl_12_cd">
-        <item quantity="one">%1$s vlos</item>
-        <item quantity="other">%1$s vlos</item>
-    </plurals>
-    <string name="congestion_stop_and_go">liigub ja peatub</string>
-    <string name="no_email_app">Nutiseadmes ei leidu ühtegi e-postirakendust</string>
-    <string name="occupancy_standing_only">vaid seisukohad</string>
-    <string name="congestion_jams">suur ummik</string>
-    <string name="occupancy_many_seats">palju vabu kohti</string>
-    <string name="occupancy_full">täiesti täis</string>
-    <string name="occupancy_few_seats">mõned vabad kohad</string>
-    <string name="about_time">umbes %1$02d:%2$02d</string>
-    <string name="departure_momentarily">just nüüd</string>
-    <string name="off_boarding">mahatulek</string>
-    <string name="line_headsign">» %1$s</string>
-    <string name="line_headsigns">%1$s «» %2$s</string>
-    <string name="results_for">Otsingutulemused: „%1$s“</string>
-    <string name="bimba_server_address_hint">Server</string>
-    <string name="server_rate_limited_question">See server kasutab päringumahu piiranguid ning ligipääsutunnus on sisestamata. Kas sa soovid jätkata?</string>
+	<string name="error_403">Sinu sisestatud ligipääsutunnus pole õige</string>
+	<string name="error_404">Otsitavat ei leidu</string>
+	<string name="error_50x">Serveris tekkis viga. Palun proovi hiljem uuesti</string>
+	<string name="error_unknown">Tekkis tundmatu viga</string>
+	<string name="error_connecting">Ühenduse loomisel serveriga tekkis viga. Palun proovi hiljem uuesti</string>
+	<string name="no_departures">Väljumisi pole</string>
+	<string name="error_gps">Praegust asukohta ei õnnestu tuvastada</string>
+	<string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
+	<plurals name="distance_in_m_cd">
+		<item quantity="one">%1$d meeter</item>
+		<item quantity="other">%1$d meetrit</item>
+	</plurals>
+	<string name="distance_in_two_units_cd">%1$s ja %2$s</string>
+	<plurals name="distance_in_yd_cd">
+		<item quantity="one">%1$d jard</item>
+		<item quantity="other">%1$d jardi</item>
+	</plurals>
+	<plurals name="distance_in_ft_cd">
+		<item quantity="one">%1$d jalg</item>
+		<item quantity="other">%1$d jalga</item>
+	</plurals>
+	<string name="distance_in_ft">%1$s jlg</string>
+	<plurals name="time_in_s_cd">
+		<item quantity="one">%1$d sekund</item>
+		<item quantity="other">%1$d sekundit</item>
+	</plurals>
+	<plurals name="time_in_2tm_12_cd">
+		<item quantity="one">%1$s dunatim</item>
+		<item quantity="other">%1$s dunatimmi</item>
+	</plurals>
+	<string name="speed_in_m_per_s">%1$s m/s</string>
+	<string name="time_in_tm">%1$s %2$sTm</string>
+	<string name="speed_in_km_per_h">%1$s km/h</string>
+	<plurals name="speed_in_vl_cd">
+		<item quantity="one">%1$d vlos</item>
+		<item quantity="other">%1$d vlos</item>
+	</plurals>
+	<string name="speed_in_mi_per_h">%1$s mt</string>
+	<string name="speed_in_vl">%1$s Vl</string>
+	<plurals name="speed_in_m_per_s_cd">
+		<item quantity="one">%1$d meeter sekundis</item>
+		<item quantity="other">%1$d meetrit sekundis</item>
+	</plurals>
+	<plurals name="speed_in_km_per_h_cd">
+		<item quantity="one">%1$d kilomeeter tunnis</item>
+		<item quantity="other">%1$d kilomeetrit tunnis</item>
+	</plurals>
+	<plurals name="speed_in_mi_per_h_cd">
+		<item quantity="one">%1$d miili tunnis</item>
+		<item quantity="other">%1$d miili tunnis</item>
+	</plurals>
+	<plurals name="speed_in_vl_12_cd">
+		<item quantity="one">%1$s vlos</item>
+		<item quantity="other">%1$s vlos</item>
+	</plurals>
+	<string name="congestion_stop_and_go">liigub ja peatub</string>
+	<string name="no_email_app">Nutiseadmes ei leidu ühtegi e-postirakendust</string>
+	<string name="occupancy_standing_only">vaid seisukohad</string>
+	<string name="congestion_jams">suur ummik</string>
+	<string name="occupancy_many_seats">palju vabu kohti</string>
+	<string name="occupancy_full">täiesti täis</string>
+	<string name="occupancy_few_seats">mõned vabad kohad</string>
+	<string name="about_time">umbes %1$02d:%2$02d</string>
+	<string name="departure_momentarily">just nüüd</string>
+	<string name="off_boarding">mahatulek</string>
+	<string name="line_headsign">» %1$s</string>
+	<string name="line_headsigns">%1$s «» %2$s</string>
+	<string name="results_for">Otsingutulemused: „%1$s“</string>
+	<string name="bimba_server_address_hint">Server</string>
+	<string name="server_rate_limited_question">See server kasutab päringumahu piiranguid ning ligipääsutunnus on sisestamata. Kas sa soovid jätkata?</string>
 	<string name="server_private_question">See on privaatne server ning ligipääsutunnus on sisestamata</string>
-    <string name="realtime_content_description">väljumine on reaalajas</string>
-    <string name="voice_announcements_content_description">kasutusel on häälteated</string>
-    <string name="tickets_sold_content_description">transpordivahendis müüakse sõidupileteid</string>
-    <string name="usb_charging_content_description">USB-põhised laadimispordid on olemas</string>
-    <string name="open_in_maps_app">Ava kaardirakenduses</string>
-    <string name="onboarding_advanced">Keerukamalt</string>
-    <string name="seatbelts_everyone">Palun kinnitage turvavööd!</string>
-    <string name="onboarding_simple">Lihtsalt</string>
-    <string name="error">Viga</string>
-    <string name="cancel">Katkesta</string>
-    <string name="rate_limit">Päringute piir</string>
-    <string name="title_servers">Serverid</string>
-    <string name="title_cities">Piirkonnad</string>
-    <string name="app_name">Bimba</string>
-    <string name="title_home">Avaleht</string>
-    <string name="title_map">Kaart</string>
-    <string name="title_journey">Reis</string>
-    <string name="home_fab_description">GPSi ikoon</string>
-    <string name="search_placeholder">peatus, liin või OLC kood</string>
-    <string name="save">Salvesta</string>
-    <string name="error_401">Selle serveri kasutamiseks on vajalik ligipääsutunnus</string>
-    <string name="error_429">Päringud on liiga sagedased. Palun proovi hiljem uuesti</string>
-    <string name="error_offline">Sa poel võrgus. Palun loo nutiseadmes võrguühendus</string>
-    <string name="waiting_position">Ootame asukoha tuvastamist</string>
-    <string name="distance_in_m">%1$s m</string>
-    <string name="distance_in_km">%1$s km</string>
-    <plurals name="distance_in_km_cd">
-        <item quantity="one">%1$d kilomeeter</item>
-        <item quantity="other">%1$d kilomeetrit</item>
-    </plurals>
-    <string name="distance_in_yd">%1$s jd</string>
-    <string name="distance_in_mi">%1$s mi</string>
-    <plurals name="distance_in_mi_cd">
-        <item quantity="one">%1$d miil</item>
-        <item quantity="other">%1$d miili</item>
-    </plurals>
-    <string name="distance_in_gf">%1$s %2$sGf</string>
-    <plurals name="distance_in_gf_cd">
-        <item quantity="one">%1$d grafut</item>
-        <item quantity="other">%1$d grafutit</item>
-    </plurals>
-    <plurals name="distance_in_3gf_12_cd">
-        <item quantity="one">%1$s trinagrafut</item>
-        <item quantity="other">%1$s trinagrafutit</item>
-    </plurals>
-    <plurals name="distance_in_gf_12_cd">
-        <item quantity="one">%1$s grafut</item>
-        <item quantity="other">%1$s grafutit</item>
-    </plurals>
-    <string name="time_in_s">%1$s sek</string>
-    <string name="time_in_tm_past">%1$s %2$sTm tagasi</string>
-    <plurals name="time_in_tm_cd">
-        <item quantity="one">%1$d tim</item>
-        <item quantity="other">%1$d timmi</item>
-    </plurals>
-    <plurals name="time_in_4tm_12_cd">
-        <item quantity="one">%1$s kvadratim</item>
-        <item quantity="other">%1$s kvadratimmi</item>
-    </plurals>
-    <string name="congestion_unknown">teadmata</string>
-    <string name="congestion_smooth">sujuv</string>
-    <string name="congestion_congestion">väike ummik</string>
-    <string name="occupancy_unknown">teadmata</string>
-    <string name="occupancy_empty">tühi</string>
-    <string name="occupancy_crowded">peaaegu täis</string>
-    <string name="occupancy_wont_let">uusi reisijaid ei peale võeta</string>
-    <string name="no_map_app">Nutiseadmes ei leidu ühtegi kaardirakendust</string>
-    <string name="departure_headsign_content_description">%1$s suunas</string>
-    <string name="departure_departed">väljunud</string>
-    <string name="departure_now">nüüd</string>
-    <string name="at_time">kell %1$02d:%2$02d</string>
-    <string name="at_time_realtime">kell %1$02d:%2$02d:%3$02d</string>
-    <string name="on_demand">nõudepeatus</string>
-    <string name="no_boarding">pealeminekut pole</string>
-    <string name="on_boarding">pealeminek</string>
-    <string name="boarding">võid peale minna</string>
-    <string name="line_headsign_content_description">suunaga %1$s</string>
-    <string name="line_headsigns_content_description">%1$s ja %2$s vahel</string>
-    <string name="stops_nearby">Peatub läheduses</string>
-    <string name="bimba_server_token_hint">Ligipääsutunnus</string>
-    <string name="wheelchair_content_description">sõidukisse pääseb ratastooliga</string>
-    <string name="air_condition_content_description">kliimaseade</string>
-    <string name="show_departures">Näita väljumisi</string>
-    <string name="stop_content_description">peatus</string>
-    <string name="onboarding_question">Kuidas sa soovid alustada?</string>
-    <string name="onboarding_simple_action">vali piirkonnad</string>
-    <string name="onboarding_advanced_action">vali server</string>
-    <string name="last_update">Viimane uuendus: %1$s</string>
-    <string name="title_feeds">Sõiduplaanid</string>
-    <string name="error_url">Sisestatud võrguaadress on vigane</string>
-    <string name="error_traffic_spec">Serveri verifitseerimine ei õnnestu</string>
-    <string name="stops_near_code">Peatub %1$s lähedal</string>
-    <string name="stop_stub_on_demand_in_zone">Nõudepeatus tsoonis %1$s</string>
-    <string name="stop_stub_on_demand">Nõudepeatus</string>
-    <string name="stop_stub_in_zone">Peatus tsoonis %1$s</string>
-    <string name="vehicle_headsign_content_description">%1$s suunaga %2$s</string>
-    <string name="departure_headsign">» %1$s</string>
-    <string name="title_activity_results">Tulemused</string>
-    <string name="continue_">Jätka</string>
-    <string name="error_400">Rakendus tegi vigase päringu</string>
-    <string name="bicycles_allowed_content_description">jalgrattaid võib kaasa võtta</string>
-    <string name="choose_server">Vali serveri variant</string>
-    <string name="ok">Sobib</string>
-    <string name="no_location_access">Puudub ligipääs asukohale</string>
-    <string name="no_location_message">Õigus tuvastada asukohta on vajalik lähimate peatuste leidmiseks ja praeguse asukoha näitamiseks kaardil. Kõik muud funktsionaalsused toimivad ka ilma asukohta teadmata. Sa võid süsteemi seadistustest alati asukoha kasutamise õiguse sisse või välja lülitada - just nii nagu sulle oluline on.</string>
-    <string name="app_description">Avatud lähtekoodil põhinev kaaslane reisijatele - sõiduplaan sinu taskus.</string>
-    <string name="code_button_description">lähtekoodi link</string>
-    <string name="use_online_feed">Kasuta veebipõhist andmevoogu</string>
-    <string name="current_timetable_validity">Praeguse sõiduplaani kehtivus: %1$s kuni %2$s</string>
-    <string name="filter_localities">filtreeri piirkondi</string>
-    <string name="title_select_line">Vali liin</string>
-    <string name="more">Veel</string>
-    <string name="units_locale_based">Lokaadikohased</string>
-    <string name="units_imperial">Inglise süsteemi mõõtühikud (UK)</string>
-    <string name="units_tgm12">TGM (kaheteistkümnendsüsteemis)</string>
-    <string name="units_tgm10">TGM (kümnendsüsteemis)</string>
-    <string name="error_geocoding">Linna ei leidu</string>
-    <string name="cities_channel_name">Linnade uuendamise kanal</string>
-    <string name="cities_channel_description">Teavitus, mis näitab geokodeerimiseks vajalike andmete uuenduse edenemist</string>
-    <string name="updating_geocoding_data">Uuendame geokodeerimise andmeid</string>
-    <string name="zero">null</string>
-    <string name="one">üks</string>
-    <string name="two">kaks</string>
-    <string name="three">kolm</string>
-    <string name="four">neli</string>
-    <string name="five">viis</string>
-    <string name="send">Saada</string>
-    <string name="discard">Loobu</string>
-    <string name="send_with_comment">Saada kommentaariga</string>
-    <string name="local_time">kohalik aeg</string>
-    <string name="title_about">Rakenduse teave</string>
-    <string name="translation_button_description">rakenduse tõlkimise liidese link</string>
-    <string name="information_may_be_outdated">Informatsioon võib olla aegunud</string>
-    <string name="mastodon_button_description">Mastodoni link</string>
-    <string name="website_button_description">veebisaidi link</string>
-    <string name="error_406">Rakenduse versioon ei ühildu serveriga</string>
-    <string name="error_41">See piirkond pole serveri poolt toetatud</string>
-    <string name="title_select_date">Vali väljumise kuupäev</string>
-    <string name="clear_date_selection">Tühjenda</string>
-    <string name="title_filter">Filtreeri</string>
-    <string name="filtered">Filtreeritud</string>
-    <string name="title_filter_byline">Filtreeri liini alusel</string>
-    <string name="title_filter_bytime">Filtreeri aja alusel</string>
-    <string name="favourite">Lemmik</string>
-    <string name="title_select_time_start">Vali algusaeg</string>
-    <string name="title_select_time_end">Vali lõpuaeg</string>
-    <string name="alert_header">Olekute uuendused</string>
-    <string name="map_attribution"><![CDATA[© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>i kaasautorid]]></string>
-    <string name="favourite_content_description">Salvesta lemmikuna</string>
-    <string name="unfiltered">Filtreerimata</string>
-    <string name="cannot_save_favourite">Lemmiku salvestamine ei õnnestunud</string>
-    <string name="units_title">Mõõtühikud</string>
-    <string name="units_metric">Meetermõõdustik (SI)</string>
-    <string name="error_44">Rohkem väljumisi pole</string>
-    <string name="loading">laadime…</string>
-    <string name="favourite_deleted">Lemmik on kustutatud</string>
-    <string name="undo">Võta tegevus tagasi</string>
-    <string name="units_customary">USA kohandatud mõõtühikud</string>
-    <string name="title_settings">Seadistused</string>
-    <string name="no_geocoding_data">Geokodeerimise andmed puuduvad</string>
-    <string name="saving_cities_list">salvestame linnade loendit</string>
-    <string name="downloading_cities_list">laadime alla linnade loendit</string>
-    <string name="finished_updating_geocoding_data">Geokodeerimise andmete uuendamine on lõppenud</string>
-    <string name="updating_geocoding_data_failed">Geokodeerimise andmete uuendamine ei õnnestunud</string>
-    <string name="six">kuus</string>
-    <string name="seven">seitse</string>
-    <string name="nine">üheksa</string>
-    <string name="ten">kümme</string>
-    <string name="eight">kaheksa</string>
-    <string name="email_button_description">e-posti link</string>
-    <string name="alerts">Hoiatused</string>
-    <string name="hide">peida</string>
-    <string name="line_decorations">Liini nime kujundus</string>
-    <string name="show">näita</string>
-    <string name="matrix_button_description">Matrixi kanali link</string>
-    <string name="transitous_attribution">Transitouse (https://transitous.org) APIt vahendab Spline (https://routing.spline.de). Piirkondade (https://github.com/public-transport/transitous/tree/main/feeds) andmekogu haldab kogukond.</string>
-    <string name="credits">Yellowcircle8 kirjatüüp (https://git.apiote.xyz/yellowcircle8.git) põhineb Railway Sansil © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n Mastodoni ikoon (https://github.com/mastodon/joinmastodon) © Mastodoni kaasautorid, AGPL-3.0-or-later\n\n Bimba logo autor on https://github.com/tebriz159\n\n Material kujunduse ikoonid © Google, Apache-2.0\n\n Kaardiandmed © OpenStreetMapi kaasautorid (https://www.openstreetmap.org/copyright), ODbL-1.0\n\n OLC-koodide geokodeerimiseks vajalik linnade loend © Geonames (https://geonames.org), CC BY\n\n Matrixi logo ™/® Matrix.org</string>
-    <string name="trin">trin</string>
-    <string name="hes">hes</string>
-    <string name="quen">quen</string>
-    <string name="neen">neen</string>
-    <string name="ak">ak</string>
-    <string name="transitous_description">Kogukonna hallatav ja teenusepakkujatest sõltumatu rahvusvaheline ühistranspordi teekonnamootor. Teeninduspiirkonnad on kirjas lehel https://transitous.org/sources/</string>
-    <string name="stop_from_qr_code">Peatuse QR-kood</string>
-    <string name="no_geocoding_data_description">Päringus on OLC-kood ehk pluss-kood, aga geokodeerimiseks vajalik andmekogu puudub. Palun laadi vajalik andmekogu alla või luba seadistustest automaatsed uuendused.</string>
-    <string name="elv">elv</string>
-    <string name="zen">zen</string>
-    <string name="duna">duna</string>
-    <string name="quedra">quedra</string>
-    <string name="filtered_stop_question">Kas sa soovid valitud liinide kombinatsiooni salvestada lemmikuna?</string>
-    <string name="sev">sev</string>
-    <string name="dex">dex</string>
-    <string name="lef">lef</string>
-    <string name="none">puudub</string>
-    <string name="italics">kaldkiri</string>
-    <string name="colour">värv</string>
-    <string name="acra_notification_channel">Rakenduse kokkujooksmiste teavituskanal</string>
-    <string name="acra_notification_channel_description">Teavitused rakenduse kokkujooksmiste kohta, sealhulgas vastava aruande saatmise võimalus</string>
-    <string name="acra_notification_title">Bimba on kokku jooksnud</string>
-    <string name="acra_notification_text">Bimba teekonnale on ette jäänud ootamatu takistus ja rakendus on lõpetanud töö. Kas sa soovid selle kohta veateate saata?</string>
-    <string name="acra_notification_comment">Kommentaar on lisatud veateatele</string>
-    <string name="filtered_departures">Filtreeritud väljumised</string>
-    <string name="grey_out">märgitud halliks</string>
-    <string name="terminus_arrival_showing">Saabumised lõpp-punkti</string>
+	<string name="realtime_content_description">väljumine on reaalajas</string>
+	<string name="voice_announcements_content_description">kasutusel on häälteated</string>
+	<string name="tickets_sold_content_description">transpordivahendis müüakse sõidupileteid</string>
+	<string name="usb_charging_content_description">USB-põhised laadimispordid on olemas</string>
+	<string name="open_in_maps_app">Ava kaardirakenduses</string>
+	<string name="onboarding_advanced">Keerukamalt</string>
+	<string name="seatbelts_everyone">Palun kinnitage turvavööd!</string>
+	<string name="onboarding_simple">Lihtsalt</string>
+	<string name="error">Viga</string>
+	<string name="cancel">Katkesta</string>
+	<string name="rate_limit">Päringute piir</string>
+	<string name="title_servers">Serverid</string>
+	<string name="title_cities">Piirkonnad</string>
+	<string name="app_name">Bimba</string>
+	<string name="title_home">Avaleht</string>
+	<string name="title_map">Kaart</string>
+	<string name="title_journey">Reis</string>
+	<string name="home_fab_description">GPSi ikoon</string>
+	<string name="search_placeholder">peatus, liin või OLC kood</string>
+	<string name="save">Salvesta</string>
+	<string name="error_401">Selle serveri kasutamiseks on vajalik ligipääsutunnus</string>
+	<string name="error_429">Päringud on liiga sagedased. Palun proovi hiljem uuesti</string>
+	<string name="error_offline">Sa poel võrgus. Palun loo nutiseadmes võrguühendus</string>
+	<string name="waiting_position">Ootame asukoha tuvastamist</string>
+	<string name="distance_in_m">%1$s m</string>
+	<string name="distance_in_km">%1$s km</string>
+	<plurals name="distance_in_km_cd">
+		<item quantity="one">%1$d kilomeeter</item>
+		<item quantity="other">%1$d kilomeetrit</item>
+	</plurals>
+	<string name="distance_in_yd">%1$s jd</string>
+	<string name="distance_in_mi">%1$s mi</string>
+	<plurals name="distance_in_mi_cd">
+		<item quantity="one">%1$d miil</item>
+		<item quantity="other">%1$d miili</item>
+	</plurals>
+	<string name="distance_in_gf">%1$s %2$sGf</string>
+	<plurals name="distance_in_gf_cd">
+		<item quantity="one">%1$d grafut</item>
+		<item quantity="other">%1$d grafutit</item>
+	</plurals>
+	<plurals name="distance_in_3gf_12_cd">
+		<item quantity="one">%1$s trinagrafut</item>
+		<item quantity="other">%1$s trinagrafutit</item>
+	</plurals>
+	<plurals name="distance_in_gf_12_cd">
+		<item quantity="one">%1$s grafut</item>
+		<item quantity="other">%1$s grafutit</item>
+	</plurals>
+	<string name="time_in_s">%1$s sek</string>
+	<string name="time_in_tm_past">%1$s %2$sTm tagasi</string>
+	<plurals name="time_in_tm_cd">
+		<item quantity="one">%1$d tim</item>
+		<item quantity="other">%1$d timmi</item>
+	</plurals>
+	<plurals name="time_in_4tm_12_cd">
+		<item quantity="one">%1$s kvadratim</item>
+		<item quantity="other">%1$s kvadratimmi</item>
+	</plurals>
+	<string name="congestion_unknown">teadmata</string>
+	<string name="congestion_smooth">sujuv</string>
+	<string name="congestion_congestion">väike ummik</string>
+	<string name="occupancy_unknown">teadmata</string>
+	<string name="occupancy_empty">tühi</string>
+	<string name="occupancy_crowded">peaaegu täis</string>
+	<string name="occupancy_wont_let">uusi reisijaid ei peale võeta</string>
+	<string name="no_map_app">Nutiseadmes ei leidu ühtegi kaardirakendust</string>
+	<string name="departure_headsign_content_description">%1$s suunas</string>
+	<string name="departure_departed">väljunud</string>
+	<string name="departure_now">nüüd</string>
+	<string name="at_time">kell %1$02d:%2$02d</string>
+	<string name="at_time_realtime">kell %1$02d:%2$02d:%3$02d</string>
+	<string name="on_demand">nõudepeatus</string>
+	<string name="no_boarding">pealeminekut pole</string>
+	<string name="on_boarding">pealeminek</string>
+	<string name="boarding">võid peale minna</string>
+	<string name="line_headsign_content_description">suunaga %1$s</string>
+	<string name="line_headsigns_content_description">%1$s ja %2$s vahel</string>
+	<string name="stops_nearby">Peatub läheduses</string>
+	<string name="bimba_server_token_hint">Ligipääsutunnus</string>
+	<string name="wheelchair_content_description">sõidukisse pääseb ratastooliga</string>
+	<string name="air_condition_content_description">kliimaseade</string>
+	<string name="show_departures">Näita väljumisi</string>
+	<string name="stop_content_description">peatus</string>
+	<string name="onboarding_question">Kuidas sa soovid alustada?</string>
+	<string name="onboarding_simple_action">vali piirkonnad</string>
+	<string name="onboarding_advanced_action">vali server</string>
+	<string name="last_update">Viimane uuendus: %1$s</string>
+	<string name="title_feeds">Sõiduplaanid</string>
+	<string name="error_url">Sisestatud võrguaadress on vigane</string>
+	<string name="error_traffic_spec">Serveri verifitseerimine ei õnnestu</string>
+	<string name="stops_near_code">Peatub %1$s lähedal</string>
+	<string name="stop_stub_on_demand_in_zone">Nõudepeatus tsoonis %1$s</string>
+	<string name="stop_stub_on_demand">Nõudepeatus</string>
+	<string name="stop_stub_in_zone">Peatus tsoonis %1$s</string>
+	<string name="vehicle_headsign_content_description">%1$s suunaga %2$s</string>
+	<string name="departure_headsign">» %1$s</string>
+	<string name="title_activity_results">Tulemused</string>
+	<string name="continue_">Jätka</string>
+	<string name="error_400">Rakendus tegi vigase päringu</string>
+	<string name="bicycles_allowed_content_description">jalgrattaid võib kaasa võtta</string>
+	<string name="choose_server">Vali serveri variant</string>
+	<string name="ok">Sobib</string>
+	<string name="no_location_access">Puudub ligipääs asukohale</string>
+	<string name="no_location_message">Õigus tuvastada asukohta on vajalik lähimate peatuste leidmiseks ja praeguse asukoha näitamiseks kaardil. Kõik muud funktsionaalsused toimivad ka ilma asukohta teadmata. Sa võid süsteemi seadistustest alati asukoha kasutamise õiguse sisse või välja lülitada - just nii nagu sulle oluline on.</string>
+	<string name="app_description">Avatud lähtekoodil põhinev kaaslane reisijatele - sõiduplaan sinu taskus.</string>
+	<string name="code_button_description">lähtekoodi link</string>
+	<string name="use_online_feed">Kasuta veebipõhist andmevoogu</string>
+	<string name="current_timetable_validity">Praeguse sõiduplaani kehtivus: %1$s kuni %2$s</string>
+	<string name="filter_localities">filtreeri piirkondi</string>
+	<string name="title_select_line">Vali liin</string>
+	<string name="more">Veel</string>
+	<string name="units_locale_based">Lokaadikohased</string>
+	<string name="units_imperial">Inglise süsteemi mõõtühikud (UK)</string>
+	<string name="units_tgm12">TGM (kaheteistkümnendsüsteemis)</string>
+	<string name="units_tgm10">TGM (kümnendsüsteemis)</string>
+	<string name="error_geocoding">Linna ei leidu</string>
+	<string name="cities_channel_name">Linnade uuendamise kanal</string>
+	<string name="cities_channel_description">Teavitus, mis näitab geokodeerimiseks vajalike andmete uuenduse edenemist</string>
+	<string name="updating_geocoding_data">Uuendame geokodeerimise andmeid</string>
+	<string name="zero">null</string>
+	<string name="one">üks</string>
+	<string name="two">kaks</string>
+	<string name="three">kolm</string>
+	<string name="four">neli</string>
+	<string name="five">viis</string>
+	<string name="send">Saada</string>
+	<string name="discard">Loobu</string>
+	<string name="send_with_comment">Saada kommentaariga</string>
+	<string name="local_time">kohalik aeg</string>
+	<string name="title_about">Rakenduse teave</string>
+	<string name="translation_button_description">rakenduse tõlkimise liidese link</string>
+	<string name="information_may_be_outdated">Informatsioon võib olla aegunud</string>
+	<string name="mastodon_button_description">Mastodoni link</string>
+	<string name="website_button_description">veebisaidi link</string>
+	<string name="error_406">Rakenduse versioon ei ühildu serveriga</string>
+	<string name="error_41">See piirkond pole serveri poolt toetatud</string>
+	<string name="title_select_date">Vali väljumise kuupäev</string>
+	<string name="clear_date_selection">Tühjenda</string>
+	<string name="title_filter">Filtreeri</string>
+	<string name="filtered">Filtreeritud</string>
+	<string name="title_filter_byline">Filtreeri liini alusel</string>
+	<string name="title_filter_bytime">Filtreeri aja alusel</string>
+	<string name="favourite">Lemmik</string>
+	<string name="title_select_time_start">Vali algusaeg</string>
+	<string name="title_select_time_end">Vali lõpuaeg</string>
+	<string name="alert_header">Olekute uuendused</string>
+	<string name="map_attribution"><![CDATA[© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>i kaasautorid]]></string>
+	<string name="favourite_content_description">Salvesta lemmikuna</string>
+	<string name="unfiltered">Filtreerimata</string>
+	<string name="cannot_save_favourite">Lemmiku salvestamine ei õnnestunud</string>
+	<string name="units_title">Mõõtühikud</string>
+	<string name="units_metric">Meetermõõdustik (SI)</string>
+	<string name="error_44">Rohkem väljumisi pole</string>
+	<string name="loading">laadime…</string>
+	<string name="favourite_deleted">Lemmik on kustutatud</string>
+	<string name="undo">Võta tegevus tagasi</string>
+	<string name="units_customary">USA kohandatud mõõtühikud</string>
+	<string name="title_settings">Seadistused</string>
+	<string name="no_geocoding_data">Geokodeerimise andmed puuduvad</string>
+	<string name="saving_cities_list">salvestame linnade loendit</string>
+	<string name="downloading_cities_list">laadime alla linnade loendit</string>
+	<string name="finished_updating_geocoding_data">Geokodeerimise andmete uuendamine on lõppenud</string>
+	<string name="updating_geocoding_data_failed">Geokodeerimise andmete uuendamine ei õnnestunud</string>
+	<string name="six">kuus</string>
+	<string name="seven">seitse</string>
+	<string name="nine">üheksa</string>
+	<string name="ten">kümme</string>
+	<string name="eight">kaheksa</string>
+	<string name="email_button_description">e-posti link</string>
+	<string name="alerts">Hoiatused</string>
+	<string name="hide">peida</string>
+	<string name="line_decorations">Liini nime kujundus</string>
+	<string name="show">näita</string>
+	<string name="matrix_button_description">Matrixi kanali link</string>
+	<string name="transitous_attribution">Transitouse (https://transitous.org) APIt vahendab Spline (https://routing.spline.de). Piirkondade (https://github.com/public-transport/transitous/tree/main/feeds) andmekogu haldab kogukond.</string>
+	<string name="credits">Yellowcircle8 kirjatüüp (https://git.apiote.xyz/yellowcircle8.git) põhineb Railway Sansil © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n Mastodoni ikoon (https://github.com/mastodon/joinmastodon) © Mastodoni kaasautorid, AGPL-3.0-or-later\n\n Bimba logo autor on https://github.com/tebriz159\n\n Material kujunduse ikoonid © Google, Apache-2.0\n\n Kaardiandmed © OpenStreetMapi kaasautorid (https://www.openstreetmap.org/copyright), ODbL-1.0\n\n OLC-koodide geokodeerimiseks vajalik linnade loend © Geonames (https://geonames.org), CC BY\n\n Matrixi logo ™/® Matrix.org</string>
+	<string name="trin">trin</string>
+	<string name="hes">hes</string>
+	<string name="quen">quen</string>
+	<string name="neen">neen</string>
+	<string name="ak">ak</string>
+	<string name="transitous_description">Kogukonna hallatav ja teenusepakkujatest sõltumatu rahvusvaheline ühistranspordi teekonnamootor. Teeninduspiirkonnad on kirjas lehel https://transitous.org/sources/</string>
+	<string name="stop_from_qr_code">Peatuse QR-kood</string>
+	<string name="no_geocoding_data_description">Päringus on OLC-kood ehk pluss-kood, aga geokodeerimiseks vajalik andmekogu puudub. Palun laadi vajalik andmekogu alla või luba seadistustest automaatsed uuendused.</string>
+	<string name="elv">elv</string>
+	<string name="zen">zen</string>
+	<string name="duna">duna</string>
+	<string name="quedra">quedra</string>
+	<string name="filtered_stop_question">Kas sa soovid valitud liinide kombinatsiooni salvestada lemmikuna?</string>
+	<string name="sev">sev</string>
+	<string name="dex">dex</string>
+	<string name="lef">lef</string>
+	<string name="none">puudub</string>
+	<string name="italics">kaldkiri</string>
+	<string name="colour">värv</string>
+	<string name="acra_notification_channel">Rakenduse kokkujooksmiste teavituskanal</string>
+	<string name="acra_notification_channel_description">Teavitused rakenduse kokkujooksmiste kohta, sealhulgas vastava aruande saatmise võimalus</string>
+	<string name="acra_notification_title">Bimba on kokku jooksnud</string>
+	<string name="acra_notification_text">Bimba teekonnale on ette jäänud ootamatu takistus ja rakendus on lõpetanud töö. Kas sa soovid selle kohta veateate saata?</string>
+	<string name="acra_notification_comment">Kommentaar on lisatud veateatele</string>
+	<string name="filtered_departures">Filtreeritud väljumised</string>
+	<string name="grey_out">märgitud halliks</string>
+	<string name="terminus_arrival_showing">Saabumised lõpp-punkti</string>
+	<string name="schedule_content_description">väljumine on sõiduplaani alusel</string>
+	<string name="departure_arrived">saabunud</string>
+	<string name="arrival">saabumine</string>
+	<string name="departure_approximate">umbk. väljum.</string>
+	<string name="arrival_approximate">umbk. saabum.</string>
+	<string name="departure">väljumine</string>
+	<string name="approximately">hinnanguliselt</string>
 </resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 604046478c874a3e78a2d33e137b169e1a3cbd7c..a4545ae29ca307e330a99ba00ef35bb4082f99ee 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -1,245 +1,251 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
 SPDX-FileCopyrightText: Adam Evyčędo and contributors using Weblate
 
 SPDX-License-Identifier: GPL-3.0-or-later
---><resources>
-    <string name="app_name">Bimba</string>
-    <string name="title_home">Accueil</string>
-    <string name="home_fab_description">Icône GPS</string>
-    <string name="save">Enregistrer</string>
-    <string name="continue_">Continuer</string>
-    <string name="search_placeholder">Arrêts, lignes, ou Plus Codes</string>
-    <string name="error_401">Un jeton est nécessaire pour utiliser ce serveur</string>
-    <string name="error_403">Le jeton fourni est incorrect</string>
-    <string name="error_50x">Il y a eu une erreur sur le serveur. Réessayez plus tard</string>
-    <string name="error_connecting">Erreur lors de la connection au serveur. Réessayez plus tard</string>
-    <string name="error_unknown">Erreur inconnue</string>
-    <string name="waiting_position">En attente de la position</string>
-    <string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
-    <string name="congestion_unknown">Inconnu</string>
-    <string name="congestion_smooth">Fluide</string>
-    <string name="occupancy_standing_only">Uniquement debout</string>
-    <string name="congestion_jams">Embouteillages</string>
-    <string name="departure_departed">Parti</string>
-    <string name="at_time">à %1$02d:%2$02d</string>
-    <string name="departure_headsign_content_description">vers %1$s</string>
-    <string name="on_demand">à la demande</string>
-    <string name="no_boarding">pas d\'embarquement</string>
-    <string name="on_boarding">Embarquement</string>
-    <string name="boarding">Embarquement possible</string>
-    <string name="line_headsign">» %1$s</string>
-    <string name="stops_nearby">Arrêts à proximité</string>
-    <string name="line_headsigns_content_description">entre %1$s et %2$s</string>
-    <string name="line_headsign_content_description">vers %1$s</string>
-    <string name="line_headsigns">%1$s «» %2$s</string>
-    <string name="bimba_server_token_hint">Jeton d\'identification</string>
-    <string name="tickets_sold_content_description">Tickets vendus à bord</string>
-    <string name="usb_charging_content_description">Charge USB</string>
-    <string name="voice_announcements_content_description">Annonces vocales</string>
-    <string name="stop_content_description">Arrêt</string>
-    <string name="onboarding_advanced">Avancé</string>
-    <string name="title_feeds">Horaires</string>
-    <string name="error">Erreur</string>
-    <string name="onboarding_advanced_action">Choisir un serveur</string>
-    <string name="server_private_question">Ce serveur est privé et aucun jeton n\'a été fourni</string>
-    <string name="stops_near_code">Arrêts à proximité de %1$s</string>
-    <string name="vehicle_headsign_content_description">%1$s vers %2$s</string>
-    <string name="title_about">A propos</string>
-    <string name="website_button_description">Lien vers le site</string>
-    <string name="use_online_feed">Utiliser le flux en ligne</string>
-    <string name="error_406">La version de l\'application est incompatible avec le serveur</string>
-    <string name="title_filter">Filtrer</string>
-    <string name="cancel">Annuler</string>
-    <string name="more">Plus</string>
-    <string name="title_journey">Voyage</string>
-    <string name="title_activity_results">Résultats</string>
-    <string name="title_map">Carte</string>
-    <string name="no_departures">Aucun départ</string>
-    <string name="bimba_server_address_hint">Serveur</string>
-    <string name="air_condition_content_description">Air conditionné</string>
-    <string name="bicycles_allowed_content_description">Vélos autorisés</string>
-    <string name="show_departures">Montrer les départs</string>
-    <string name="realtime_content_description">Départ en temps réel</string>
-    <string name="open_in_maps_app">Ouvrir dans une application de cartes</string>
-    <string name="departure_now">Maintenant</string>
-    <string name="results_for">Résultats pour « %1$s »</string>
-    <string name="at_time_realtime">à %1$02d:%2$02d:%3$02d</string>
-    <string name="wheelchair_content_description">Le véhicule est accessible pour les fauteuils roulants</string>
-    <string name="departure_momentarily">dans un instant</string>
-    <string name="error_offline">Vous êtes hors ligne. Connectez-vous à Internet</string>
-    <string name="off_boarding">Débarquement</string>
-    <string name="error_gps">Impossible d\'obtenir la position actuelle</string>
-    <string name="speed_in_km_per_h">%1$s km/h</string>
-    <string name="occupancy_unknown">Inconnu</string>
-    <string name="occupancy_few_seats">Peu de sièges</string>
-    <string name="occupancy_crowded">bondé</string>
-    <string name="occupancy_empty">Vide</string>
-    <string name="occupancy_many_seats">Nombreux sièges</string>
-    <string name="occupancy_full">Rempli</string>
-    <string name="no_map_app">Aucune application de carte installée</string>
-    <string name="code_button_description">Lien vers le code source</string>
-    <string name="mastodon_button_description">Lien vers Mastodon</string>
-    <string name="title_select_date">Choisir le jour du départ</string>
-    <string name="title_select_line">Choisir une ligne</string>
-    <string name="last_update">Dernière mise à jour : %1$s</string>
-    <string name="title_servers">Serveurs</string>
-    <string name="title_cities">Localités</string>
-    <string name="information_may_be_outdated">L\'information peut être obsolète</string>
-    <string name="ok">OK</string>
-    <string name="no_location_message">L\'accès à la position est nécéssaire pour trouver les arrêts à proximité et afficher la position actuelle sur la carte. Les autres fonctions peuvent fonctionner sans cela. L\'accès peut être activé ou désactiver dans les paramètres du système à tout moment.</string>
-    <string name="stop_stub_on_demand_in_zone">Arrêt à la demande dans la zone %1$s</string>
-    <string name="stop_stub_in_zone">Arrêt dans la zone %1$s</string>
-    <string name="stop_stub_on_demand">Arrêt à la demande</string>
-    <string name="departure_headsign">» %1$s</string>
-    <string name="translation_button_description">Lien vers le service de traduction</string>
-    <string name="app_description">Assistant de transport public libre ; une fiche horaire dans votre poche.</string>
-    <string name="error_41">Cette localité n\'est pas couverte par le serveur</string>
-    <string name="current_timetable_validity">Horaire valide : du %1$s au %2$s</string>
-    <string name="filter_localities">Filtrer les localités</string>
-    <string name="stop_from_qr_code">Code QR d\'arrêt</string>
-    <string name="title_filter_byline">Filtrer par ligne</string>
-    <string name="title_filter_bytime">Filtrer par horaire</string>
-    <string name="title_select_time_end">Sélectionner l\'heure d\'arrivée</string>
-    <string name="title_select_time_start">Sélectionner l\'heure de départ</string>
-    <string name="credits">Police yellowcircle8 (https://git.apiote.xyz/yellowcircle8.git) basée sur Railway Sans © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n Icône Mastodon (https://github.com/mastodon/joinmastodon) © contributeurs de Mastodon, AGPL-3.0-or-later\n\n Logo Bimba créé par https://github.com/tebriz159\n\n Icônes Material © Google, Apache-2.0\n\n Données cartographiques © contributeurs d’OpenStreetMap, ODbL-1.0\n\n Liste des villes utilisées pour le géocodage des codes short plus © Geonames (https://geonames.org), CC BY\n\n Logo Matrix™/® Matrix.org</string>
-    <string name="error_400">L\'application a effectué une requête mal formulée</string>
-    <string name="error_404">Pas trouvé</string>
-    <string name="error_429">Limite dépassée. Réessayez plus tard</string>
-    <string name="onboarding_simple_action">Choisir la localité</string>
-    <string name="no_location_access">Accès à la position non autorisé</string>
-    <string name="seatbelts_everyone">En voiture tout le monde !</string>
-    <string name="onboarding_simple">Simple</string>
-    <string name="occupancy_wont_let">embarquement refusé</string>
-    <string name="choose_server">Choix du type de serveur</string>
-    <string name="distance_in_m">%1$s m</string>
-    <plurals name="distance_in_km_cd">
-        <item quantity="one">%1$d kilomètre</item>
-        <item quantity="many">%1$d kilomètres</item>
-        <item quantity="other">%1$d kilomètres</item>
-    </plurals>
-    <string name="distance_in_ft">%1$s ft</string>
-    <plurals name="time_in_s_cd">
-        <item quantity="one">%1$d seconde</item>
-        <item quantity="many">%1$d secondes</item>
-        <item quantity="other">%1$d secondes</item>
-    </plurals>
-    <plurals name="speed_in_km_per_h_cd">
-        <item quantity="one">%1$d kilomètre par heure</item>
-        <item quantity="many">%1$d kilomètres par heure</item>
-        <item quantity="other">%1$d kilomètres par heure</item>
-    </plurals>
-    <string name="favourite">Favori</string>
-    <string name="filtered">Filtré</string>
-    <string name="error_44">Plus de départ</string>
-    <string name="three">trois</string>
-    <string name="distance_in_gf">%1$s%2$sGf</string>
-    <string name="ten">dix</string>
-    <string name="cities_channel_description">Notifications indiquant l’avancement de la mise à jour des données locales de géocodage</string>
-    <string name="saving_cities_list">Enregistrement de la liste des villes</string>
-    <string name="updating_geocoding_data">Mise à jour des données de géocodage</string>
-    <string name="downloading_cities_list">téléchargement de la liste des villes</string>
-    <string name="two">deux</string>
-    <string name="elv">onze</string>
-    <string name="none">aucun</string>
-    <string name="hide">cacher</string>
-    <string name="colour">couleur</string>
-    <string name="show">montrer</string>
-    <string name="grey_out">griser</string>
-    <string name="filtered_departures">Départs filtrés</string>
-    <string name="local_time">heure locale</string>
-    <string name="speed_in_m_per_s">%1$s m/s</string>
-    <string name="speed_in_mi_per_h">%1$s mph</string>
-    <string name="server_rate_limited_question">Ce serveur est à taux limité et aucun jeton n’a été fourni. Voulez-vous continuer ?</string>
-    <string name="no_geocoding_data">Pas de données de géocodage</string>
-    <string name="error_geocoding">Ville introuvable</string>
-    <string name="four">quatre</string>
-    <string name="five">cinq</string>
-    <string name="six">six</string>
-    <string name="seven">sept</string>
-    <string name="eight">huit</string>
-    <string name="nine">neuf</string>
-    <plurals name="distance_in_m_cd">
-        <item quantity="one">%1$d mètre</item>
-        <item quantity="many">%1$d mètres</item>
-        <item quantity="other">%1$d mètres</item>
-    </plurals>
-    <plurals name="distance_in_yd_cd">
-        <item quantity="one">%1$d yard</item>
-        <item quantity="many">%1$d yards</item>
-        <item quantity="other">%1$d yards</item>
-    </plurals>
-    <plurals name="distance_in_ft_cd">
-        <item quantity="one">%1$d pied</item>
-        <item quantity="many">%1$d pieds</item>
-        <item quantity="other">%1$d pieds</item>
-    </plurals>
-    <plurals name="distance_in_mi_cd">
-        <item quantity="one">%1$d mille</item>
-        <item quantity="many">%1$d milles</item>
-        <item quantity="other">%1$d milles</item>
-    </plurals>
-    <plurals name="speed_in_m_per_s_cd">
-        <item quantity="one">%1$d mètre par seconde</item>
-        <item quantity="many">%1$d mètres par seconde</item>
-        <item quantity="other">%1$d mètres par seconde</item>
-    </plurals>
-    <plurals name="speed_in_mi_per_h_cd">
-        <item quantity="one">%1$d mille par heure</item>
-        <item quantity="many">%1$d milles par heure</item>
-        <item quantity="other">%1$d milles par heure</item>
-    </plurals>
-    <string name="congestion_stop_and_go">en accordéon</string>
-    <string name="onboarding_question">Comment souhaitez-vous commencer ?</string>
-    <string name="rate_limit">Taux limite</string>
-    <string name="error_traffic_spec">Impossible de vérifier le serveur</string>
-    <string name="error_url">URL non conforme fournie</string>
-    <string name="clear_date_selection">Effacer</string>
-    <string name="alert_header">Mise à jour du statut</string>
-    <string name="distance_in_km">%1$s km</string>
-    <string name="distance_in_yd">%1$s yd</string>
-    <string name="distance_in_mi">%1$s mi</string>
-    <string name="distance_in_two_units_cd">%1$s et %2$s</string>
-    <string name="time_in_s">%1$s s</string>
-    <string name="map_attribution">© contributeurs d’&lt;a href=https://www.openstreetmap.org/copyright&gt;OpenStreetMap&lt;/a&gt;</string>
-    <string name="no_email_app">Aucune application d’e-mail installée</string>
-    <string name="favourite_content_description">Enregistrer comme favori</string>
-    <string name="unfiltered">Non filtré</string>
-    <string name="cannot_save_favourite">Impossible d’enregistrer le favori</string>
-    <string name="loading">chargement…</string>
-    <string name="favourite_deleted">Favori supprimé</string>
-    <string name="undo">Annuler</string>
-    <string name="units_title">Système d’unités</string>
-    <string name="units_locale_based">Basé sur le système</string>
-    <string name="units_metric">Métrique (SI)</string>
-    <string name="units_imperial">Impérial (Royaume-Uni)</string>
-    <string name="units_customary">Américain (États-Unis)</string>
-    <string name="units_tgm10">TGM (base 10)</string>
-    <string name="units_tgm12">TGM (base 12)</string>
-    <string name="title_settings">Paramètres</string>
-    <string name="cities_channel_name">Fil de mise à jour des villes</string>
-    <string name="finished_updating_geocoding_data">Mise à jour des données de géocodage terminée</string>
-    <string name="updating_geocoding_data_failed">Mise à jour des données de géocodage échouée</string>
-    <string name="zero">zéro</string>
-    <string name="one">un</string>
-    <string name="filtered_stop_question">Voulez-vous enregistrer un favori filtré avec des lignes sélectionnées ?</string>
-    <string name="line_decorations">Décorations du nom de la ligne</string>
-    <string name="acra_notification_channel">Fil des rapports de problèmes</string>
-    <string name="acra_notification_channel_description">Notifications indiquant les problèmes et permettant d\'envoyer des rapports de problèmes</string>
-    <string name="acra_notification_title">Bimba s’est arrêté</string>
-    <string name="acra_notification_text">Un blocage inattendu s\'est dressé sur le chemin de Bimba. Voulez-vous envoyer un rapport ?</string>
-    <string name="send">Envoyer</string>
-    <string name="discard">Supprimer</string>
-    <string name="send_with_comment">Envoyer avec commentaire</string>
-    <string name="acra_notification_comment">Commentaire ajouté au rapport de problème</string>
-    <string name="alerts">Alertes</string>
-    <string name="terminus_arrival_showing">Arrivées au terminus</string>
-    <string name="matrix_button_description">lien vers le salon Matrix</string>
-    <string name="email_button_description">lien vers le courriel</string>
-    <string name="transitous_description">Un service de transport public international, neutre sur le plan des fournisseurs et géré par la communauté. La couverture est disponible à l\'adresse suivante : https://transitous.org/sources/</string>
-    <string name="transitous_attribution">API Transitous (https://transitous.org) fournie par Spline (https://routing.spline.de). Localités (https://github.com/public-transport/transitous/tree/main/feeds) maintenues par la communauté.</string>
-    <string name="no_geocoding_data_description">La requête contient un code short plus mais il n\'y a pas de données de géocodage présentes. Téléchargez les données de géocodage ou activez leur mise à jour automatique dans les paramètres.</string>
-    <string name="congestion_congestion">ralentissements</string>
-    <string name="about_time">environ %1$02d:%2$02d</string>
-    <string name="italics">italique</string>
-</resources>
+-->
+<resources>
+	<string name="app_name">Bimba</string>
+	<string name="title_home">Accueil</string>
+	<string name="home_fab_description">Icône GPS</string>
+	<string name="save">Enregistrer</string>
+	<string name="continue_">Continuer</string>
+	<string name="search_placeholder">Arrêts, lignes, ou Plus Codes</string>
+	<string name="error_401">Un jeton est nécessaire pour utiliser ce serveur</string>
+	<string name="error_403">Le jeton fourni est incorrect</string>
+	<string name="error_50x">Il y a eu une erreur sur le serveur. Réessayez plus tard</string>
+	<string name="error_connecting">Erreur lors de la connection au serveur. Réessayez plus tard</string>
+	<string name="error_unknown">Erreur inconnue</string>
+	<string name="waiting_position">En attente de la position</string>
+	<string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
+	<string name="congestion_unknown">Inconnu</string>
+	<string name="congestion_smooth">Fluide</string>
+	<string name="occupancy_standing_only">Uniquement debout</string>
+	<string name="congestion_jams">Embouteillages</string>
+	<string name="departure_departed">Parti</string>
+	<string name="at_time">à %1$02d:%2$02d</string>
+	<string name="departure_headsign_content_description">vers %1$s</string>
+	<string name="on_demand">à la demande</string>
+	<string name="no_boarding">pas d\'embarquement</string>
+	<string name="on_boarding">Embarquement</string>
+	<string name="boarding">Embarquement possible</string>
+	<string name="line_headsign">» %1$s</string>
+	<string name="stops_nearby">Arrêts à proximité</string>
+	<string name="line_headsigns_content_description">entre %1$s et %2$s</string>
+	<string name="line_headsign_content_description">vers %1$s</string>
+	<string name="line_headsigns">%1$s «» %2$s</string>
+	<string name="bimba_server_token_hint">Jeton d\'identification</string>
+	<string name="tickets_sold_content_description">Tickets vendus à bord</string>
+	<string name="usb_charging_content_description">Charge USB</string>
+	<string name="voice_announcements_content_description">Annonces vocales</string>
+	<string name="stop_content_description">Arrêt</string>
+	<string name="onboarding_advanced">Avancé</string>
+	<string name="title_feeds">Horaires</string>
+	<string name="error">Erreur</string>
+	<string name="onboarding_advanced_action">Choisir un serveur</string>
+	<string name="server_private_question">Ce serveur est privé et aucun jeton n\'a été fourni</string>
+	<string name="stops_near_code">Arrêts à proximité de %1$s</string>
+	<string name="vehicle_headsign_content_description">%1$s vers %2$s</string>
+	<string name="title_about">A propos</string>
+	<string name="website_button_description">Lien vers le site</string>
+	<string name="use_online_feed">Utiliser le flux en ligne</string>
+	<string name="error_406">La version de l\'application est incompatible avec le serveur</string>
+	<string name="title_filter">Filtrer</string>
+	<string name="cancel">Annuler</string>
+	<string name="more">Plus</string>
+	<string name="title_journey">Voyage</string>
+	<string name="title_activity_results">Résultats</string>
+	<string name="title_map">Carte</string>
+	<string name="no_departures">Aucun départ</string>
+	<string name="bimba_server_address_hint">Serveur</string>
+	<string name="air_condition_content_description">Air conditionné</string>
+	<string name="bicycles_allowed_content_description">Vélos autorisés</string>
+	<string name="show_departures">Montrer les départs</string>
+	<string name="realtime_content_description">Départ en temps réel</string>
+	<string name="open_in_maps_app">Ouvrir dans une application de cartes</string>
+	<string name="departure_now">Maintenant</string>
+	<string name="results_for">Résultats pour « %1$s »</string>
+	<string name="at_time_realtime">à %1$02d:%2$02d:%3$02d</string>
+	<string name="wheelchair_content_description">Le véhicule est accessible pour les fauteuils roulants</string>
+	<string name="departure_momentarily">dans un instant</string>
+	<string name="error_offline">Vous êtes hors ligne. Connectez-vous à Internet</string>
+	<string name="off_boarding">Débarquement</string>
+	<string name="error_gps">Impossible d\'obtenir la position actuelle</string>
+	<string name="speed_in_km_per_h">%1$s km/h</string>
+	<string name="occupancy_unknown">Inconnu</string>
+	<string name="occupancy_few_seats">Peu de sièges</string>
+	<string name="occupancy_crowded">bondé</string>
+	<string name="occupancy_empty">Vide</string>
+	<string name="occupancy_many_seats">Nombreux sièges</string>
+	<string name="occupancy_full">Rempli</string>
+	<string name="no_map_app">Aucune application de carte installée</string>
+	<string name="code_button_description">Lien vers le code source</string>
+	<string name="mastodon_button_description">Lien vers Mastodon</string>
+	<string name="title_select_date">Choisir le jour du départ</string>
+	<string name="title_select_line">Choisir une ligne</string>
+	<string name="last_update">Dernière mise à jour : %1$s</string>
+	<string name="title_servers">Serveurs</string>
+	<string name="title_cities">Localités</string>
+	<string name="information_may_be_outdated">L\'information peut être obsolète</string>
+	<string name="ok">OK</string>
+	<string name="no_location_message">L\'accès à la position est nécéssaire pour trouver les arrêts à proximité et afficher la position actuelle sur la carte. Les autres fonctions peuvent fonctionner sans cela. L\'accès peut être activé ou désactiver dans les paramètres du système à tout moment.</string>
+	<string name="stop_stub_on_demand_in_zone">Arrêt à la demande dans la zone %1$s</string>
+	<string name="stop_stub_in_zone">Arrêt dans la zone %1$s</string>
+	<string name="stop_stub_on_demand">Arrêt à la demande</string>
+	<string name="departure_headsign">» %1$s</string>
+	<string name="translation_button_description">Lien vers le service de traduction</string>
+	<string name="app_description">Assistant de transport public libre ; une fiche horaire dans votre poche.</string>
+	<string name="error_41">Cette localité n\'est pas couverte par le serveur</string>
+	<string name="current_timetable_validity">Horaire valide : du %1$s au %2$s</string>
+	<string name="filter_localities">Filtrer les localités</string>
+	<string name="stop_from_qr_code">Code QR d\'arrêt</string>
+	<string name="title_filter_byline">Filtrer par ligne</string>
+	<string name="title_filter_bytime">Filtrer par horaire</string>
+	<string name="title_select_time_end">Sélectionner l\'heure d\'arrivée</string>
+	<string name="title_select_time_start">Sélectionner l\'heure de départ</string>
+	<string name="credits">Police yellowcircle8 (https://git.apiote.xyz/yellowcircle8.git) basée sur Railway Sans © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n Icône Mastodon (https://github.com/mastodon/joinmastodon) © contributeurs de Mastodon, AGPL-3.0-or-later\n\n Logo Bimba créé par https://github.com/tebriz159\n\n Icônes Material © Google, Apache-2.0\n\n Données cartographiques © contributeurs d’OpenStreetMap, ODbL-1.0\n\n Liste des villes utilisées pour le géocodage des codes short plus © Geonames (https://geonames.org), CC BY\n\n Logo Matrix™/® Matrix.org</string>
+	<string name="error_400">L\'application a effectué une requête mal formulée</string>
+	<string name="error_404">Pas trouvé</string>
+	<string name="error_429">Limite dépassée. Réessayez plus tard</string>
+	<string name="onboarding_simple_action">Choisir la localité</string>
+	<string name="no_location_access">Accès à la position non autorisé</string>
+	<string name="seatbelts_everyone">En voiture tout le monde !</string>
+	<string name="onboarding_simple">Simple</string>
+	<string name="occupancy_wont_let">embarquement refusé</string>
+	<string name="choose_server">Choix du type de serveur</string>
+	<string name="distance_in_m">%1$s m</string>
+	<plurals name="distance_in_km_cd">
+		<item quantity="one">%1$d kilomètre</item>
+		<item quantity="many">%1$d kilomètres</item>
+		<item quantity="other">%1$d kilomètres</item>
+	</plurals>
+	<string name="distance_in_ft">%1$s ft</string>
+	<plurals name="time_in_s_cd">
+		<item quantity="one">%1$d seconde</item>
+		<item quantity="many">%1$d secondes</item>
+		<item quantity="other">%1$d secondes</item>
+	</plurals>
+	<plurals name="speed_in_km_per_h_cd">
+		<item quantity="one">%1$d kilomètre par heure</item>
+		<item quantity="many">%1$d kilomètres par heure</item>
+		<item quantity="other">%1$d kilomètres par heure</item>
+	</plurals>
+	<string name="favourite">Favori</string>
+	<string name="filtered">Filtré</string>
+	<string name="error_44">Plus de départ</string>
+	<string name="three">trois</string>
+	<string name="distance_in_gf">%1$s%2$sGf</string>
+	<string name="ten">dix</string>
+	<string name="cities_channel_description">Notifications indiquant l’avancement de la mise à jour des données locales de géocodage</string>
+	<string name="saving_cities_list">Enregistrement de la liste des villes</string>
+	<string name="updating_geocoding_data">Mise à jour des données de géocodage</string>
+	<string name="downloading_cities_list">téléchargement de la liste des villes</string>
+	<string name="two">deux</string>
+	<string name="elv">onze</string>
+	<string name="none">aucun</string>
+	<string name="hide">cacher</string>
+	<string name="colour">couleur</string>
+	<string name="show">montrer</string>
+	<string name="grey_out">griser</string>
+	<string name="filtered_departures">Départs filtrés</string>
+	<string name="local_time">heure locale</string>
+	<string name="speed_in_m_per_s">%1$s m/s</string>
+	<string name="speed_in_mi_per_h">%1$s mph</string>
+	<string name="server_rate_limited_question">Ce serveur est à taux limité et aucun jeton n’a été fourni. Voulez-vous continuer ?</string>
+	<string name="no_geocoding_data">Pas de données de géocodage</string>
+	<string name="error_geocoding">Ville introuvable</string>
+	<string name="four">quatre</string>
+	<string name="five">cinq</string>
+	<string name="six">six</string>
+	<string name="seven">sept</string>
+	<string name="eight">huit</string>
+	<string name="nine">neuf</string>
+	<plurals name="distance_in_m_cd">
+		<item quantity="one">%1$d mètre</item>
+		<item quantity="many">%1$d mètres</item>
+		<item quantity="other">%1$d mètres</item>
+	</plurals>
+	<plurals name="distance_in_yd_cd">
+		<item quantity="one">%1$d yard</item>
+		<item quantity="many">%1$d yards</item>
+		<item quantity="other">%1$d yards</item>
+	</plurals>
+	<plurals name="distance_in_ft_cd">
+		<item quantity="one">%1$d pied</item>
+		<item quantity="many">%1$d pieds</item>
+		<item quantity="other">%1$d pieds</item>
+	</plurals>
+	<plurals name="distance_in_mi_cd">
+		<item quantity="one">%1$d mille</item>
+		<item quantity="many">%1$d milles</item>
+		<item quantity="other">%1$d milles</item>
+	</plurals>
+	<plurals name="speed_in_m_per_s_cd">
+		<item quantity="one">%1$d mètre par seconde</item>
+		<item quantity="many">%1$d mètres par seconde</item>
+		<item quantity="other">%1$d mètres par seconde</item>
+	</plurals>
+	<plurals name="speed_in_mi_per_h_cd">
+		<item quantity="one">%1$d mille par heure</item>
+		<item quantity="many">%1$d milles par heure</item>
+		<item quantity="other">%1$d milles par heure</item>
+	</plurals>
+	<string name="congestion_stop_and_go">en accordéon</string>
+	<string name="onboarding_question">Comment souhaitez-vous commencer ?</string>
+	<string name="rate_limit">Taux limite</string>
+	<string name="error_traffic_spec">Impossible de vérifier le serveur</string>
+	<string name="error_url">URL non conforme fournie</string>
+	<string name="clear_date_selection">Effacer</string>
+	<string name="alert_header">Mise à jour du statut</string>
+	<string name="distance_in_km">%1$s km</string>
+	<string name="distance_in_yd">%1$s yd</string>
+	<string name="distance_in_mi">%1$s mi</string>
+	<string name="distance_in_two_units_cd">%1$s et %2$s</string>
+	<string name="time_in_s">%1$s s</string>
+	<string name="map_attribution">© contributeurs d’&lt;a href=https://www.openstreetmap.org/copyright&gt;OpenStreetMap&lt;/a&gt;</string>
+	<string name="no_email_app">Aucune application d’e-mail installée</string>
+	<string name="favourite_content_description">Enregistrer comme favori</string>
+	<string name="unfiltered">Non filtré</string>
+	<string name="cannot_save_favourite">Impossible d’enregistrer le favori</string>
+	<string name="loading">chargement…</string>
+	<string name="favourite_deleted">Favori supprimé</string>
+	<string name="undo">Annuler</string>
+	<string name="units_title">Système d’unités</string>
+	<string name="units_locale_based">Basé sur le système</string>
+	<string name="units_metric">Métrique (SI)</string>
+	<string name="units_imperial">Impérial (Royaume-Uni)</string>
+	<string name="units_customary">Américain (États-Unis)</string>
+	<string name="units_tgm10">TGM (base 10)</string>
+	<string name="units_tgm12">TGM (base 12)</string>
+	<string name="title_settings">Paramètres</string>
+	<string name="cities_channel_name">Fil de mise à jour des villes</string>
+	<string name="finished_updating_geocoding_data">Mise à jour des données de géocodage terminée</string>
+	<string name="updating_geocoding_data_failed">Mise à jour des données de géocodage échouée</string>
+	<string name="zero">zéro</string>
+	<string name="one">un</string>
+	<string name="filtered_stop_question">Voulez-vous enregistrer un favori filtré avec des lignes sélectionnées ?</string>
+	<string name="line_decorations">Décorations du nom de la ligne</string>
+	<string name="acra_notification_channel">Fil des rapports de problèmes</string>
+	<string name="acra_notification_channel_description">Notifications indiquant les problèmes et permettant d\'envoyer des rapports de problèmes</string>
+	<string name="acra_notification_title">Bimba s’est arrêté</string>
+	<string name="acra_notification_text">Un blocage inattendu s\'est dressé sur le chemin de Bimba. Voulez-vous envoyer un rapport ?</string>
+	<string name="send">Envoyer</string>
+	<string name="discard">Supprimer</string>
+	<string name="send_with_comment">Envoyer avec commentaire</string>
+	<string name="acra_notification_comment">Commentaire ajouté au rapport de problème</string>
+	<string name="alerts">Alertes</string>
+	<string name="terminus_arrival_showing">Arrivées au terminus</string>
+	<string name="matrix_button_description">lien vers le salon Matrix</string>
+	<string name="email_button_description">lien vers le courriel</string>
+	<string name="transitous_description">Un service de transport public international, neutre sur le plan des fournisseurs et géré par la communauté. La couverture est disponible à l\'adresse suivante : https://transitous.org/sources/</string>
+	<string name="transitous_attribution">API Transitous (https://transitous.org) fournie par Spline (https://routing.spline.de). Localités (https://github.com/public-transport/transitous/tree/main/feeds) maintenues par la communauté.</string>
+	<string name="no_geocoding_data_description">La requête contient un code short plus mais il n\'y a pas de données de géocodage présentes. Téléchargez les données de géocodage ou activez leur mise à jour automatique dans les paramètres.</string>
+	<string name="congestion_congestion">ralentissements</string>
+	<string name="about_time">environ %1$02d:%2$02d</string>
+	<string name="italics">italique</string>
+	<string name="arrival_approximate">Arrivée approximative</string>
+	<string name="arrival">Arrivée</string>
+	<string name="departure">Départ</string>
+	<string name="departure_arrived">Arrivé</string>
+	<string name="departure_approximate">Départ approximatif</string>
+	<string name="approximately">Approximativement</string>
+</resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 0eafe8213914c69435cc0f085145d1a8db9c8a13..67515fdcea682ead528af602c8f053ee5cbfaccc 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -1,274 +1,274 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
 SPDX-FileCopyrightText: Adam Evyčędo and contributors using Weblate
 
 SPDX-License-Identifier: GPL-3.0-or-later
---><resources>
-    <string name="app_name">Bimba</string>
-    <string name="title_home">Casa</string>
-    <string name="title_map">Cartina</string>
-    <string name="title_journey">Viaggio</string>
-    <string name="home_fab_description">icona GPS</string>
-    <string name="search_placeholder">fermate, linee o codici OLC</string>
-    <string name="title_activity_results">Risultati</string>
-    <string name="continue_">Continua</string>
-    <string name="save">Salva</string>
-    <string name="error_400">L’app ha fatto una richiesta malformata</string>
-    <string name="error_401">Un gettone è necessario per usare questo server</string>
-    <string name="error_403">Il gettone è sbagliato</string>
-    <string name="error_404">Non trovato</string>
-    <string name="error_429">Superato il limite di frequenza. Prova di nuovo più tardi</string>
-    <string name="error_50x">C’era un errore sul sever. Prova di nuovo più tardi</string>
-    <string name="error_unknown">Un errrore sconosciutto è successo</string>
-    <string name="error_connecting">Errore di collegamento al server. Prova di nuovo più tardi</string>
-    <string name="error_offline">Sei offline. Collega al’Internet</string>
-    <string name="error_gps">Non è possibile ottenere la posizione corrente</string>
-    <string name="no_departures">Nessune partenze</string>
-    <string name="waiting_position">In attesa della posizione</string>
-    <string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
-    <string name="vehicle_headsign_content_description">%1$s verso %2$s</string>
-    <string name="speed_in_km_per_h">%1$s km/h</string>
-    <string name="congestion_unknown">sconosciuta</string>
-    <string name="congestion_smooth">fluido</string>
-    <string name="congestion_stop_and_go">fermarsi e andare</string>
-    <string name="congestion_congestion">congestione</string>
-    <string name="congestion_jams">ingorghi</string>
-    <string name="occupancy_unknown">sconosciuta</string>
-    <string name="occupancy_empty">vouto</string>
-    <string name="occupancy_many_seats">molte sedie</string>
-    <string name="occupancy_few_seats">pochi sedie</string>
-    <string name="occupancy_standing_only">solo in piedi</string>
-    <string name="occupancy_crowded">affollato</string>
-    <string name="occupancy_full">pieno</string>
-    <string name="occupancy_wont_let">non fa entrare</string>
-    <string name="no_map_app">Nessuna app cartine</string>
-    <string name="departure_headsign">» %1$s</string>
-    <string name="departure_headsign_content_description">verso %1$s</string>
-    <string name="departure_momentarily">presto</string>
-    <string name="departure_departed">partito</string>
-    <string name="departure_now">adesso</string>
-    <string name="at_time">alle %1$02d:%2$02d</string>
-    <string name="at_time_realtime">alle %1$02d:%2$02d:%3$02d</string>
-    <string name="on_demand">su richiesta</string>
-    <string name="no_boarding">nessun imbarco</string>
-    <string name="on_boarding">salire</string>
-    <string name="off_boarding">scendere</string>
-    <string name="boarding">imbarco</string>
-    <string name="line_headsign">» %1$s</string>
-    <string name="line_headsign_content_description">verso %1$s</string>
-    <string name="line_headsigns">%1$s «» %2$s</string>
-    <string name="line_headsigns_content_description">tra %1$s e %2$s</string>
-    <string name="stops_nearby">Fermate vicine</string>
-    <string name="results_for">Risultati per «%1$s»</string>
-    <string name="bimba_server_address_hint">Server</string>
-    <string name="bimba_server_token_hint">Gettone</string>
-    <string name="realtime_content_description">la partenza è in tempo reale</string>
-    <string name="wheelchair_content_description">il veicolo è accessibile alle sedie a rotelle</string>
-    <string name="air_condition_content_description">climatizzazione</string>
-    <string name="bicycles_allowed_content_description">bici permesse</string>
-    <string name="voice_announcements_content_description">avvisi vocali</string>
-    <string name="tickets_sold_content_description">biglietti venduti a bordo</string>
-    <string name="usb_charging_content_description">ricarica USB</string>
-    <string name="show_departures">Mostra le partenze</string>
-    <string name="open_in_maps_app">Apri nell’app cartine</string>
-    <string name="stop_content_description">fermata</string>
-    <string name="seatbelts_everyone">Allacciate le cinture!</string>
-    <string name="onboarding_question">Come comminciamo?</string>
-    <string name="onboarding_simple">Semplicemente</string>
-    <string name="onboarding_simple_action">scegli località</string>
-    <string name="onboarding_advanced">Avanzato</string>
-    <string name="onboarding_advanced_action">scegli server</string>
-    <string name="cancel">Anulla</string>
-    <string name="error">Errore</string>
-    <string name="rate_limit">Limite di frequenza</string>
-    <string name="server_rate_limited_question">Il server è a frequenza limitata e non è stato fornito alcun gettone. Vuoi continuare?</string>
-    <string name="server_private_question">Il server è privato e non è stato fornito alcun gettone</string>
-    <string name="last_update">Aggiornamento più recente: %1$s</string>
-    <string name="title_feeds">Orari</string>
-    <string name="title_servers">Server</string>
-    <string name="title_cities">Località</string>
-    <string name="error_url">URL malformato fornito</string>
-    <string name="error_traffic_spec">Impossibile verificare il server</string>
-    <string name="stops_near_code">Fermate vicino a %1$s</string>
-    <string name="choose_server">Scegli la varietà del server</string>
-    <string name="ok">OK</string>
-    <string name="no_location_access">Accesso alla posizione non fornito</string>
-    <string name="no_location_message">È necessaria l’autorizzazione all’uso della posizione per trovare le fermate vicine e per mostrare la posizione corrente sulla mappa. Le altre funzioni funzionano anche senza l’autorizzazione. Può essere attivata e disattivata in qualsiasi momento nelle impostazioni di sistema.</string>
-    <string name="stop_stub_on_demand_in_zone">Fermata su richiesta nella zona %1$s</string>
-    <string name="stop_stub_on_demand">Fermata su richiesta</string>
-    <string name="stop_stub_in_zone">Fermata nella zona %1$s</string>
-    <string name="title_about">Che cos\'è</string>
-    <string name="translation_button_description">link al servizio di traduzioni</string>
-    <string name="app_description">Compagno FLOSS di passeggero di trasport pubblico; un orario nella tasca.</string>
-    <string name="website_button_description">link al sito web</string>
-    <string name="code_button_description">link al codice sorgente</string>
-    <string name="mastodon_button_description">link a Mastodon</string>
-    <string name="use_online_feed">Usa online</string>
-    <string name="information_may_be_outdated">Le informazioni possono essere obsolete</string>
-    <string name="current_timetable_validity">Orario attuale valido: %1$s fino alla %2$s</string>
-    <string name="error_406">La versione dell’app non è compatibile con il server</string>
-    <string name="filter_localities">filtra le località</string>
-    <string name="error_41">Questa località non è supportata dal server</string>
-    <string name="credits">Font yellowcircle8 (https://git.apiote.xyz/yellowcircle8.git) basato su Railway Sans © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n L’icona di Mastodon (https://github.com/mastodon/joinmastodon) © collaboratori Mastodon, AGPL-3.0-or-later\n\n L’icona di Bimba creata da https://github.com/tebriz159\n\n Material icons © Google, Apache-2.0\n\n Dati della carta © collaboratori OpenStreetMap (https://www.openstreetmap.org/copyright), ODbL-1.0\n\nElenco delle città utilizzato per la geocodificazione dei brevi codici OLC © Geonames (https://geonames.org), CC BY</string>
-    <string name="stop_from_qr_code">Stop del codice QR</string>
-    <string name="title_select_date">Scegli il giorno della partenza</string>
-    <string name="title_select_line">Scegli la linea</string>
-    <string name="clear_date_selection">Azzera</string>
-    <string name="title_filter">Fìltra</string>
-    <string name="title_filter_byline">Filtra per linee</string>
-    <string name="title_filter_bytime">Filtra per orari</string>
-    <string name="title_select_time_start">Scegli l’inizio</string>
-    <string name="title_select_time_end">Scegli il fine</string>
-    <string name="more">Più</string>
-    <string name="alert_header">Informazioni tempestive</string>
-    <string name="map_attribution"><![CDATA[© collaboratori <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>]]></string>
-    <string name="time_in_tm">%1$s %2$sTm</string>
-    <string name="time_in_tm_past">%1$s %2$sTm fa</string>
-    <string name="speed_in_m_per_s">%1$s m/s</string>
-    <string name="speed_in_mi_per_h">%1$s mph</string>
-    <string name="speed_in_vl">%1$s Vl</string>
-    <string name="filtered">Filtrato</string>
-    <string name="unfiltered">Non filtrato</string>
-    <string name="error_geocoding">Città non trovata</string>
-    <string name="cities_channel_name">Canale di aggiornamento delle città</string>
-    <string name="cities_channel_description">Notifiche che mostrano l\'avanzamento dell\'aggiornamento dei dati locali di geocodifica</string>
-    <string name="saving_cities_list">salvando l\'elenco delle città</string>
-    <string name="updating_geocoding_data">Aggiornando i dati di geocodifica</string>
-    <string name="downloading_cities_list">scaricando l\'elenco delle città</string>
-    <string name="finished_updating_geocoding_data">Aggiornamento dei dati di geocodificazione finito</string>
-    <string name="updating_geocoding_data_failed">Aggiornamento dei dati di geocodifica non riuscito</string>
-    <string name="four">quattro</string>
-    <string name="five">cinque</string>
-    <string name="six">sei</string>
-    <string name="seven">sette</string>
-    <string name="eight">otto</string>
-    <string name="nine">nove</string>
-    <string name="ten">dieci</string>
-    <string name="elv">el</string>
-    <string name="duna">duna</string>
-    <string name="quedra">quedra</string>
-    <string name="zen">dozzi</string>
-    <string name="trin">trino</string>
-    <string name="quen">queno</string>
-    <string name="hes">heso</string>
-    <string name="sev">sevo</string>
-    <string name="ak">aco</string>
-    <string name="neen">nino</string>
-    <string name="dex">deso</string>
-    <string name="lef">lefo</string>
-    <string name="filtered_stop_question">Vuoi salvare un preferito filtrato con le linee selezionate?</string>
-    <plurals name="distance_in_km_cd">
-        <item quantity="one">%1$d chilometro</item>
-        <item quantity="many">%1$d di chilometri</item>
-        <item quantity="other">%1$d chilometri</item>
-    </plurals>
-    <plurals name="distance_in_yd_cd">
-        <item quantity="one">%1$d iarda</item>
-        <item quantity="many">%1$d di iarde</item>
-        <item quantity="other">%1$d iarde</item>
-    </plurals>
-    <plurals name="distance_in_ft_cd">
-        <item quantity="one">%1$d piede</item>
-        <item quantity="many">%1$d di piedi</item>
-        <item quantity="other">%1$d piedi</item>
-    </plurals>
-    <plurals name="distance_in_gf_cd">
-        <item quantity="one">%1$d grapiede</item>
-        <item quantity="many">%1$d di grapiedi</item>
-        <item quantity="other">%1$d grapiedi</item>
-    </plurals>
-    <plurals name="distance_in_3gf_12_cd">
-        <item quantity="one">%1$s trinagrapiede</item>
-        <item quantity="many">%1$s di trinagrapiedi</item>
-        <item quantity="other">%1$s trinagrapiedi</item>
-    </plurals>
-    <plurals name="time_in_s_cd">
-        <item quantity="one">%1$d secondo</item>
-        <item quantity="many">%1$d di secondi</item>
-        <item quantity="other">%1$d secondi</item>
-    </plurals>
-    <plurals name="time_in_tm_cd">
-        <item quantity="one">%1$d timo</item>
-        <item quantity="many">%1$d di timi</item>
-        <item quantity="other">%1$d timi</item>
-    </plurals>
-    <plurals name="time_in_4tm_12_cd">
-        <item quantity="one">%1$s quedratimo</item>
-        <item quantity="many">%1$s di quedratimi</item>
-        <item quantity="other">%1$s quedratimi</item>
-    </plurals>
-    <plurals name="time_in_2tm_12_cd">
-        <item quantity="one">%1$s dunatimo</item>
-        <item quantity="many">%1$s di dunatimi</item>
-        <item quantity="other">%1$s dunatimi</item>
-    </plurals>
-    <plurals name="speed_in_km_per_h_cd">
-        <item quantity="one">%1$d chilometro orario</item>
-        <item quantity="many">%1$d di chilometri orari</item>
-        <item quantity="other">%1$d chilometri orari</item>
-    </plurals>
-    <plurals name="speed_in_mi_per_h_cd">
-        <item quantity="one">%1$d miglio orario</item>
-        <item quantity="many">%1$d di miglia orarie</item>
-        <item quantity="other">%1$d miglia orarie</item>
-    </plurals>
-    <plurals name="speed_in_vl_cd">
-        <item quantity="one">%1$d vloso</item>
-        <item quantity="many">%1$d di vlosi</item>
-        <item quantity="other">%1$d vlosi</item>
-    </plurals>
-    <plurals name="speed_in_vl_12_cd">
-        <item quantity="one">%1$s vloso</item>
-        <item quantity="many">%1$s di vlosi</item>
-        <item quantity="other">%1$s vlosi</item>
-    </plurals>
-    <plurals name="distance_in_mi_cd">
-        <item quantity="one">%1$d miglio</item>
-        <item quantity="many">%1$d di miglia</item>
-        <item quantity="other">%1$d miglia</item>
-    </plurals>
-    <plurals name="distance_in_m_cd">
-        <item quantity="one">%1$d metro</item>
-        <item quantity="many">%1$d di metri</item>
-        <item quantity="other">%1$d metri</item>
-    </plurals>
-    <plurals name="distance_in_gf_12_cd">
-        <item quantity="one">%1$s grapiede</item>
-        <item quantity="many">%1$s di grapiedi</item>
-        <item quantity="other">%1$s grapiedi</item>
-    </plurals>
-    <plurals name="speed_in_m_per_s_cd">
-        <item quantity="one">%1$d metro al secondo</item>
-        <item quantity="many">%1$d di metri al secondo</item>
-        <item quantity="other">%1$d metri al secondo</item>
-    </plurals>
-    <string name="favourite">Preferito</string>
-    <string name="no_geocoding_data">Nessun dato di geocodifica</string>
-    <string name="no_geocoding_data_description">La domanda contiene un codice breve OLC ma non sono presenti dati di geocodifica. Scarica i dati di geocodifica o abilita l\'aggiornamento automatico nelle impostazioni.</string>
-    <string name="zero">zero</string>
-    <string name="one">un</string>
-    <string name="two">due</string>
-    <string name="three">tre</string>
-    <string name="distance_in_m">%1$s m</string>
-    <string name="distance_in_km">%1$s km</string>
-    <string name="distance_in_two_units_cd">%1$s e %2$s</string>
-    <string name="distance_in_yd">%1$s yd</string>
-    <string name="distance_in_ft">%1$s ft</string>
-    <string name="distance_in_mi">%1$s mi</string>
-    <string name="distance_in_gf">%1$s %2$sGf</string>
-    <string name="time_in_s">%1$s s</string>
-    <string name="favourite_content_description">Salva nei preferiti</string>
-    <string name="cannot_save_favourite">Impossibile salvare nei preferiti</string>
-    <string name="error_44">nessune più partenze</string>
-    <string name="loading">in caricamento…</string>
-    <string name="favourite_deleted">Il preferito cancellato</string>
-    <string name="undo">Annulla</string>
-    <string name="units_title">Sistema di unità</string>
-    <string name="units_locale_based">Basato sul sistema</string>
-    <string name="units_metric">Metrico (SI)</string>
-    <string name="units_imperial">Imperiale (RU)</string>
-    <string name="units_customary">Consuetudinario statunitense</string>
-    <string name="units_tgm10">TGM (base 10)</string>
-    <string name="units_tgm12">TGM (base 12)</string>
-    <string name="title_settings">Impostazioni</string>
+-->
+<resources>
+	<string name="app_name">Bimba</string>
+	<string name="title_home">Casa</string>
+	<string name="title_map">Cartina</string>
+	<string name="title_journey">Viaggio</string>
+	<string name="home_fab_description">icona GPS</string>
+	<string name="search_placeholder">fermate, linee o codici OLC</string>
+	<string name="title_activity_results">Risultati</string>
+	<string name="continue_">Continua</string>
+	<string name="save">Salva</string>
+	<string name="error_400">L’app ha fatto una richiesta malformata</string>
+	<string name="error_401">Un gettone è necessario per usare questo server</string>
+	<string name="error_403">Il gettone è sbagliato</string>
+	<string name="error_404">Non trovato</string>
+	<string name="error_429">Superato il limite di frequenza. Prova di nuovo più tardi</string>
+	<string name="error_50x">C’era un errore sul sever. Prova di nuovo più tardi</string>
+	<string name="error_unknown">Un errrore sconosciutto è successo</string>
+	<string name="error_connecting">Errore di collegamento al server. Prova di nuovo più tardi</string>
+	<string name="error_offline">Sei offline. Collega al’Internet</string>
+	<string name="error_gps">Non è possibile ottenere la posizione corrente</string>
+	<string name="no_departures">Nessune partenze</string>
+	<string name="waiting_position">In attesa della posizione</string>
+	<string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
+	<string name="vehicle_headsign_content_description">%1$s verso %2$s</string>
+	<string name="speed_in_km_per_h">%1$s km/h</string>
+	<string name="congestion_unknown">sconosciuta</string>
+	<string name="congestion_smooth">fluido</string>
+	<string name="congestion_stop_and_go">fermarsi e andare</string>
+	<string name="congestion_congestion">congestione</string>
+	<string name="congestion_jams">ingorghi</string>
+	<string name="occupancy_unknown">sconosciuta</string>
+	<string name="occupancy_empty">vouto</string>
+	<string name="occupancy_many_seats">molte sedie</string>
+	<string name="occupancy_few_seats">pochi sedie</string>
+	<string name="occupancy_standing_only">solo in piedi</string>
+	<string name="occupancy_crowded">affollato</string>
+	<string name="occupancy_full">pieno</string>
+	<string name="occupancy_wont_let">non fa entrare</string>
+	<string name="no_map_app">Nessuna app cartine</string>
+	<string name="departure_headsign">» %1$s</string>
+	<string name="departure_headsign_content_description">verso %1$s</string>
+	<string name="departure_momentarily">presto</string>
+	<string name="departure_departed">partito</string>
+	<string name="departure_now">adesso</string>
+	<string name="at_time">alle %1$02d:%2$02d</string>
+	<string name="at_time_realtime">alle %1$02d:%2$02d:%3$02d</string>
+	<string name="on_demand">su richiesta</string>
+	<string name="no_boarding">nessun imbarco</string>
+	<string name="on_boarding">salire</string>
+	<string name="off_boarding">scendere</string>
+	<string name="boarding">imbarco</string>
+	<string name="line_headsign">» %1$s</string>
+	<string name="line_headsign_content_description">verso %1$s</string>
+	<string name="line_headsigns">%1$s «» %2$s</string>
+	<string name="line_headsigns_content_description">tra %1$s e %2$s</string>
+	<string name="stops_nearby">Fermate vicine</string>
+	<string name="results_for">Risultati per «%1$s»</string>
+	<string name="bimba_server_address_hint">Server</string>
+	<string name="bimba_server_token_hint">Gettone</string>
+	<string name="realtime_content_description">la partenza è in tempo reale</string>
+	<string name="wheelchair_content_description">il veicolo è accessibile alle sedie a rotelle</string>
+	<string name="air_condition_content_description">climatizzazione</string>
+	<string name="bicycles_allowed_content_description">bici permesse</string>
+	<string name="voice_announcements_content_description">avvisi vocali</string>
+	<string name="tickets_sold_content_description">biglietti venduti a bordo</string>
+	<string name="usb_charging_content_description">ricarica USB</string>
+	<string name="show_departures">Mostra le partenze</string>
+	<string name="open_in_maps_app">Apri nell’app cartine</string>
+	<string name="stop_content_description">fermata</string>
+	<string name="seatbelts_everyone">Allacciate le cinture!</string>
+	<string name="onboarding_question">Come comminciamo?</string>
+	<string name="onboarding_simple">Semplicemente</string>
+	<string name="onboarding_simple_action">scegli località</string>
+	<string name="onboarding_advanced">Avanzato</string>
+	<string name="onboarding_advanced_action">scegli server</string>
+	<string name="cancel">Anulla</string>
+	<string name="error">Errore</string>
+	<string name="rate_limit">Limite di frequenza</string>
+	<string name="server_rate_limited_question">Il server è a frequenza limitata e non è stato fornito alcun gettone. Vuoi continuare?</string>
+	<string name="server_private_question">Il server è privato e non è stato fornito alcun gettone</string>
+	<string name="last_update">Aggiornamento più recente: %1$s</string>
+	<string name="title_feeds">Orari</string>
+	<string name="title_servers">Server</string>
+	<string name="title_cities">Località</string>
+	<string name="error_url">URL malformato fornito</string>
+	<string name="error_traffic_spec">Impossibile verificare il server</string>
+	<string name="stops_near_code">Fermate vicino a %1$s</string>
+	<string name="choose_server">Scegli la varietà del server</string>
+	<string name="ok">OK</string>
+	<string name="no_location_access">Accesso alla posizione non fornito</string>
+	<string name="no_location_message">È necessaria l’autorizzazione all’uso della posizione per trovare le fermate vicine e per mostrare la posizione corrente sulla mappa. Le altre funzioni funzionano anche senza l’autorizzazione. Può essere attivata e disattivata in qualsiasi momento nelle impostazioni di sistema.</string>
+	<string name="stop_stub_on_demand_in_zone">Fermata su richiesta nella zona %1$s</string>
+	<string name="stop_stub_on_demand">Fermata su richiesta</string>
+	<string name="stop_stub_in_zone">Fermata nella zona %1$s</string>
+	<string name="title_about">Che cos\'è</string>
+	<string name="translation_button_description">link al servizio di traduzioni</string>
+	<string name="app_description">Compagno FLOSS di passeggero di trasport pubblico; un orario nella tasca.</string>
+	<string name="website_button_description">link al sito web</string>
+	<string name="code_button_description">link al codice sorgente</string>
+	<string name="mastodon_button_description">link a Mastodon</string>
+	<string name="use_online_feed">Usa online</string>
+	<string name="information_may_be_outdated">Le informazioni possono essere obsolete</string>
+	<string name="current_timetable_validity">Orario attuale valido: %1$s fino alla %2$s</string>
+	<string name="error_406">La versione dell’app non è compatibile con il server</string>
+	<string name="filter_localities">filtra le località</string>
+	<string name="error_41">Questa località non è supportata dal server</string>
+	<string name="credits">Font yellowcircle8 (https://git.apiote.xyz/yellowcircle8.git) basato su Railway Sans © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n L’icona di Mastodon (https://github.com/mastodon/joinmastodon) © collaboratori Mastodon, AGPL-3.0-or-later\n\n L’icona di Bimba creata da https://github.com/tebriz159\n\n Material icons © Google, Apache-2.0\n\n Dati della carta © collaboratori OpenStreetMap (https://www.openstreetmap.org/copyright), ODbL-1.0\n\nElenco delle città utilizzato per la geocodificazione dei brevi codici OLC © Geonames (https://geonames.org), CC BY</string>
+	<string name="stop_from_qr_code">Stop del codice QR</string>
+	<string name="title_select_date">Scegli il giorno della partenza</string>
+	<string name="title_select_line">Scegli la linea</string>
+	<string name="clear_date_selection">Azzera</string>
+	<string name="title_filter">Fìltra</string>
+	<string name="title_filter_byline">Filtra per linee</string>
+	<string name="title_filter_bytime">Filtra per orari</string>
+	<string name="title_select_time_start">Scegli l’inizio</string>
+	<string name="title_select_time_end">Scegli il fine</string>
+	<string name="more">Più</string>
+	<string name="alert_header">Informazioni tempestive</string>
+	<string name="map_attribution"><![CDATA[© collaboratori <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>]]></string>
+	<string name="time_in_tm">%1$s %2$sTm</string>
+	<string name="time_in_tm_past">%1$s %2$sTm fa</string>
+	<string name="speed_in_m_per_s">%1$s m/s</string>
+	<string name="speed_in_mi_per_h">%1$s mph</string>
+	<string name="speed_in_vl">%1$s Vl</string>
+	<string name="filtered">Filtrato</string>
+	<string name="unfiltered">Non filtrato</string>
+	<string name="error_geocoding">Città non trovata</string>
+	<string name="cities_channel_name">Canale di aggiornamento delle città</string>
+	<string name="cities_channel_description">Notifiche che mostrano l\'avanzamento dell\'aggiornamento dei dati locali di geocodifica</string>
+	<string name="saving_cities_list">salvando l\'elenco delle città</string>
+	<string name="updating_geocoding_data">Aggiornando i dati di geocodifica</string>
+	<string name="downloading_cities_list">scaricando l\'elenco delle città</string>
+	<string name="finished_updating_geocoding_data">Aggiornamento dei dati di geocodificazione finito</string>
+	<string name="updating_geocoding_data_failed">Aggiornamento dei dati di geocodifica non riuscito</string>
+	<string name="four">quattro</string>
+	<string name="five">cinque</string>
+	<string name="six">sei</string>
+	<string name="seven">sette</string>
+	<string name="eight">otto</string>
+	<string name="nine">nove</string>
+	<string name="ten">dieci</string>
+	<string name="elv">el</string>
+	<string name="duna">duna</string>
+	<string name="quedra">quedra</string>
+	<string name="zen">dozzi</string>
+	<string name="trin">trino</string>
+	<string name="quen">queno</string>
+	<string name="hes">heso</string>
+	<string name="sev">sevo</string>
+	<string name="ak">aco</string>
+	<string name="neen">nino</string>
+	<string name="dex">deso</string>
+	<string name="lef">lefo</string>
+	<string name="filtered_stop_question">Vuoi salvare un preferito filtrato con le linee selezionate?</string>
+	<plurals name="distance_in_km_cd">
+		<item quantity="one">%1$d chilometro</item>
+		<item quantity="many">%1$d di chilometri</item>
+		<item quantity="other">%1$d chilometri</item>
+	</plurals>
+	<plurals name="distance_in_yd_cd">
+		<item quantity="one">%1$d iarda</item>
+		<item quantity="many">%1$d di iarde</item>
+		<item quantity="other">%1$d iarde</item>
+	</plurals>
+	<plurals name="distance_in_ft_cd">
+		<item quantity="one">%1$d piede</item>
+		<item quantity="many">%1$d di piedi</item>
+		<item quantity="other">%1$d piedi</item>
+	</plurals>
+	<plurals name="distance_in_gf_cd">
+		<item quantity="one">%1$d grapiede</item>
+		<item quantity="many">%1$d di grapiedi</item>
+		<item quantity="other">%1$d grapiedi</item>
+	</plurals>
+	<plurals name="distance_in_3gf_12_cd">
+		<item quantity="one">%1$s trinagrapiede</item>
+		<item quantity="many">%1$s di trinagrapiedi</item>
+		<item quantity="other">%1$s trinagrapiedi</item>
+	</plurals>
+	<plurals name="time_in_s_cd">
+		<item quantity="one">%1$d secondo</item>
+		<item quantity="many">%1$d di secondi</item>
+		<item quantity="other">%1$d secondi</item>
+	</plurals>
+	<plurals name="time_in_tm_cd">
+		<item quantity="one">%1$d timo</item>
+		<item quantity="many">%1$d di timi</item>
+		<item quantity="other">%1$d timi</item>
+	</plurals>
+	<plurals name="time_in_4tm_12_cd">
+		<item quantity="one">%1$s quedratimo</item>
+		<item quantity="many">%1$s di quedratimi</item>
+		<item quantity="other">%1$s quedratimi</item>
+	</plurals>
+	<plurals name="time_in_2tm_12_cd">
+		<item quantity="one">%1$s dunatimo</item>
+		<item quantity="many">%1$s di dunatimi</item>
+		<item quantity="other">%1$s dunatimi</item>
+	</plurals>
+	<plurals name="speed_in_km_per_h_cd">
+		<item quantity="one">%1$d chilometro orario</item>
+		<item quantity="many">%1$d di chilometri orari</item>
+		<item quantity="other">%1$d chilometri orari</item>
+	</plurals>
+	<plurals name="speed_in_mi_per_h_cd">
+		<item quantity="one">%1$d miglio orario</item>
+		<item quantity="many">%1$d di miglia orarie</item>
+		<item quantity="other">%1$d miglia orarie</item>
+	</plurals>
+	<plurals name="speed_in_vl_cd">
+		<item quantity="one">%1$d vloso</item>
+		<item quantity="many">%1$d di vlosi</item>
+		<item quantity="other">%1$d vlosi</item>
+	</plurals>
+	<plurals name="speed_in_vl_12_cd">
+		<item quantity="one">%1$s vloso</item>
+		<item quantity="many">%1$s di vlosi</item>
+		<item quantity="other">%1$s vlosi</item>
+	</plurals>
+	<plurals name="distance_in_mi_cd">
+		<item quantity="one">%1$d miglio</item>
+		<item quantity="many">%1$d di miglia</item>
+		<item quantity="other">%1$d miglia</item>
+	</plurals>
+	<plurals name="distance_in_m_cd">
+		<item quantity="one">%1$d metro</item>
+		<item quantity="many">%1$d di metri</item>
+		<item quantity="other">%1$d metri</item>
+	</plurals>
+	<plurals name="distance_in_gf_12_cd">
+		<item quantity="one">%1$s grapiede</item>
+		<item quantity="many">%1$s di grapiedi</item>
+		<item quantity="other">%1$s grapiedi</item>
+	</plurals>
+	<plurals name="speed_in_m_per_s_cd">
+		<item quantity="one">%1$d metro al secondo</item>
+		<item quantity="many">%1$d di metri al secondo</item>
+		<item quantity="other">%1$d metri al secondo</item>
+	</plurals>
+	<string name="favourite">Preferito</string>
+	<string name="no_geocoding_data">Nessun dato di geocodifica</string>
+	<string name="no_geocoding_data_description">La domanda contiene un codice breve OLC ma non sono presenti dati di geocodifica. Scarica i dati di geocodifica o abilita l\'aggiornamento automatico nelle impostazioni.</string>
+	<string name="zero">zero</string>
+	<string name="one">un</string>
+	<string name="two">due</string>
+	<string name="three">tre</string>
+	<string name="distance_in_m">%1$s m</string>
+	<string name="distance_in_km">%1$s km</string>
+	<string name="distance_in_two_units_cd">%1$s e %2$s</string>
+	<string name="distance_in_yd">%1$s yd</string>
+	<string name="distance_in_ft">%1$s ft</string>
+	<string name="distance_in_mi">%1$s mi</string>
+	<string name="distance_in_gf">%1$s %2$sGf</string>
+	<string name="time_in_s">%1$s s</string>
+	<string name="favourite_content_description">Salva nei preferiti</string>
+	<string name="cannot_save_favourite">Impossibile salvare nei preferiti</string>
+	<string name="error_44">nessune più partenze</string>
+	<string name="loading">in caricamento…</string>
+	<string name="favourite_deleted">Il preferito cancellato</string>
+	<string name="undo">Annulla</string>
+	<string name="units_title">Sistema di unità</string>
+	<string name="units_locale_based">Basato sul sistema</string>
+	<string name="units_metric">Metrico (SI)</string>
+	<string name="units_imperial">Imperiale (RU)</string>
+	<string name="units_customary">Consuetudinario statunitense</string>
+	<string name="units_tgm10">TGM (base 10)</string>
+	<string name="units_tgm12">TGM (base 12)</string>
+	<string name="title_settings">Impostazioni</string>
 </resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index 18cc0e701931c44646e7e0c5b028a021e85a355c..4d12b800cc840988cb6d1683e0b69d2e1534a7dd 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -7,6 +7,7 @@
 <resources xmlns:tool="http://schemas.android.com/tools">
 
 	<style name="Theme.Bimba" parent="Theme.Material3.Dark.NoActionBar">
+		<item name="fontFamily">@font/yellowcircle8</item>
 		<item name="android:fontFamily">@font/yellowcircle8</item>
 		<item name="colorPrimary">@color/md_theme_dark_primary</item>
 		<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
@@ -40,6 +41,22 @@ 		@android:color/transparent
 		<item name="android:enforceStatusBarContrast" tool:targetApi="q">false</item>
 		<item name="lightStatusBar">false</item>
 		<item name="randomColourLightness">.75</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Suggestion" parent="Widget.Material3.Chip.Suggestion">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Input" parent="Widget.Material3.Chip.Input">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Filter" parent="Widget.Material3.Chip.Filter">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="checkedIconVisible">false</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
 	</style>
 
 	<style name="Theme.Bimba.SearchResult.Title" parent="Theme.Bimba">




diff --git a/app/src/main/res/values-night-v31/themes.xml b/app/src/main/res/values-night-v31/themes.xml
index 4f3e6bf3e18b37d13d04dc967a0b03b75b701d1d..f98fabd05d7083193e3f102690bb6c6470b7f7d1 100644
--- a/app/src/main/res/values-night-v31/themes.xml
+++ b/app/src/main/res/values-night-v31/themes.xml
@@ -9,6 +9,7 @@
 <resources xmlns:tool="http://schemas.android.com/tools">
 
 	<style name="Theme.Bimba" parent="Theme.Material3.Dark.NoActionBar">
+		<item name="fontFamily">@font/yellowcircle8</item>
 		<item name="android:fontFamily">@font/yellowcircle8</item>
 		<item name="colorPrimary">@android:color/system_accent1_300</item>
 		<item name="colorOnPrimary">@android:color/system_accent1_800</item>
@@ -45,6 +46,22 @@ 		@android:color/transparent
 		<item name="android:enforceStatusBarContrast">false</item>
 		<item name="lightStatusBar">false</item>
 		<item name="randomColourLightness">.75</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Suggestion" parent="Widget.Material3.Chip.Suggestion">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Input" parent="Widget.Material3.Chip.Input">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Filter" parent="Widget.Material3.Chip.Filter">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="checkedIconVisible">false</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
 	</style>
 
 	<style name="Theme.Bimba.SearchResult.Title" parent="Theme.Bimba">




diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 09dc3798658a04c334efe19c2f20fe8924a6a437..72ac17567560698bccf27c59269956b5cee9ca3b 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -1,312 +1,333 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
 SPDX-FileCopyrightText: Adam Evyčędo and contributors using Weblate
 
 SPDX-License-Identifier: GPL-3.0-or-later
---><resources>
-    <string name="app_name">Bimba</string>
-    <string name="title_home">Dom</string>
-    <string name="title_map">Mapa</string>
-    <string name="title_journey">Podróż</string>
-    <string name="home_fab_description">ikona lokalizacji</string>
-    <string name="search_placeholder">przystanki, linie lub kody OLC</string>
-    <string name="title_activity_results">Wyniki</string>
-    <string name="continue_">Kontynuuj</string>
-    <string name="save">Zapisz</string>
-    <string name="error_400">Aplikacja wykonała niepoprawne żądanie</string>
-    <string name="error_401">Żeton jest wymagany, aby używać tego serwera</string>
-    <string name="error_403">Żeton jest niepoprawny</string>
-    <string name="error_404">Nie znaleziono</string>
-    <string name="error_429">Przekroczono limit prób. Spróbuj ponownie później</string>
-    <string name="error_50x">Błąd serwera. Spróbuj ponownie później</string>
-    <string name="error_unknown">Wystąpił nieznany błąd</string>
-    <string name="error_connecting">Błąd połączenia z serwerem. Spróbuj ponownie później</string>
-    <string name="error_offline">Brak połączenia z Internetem</string>
-    <string name="error_gps">Nie można uzyskać bierzącej pozycji</string>
-    <string name="no_departures">Brak odjazdów</string>
-    <string name="waiting_position">oczekiwanie na pozycję</string>
-    <string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
-    <string name="vehicle_headsign_content_description">%1$s w kierunku przystanku %2$s</string>
-    <string name="speed_in_km_per_h">%1$s km/h</string>
-    <string name="congestion_unknown">nieznane</string>
-    <string name="congestion_smooth">płynne</string>
-    <string name="congestion_stop_and_go">przestoje</string>
-    <string name="congestion_congestion">korki</string>
-    <string name="congestion_jams">zatory</string>
-    <string name="occupancy_unknown">nieznana</string>
-    <string name="occupancy_empty">pusty</string>
-    <string name="occupancy_many_seats">wiele miejsc</string>
-    <string name="occupancy_few_seats">kilka miejsc</string>
-    <string name="occupancy_standing_only">tylko stojące</string>
-    <string name="occupancy_crowded">zatłoczony</string>
-    <string name="occupancy_full">pełny</string>
-    <string name="occupancy_wont_let">nie wpuszcza</string>
-    <string name="no_map_app">Brak aplikacji map</string>
-    <string name="departure_headsign">» %1$s</string>
-    <string name="departure_headsign_content_description">w kierunku przystanku %1$s</string>
-    <string name="departure_momentarily">za moment</string>
-    <string name="departure_departed">odjechał</string>
-    <string name="departure_now">teraz</string>
-    <string name="at_time">o %1$02d:%2$02d</string>
-    <string name="about_time">około %1$02d:%2$02d</string>
-    <string name="at_time_realtime">o %1$02d:%2$02d:%3$02d</string>
-    <string name="on_demand">na żądanie</string>
-    <string name="no_boarding">brak</string>
-    <string name="on_boarding">wsiadanie</string>
-    <string name="off_boarding">wysiadanie</string>
-    <string name="boarding">standard</string>
-    <string name="line_headsign">» %1$s</string>
-    <string name="line_headsign_content_description">w kierunku przystanku %1$s</string>
-    <string name="line_headsigns">%1$s «» %2$s</string>
-    <string name="line_headsigns_content_description">pomiędzy przystankami %1$s i %2$s</string>
-    <string name="stops_nearby">Przystanki w pobliżu</string>
-    <string name="results_for">Wyniki dla „%1$s”</string>
-    <string name="bimba_server_address_hint">Serwer</string>
-    <string name="bimba_server_token_hint">Żeton</string>
-    <string name="realtime_content_description">odjazd w czasie rzeczywistym</string>
-    <string name="schedule_content_description">czas odjazdu jest z rozkładu</string>
-    <string name="wheelchair_content_description">pojazd ma niską podłogę</string>
-    <string name="air_condition_content_description">klimatyzacja</string>
-    <string name="bicycles_allowed_content_description">przewóz rowerów dozwolony</string>
-    <string name="voice_announcements_content_description">komunikaty głosowe</string>
-    <string name="tickets_sold_content_description">możliwość kupienia biletów na pokładzie</string>
-    <string name="usb_charging_content_description">ładowarki USB</string>
-    <string name="show_departures">Pokaż odjazdy</string>
-    <string name="open_in_maps_app">Otwórz w aplikacji map</string>
-    <string name="stop_content_description">przystanek</string>
-    <string name="seatbelts_everyone">Zajmujcie miejsca!</string>
-    <string name="onboarding_question">Jak zaczynamy?</string>
-    <string name="onboarding_simple">Prosto</string>
-    <string name="onboarding_simple_action">wybór lokalizacji</string>
-    <string name="onboarding_advanced">Zaawansowane</string>
-    <string name="onboarding_advanced_action">wybór serwerów</string>
-    <string name="cancel">Anuluj</string>
-    <string name="error">Błąd</string>
-    <string name="rate_limit">Limit żądań</string>
-    <string name="server_rate_limited_question">Nie podano żetona, a serwer limituje żądania. Czy chcesz kontynuować?</string>
-    <string name="server_private_question">Nie podano żetona, a serwer jest prywatny</string>
-    <string name="last_update">Ostatnia aktualizacja: %1$s</string>
-    <string name="title_feeds">Rozkłady</string>
-    <string name="title_servers">Serwery</string>
-    <string name="title_cities">Lokalizacje</string>
-    <string name="error_url">Podano błędny URL</string>
-    <string name="error_traffic_spec">Nie można zweryfikować serwera</string>
-    <string name="stops_near_code">Przystanki w pobliżu %1$s</string>
-    <string name="choose_server">Wybierz rodzaj serwera</string>
-    <string name="ok">OK</string>
-    <string name="no_location_access">Brak uprawnień do lokalizacji</string>
-    <string name="no_location_message">Uprawnienia do używania lokalizacji są wymagane, aby znaleźć przystanki w pobliżu i pokazać aktualną pozycję na mapie. Pozostałe funkcje będą działały bez tych uprawnień. Mogą być one w każdym momencie nadane i odebrane w ustawieniach systemowych.</string>
-    <string name="stop_stub_on_demand_in_zone">Przystanek na żądanie w strefie %1$s</string>
-    <string name="stop_stub_on_demand">Przystanek na żądanie</string>
-    <string name="stop_stub_in_zone">Przystanek w strefie %1$s</string>
-    <string name="credits">Font yellowcircle8 (https://git.apiote.xyz/yellowcircle8.git) na podstawie Railway Sans © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n Ikona Mastodona (https://github.com/mastodon/joinmastodon) © Mastodon contributors, AGPL-3.0-or-later\n\n Logo Bimby stworzone przez https://github.com/tebriz159\n\n Material icons © Google, Apache-2.0\n\n Dane mapy © kontrybutorzy OpenStreetMap (https://www.openstreetmap.org/copyright), ODbL-1.0\n\n Lista miast użyta do geokodowania krótkich kodów OLC © Geonames (https://geonames.org), CC BY</string>
-    <string name="title_about">O Bimbie</string>
-    <string name="translation_button_description">link do narzędzia do tłumaczeń</string>
-    <string name="app_description">Wolny i otwarty kompan pasażerów transportu publicznego; rozkład jazdy w twojej kieszeni.</string>
-    <string name="website_button_description">link do strony internetowej</string>
-    <string name="code_button_description">link do kodu źródłowego</string>
-    <string name="mastodon_button_description">link do Mastodona</string>
-    <string name="use_online_feed">Używaj online</string>
-    <string name="information_may_be_outdated">Informacje mogą być nieaktualne</string>
-    <string name="current_timetable_validity">Aktualny rozkład ważny: %1$s do %2$s</string>
-    <string name="error_406">Wersja aplikacji jest niekompatybilna z serwerem</string>
-    <string name="filter_localities">filtruj lokalizacje</string>
-    <string name="error_41">Ta lokalizacja nie jest obsługiwana przez serwer</string>
-    <string name="stop_from_qr_code">Przystanek z kodem QR</string>
-    <string name="title_select_date">Wybierz dzień odjazdów</string>
-    <string name="title_select_line">Wybierz linię</string>
-    <string name="clear_date_selection">Wyczyść</string>
-    <string name="title_filter">Filter</string>
-    <string name="title_filter_byline">Filtrowanie po liniach</string>
-    <string name="title_filter_bytime">Filtrowanie po czasie</string>
-    <string name="title_select_time_start">Wybierz początkowy czas</string>
-    <string name="title_select_time_end">Wybierz końcowy czas</string>
-    <string name="more">Więcej</string>
-    <string name="alert_header">Komunikaty</string>
-    <string name="map_attribution"><![CDATA[© kontrubutorzy <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>]]></string>
-    <string name="distance_in_m">%1$s m</string>
-    <string name="distance_in_km">%1$s km</string>
-    <string name="distance_in_two_units_cd">%1$s i %2$s</string>
-    <string name="distance_in_yd">%1$s yd</string>
-    <string name="distance_in_ft">%1$s ft</string>
-    <string name="distance_in_mi">%1$s mi</string>
-    <string name="distance_in_gf">%1$s %2$sGf</string>
-    <string name="time_in_s">%1$s s</string>
-    <string name="time_in_tm">%1$s %2$sTm</string>
-    <string name="time_in_tm_past">%1$s %2$sTm temu</string>
-    <string name="speed_in_m_per_s">%1$s m/s</string>
-    <string name="speed_in_mi_per_h">%1$s mph</string>
-    <string name="speed_in_vl">%1$s Vl</string>
-    <string name="favourite_content_description">Zapisz do ulubionych</string>
-    <string name="favourite">Ulubiony</string>
-    <string name="filtered">Filtrowany</string>
-    <string name="unfiltered">Niefiltrowany</string>
-    <string name="cannot_save_favourite">Nie udało się zapisać do ulubionych</string>
-    <string name="error_44">Brak odjazdów</string>
-    <string name="loading">ładowanie…</string>
-    <string name="favourite_deleted">Usunięto z ulubionych</string>
-    <string name="undo">Cofnij</string>
-    <string name="units_title">Układ jednostek</string>
-    <string name="units_locale_based">Na podstawie systemu</string>
-    <string name="units_metric">Metryczny (SI)</string>
-    <string name="units_imperial">Brytyjski</string>
-    <string name="units_customary">USA</string>
-    <string name="units_tgm10">TGM (podstawa 10)</string>
-    <string name="units_tgm12">TGM (podstawa 12)</string>
-    <string name="title_settings">Ustawienia</string>
-    <string name="no_geocoding_data">Brak danych do geokodowania</string>
-    <string name="no_geocoding_data_description">Zapytanie zawiera krótki kod OLC, ale brakuje danych geokodowania. Pobierz dane geokodowania lub włącz automatyczne aktualizowanie w ustawieniach.</string>
-    <string name="error_geocoding">Nie znaleziono miasta</string>
-    <string name="cities_channel_name">Kanał aktualizacji miast</string>
-    <string name="cities_channel_description">Powiadomienia pokazujące postęp pobierania danych geokodowania</string>
-    <string name="saving_cities_list">zapisywanie listy miast</string>
-    <string name="updating_geocoding_data">Aktualizowanie danych geokodowania</string>
-    <string name="downloading_cities_list">pobieranie listy miast</string>
-    <string name="finished_updating_geocoding_data">Zakończono aktualizowanie danych geokodowania</string>
-    <string name="updating_geocoding_data_failed">Aktualizowanie danych geokodowania zakończone niepowodzeniem</string>
-    <string name="zero">zero</string>
-    <string name="one">jeden</string>
-    <string name="two">dwa</string>
-    <string name="three">trzy</string>
-    <string name="four">cztery</string>
-    <string name="five">pięć</string>
-    <string name="six">sześć</string>
-    <string name="seven">siedem</string>
-    <string name="eight">osiem</string>
-    <string name="nine">dziewięć</string>
-    <string name="ten">dek</string>
-    <string name="elv">lem</string>
-    <string name="zen">zen</string>
-    <string name="duna">duna</string>
-    <string name="quedra">kwedra</string>
-    <string name="trin">tryn</string>
-    <string name="quen">kwen</string>
-    <string name="hes">hes</string>
-    <string name="sev">sew</string>
-    <string name="ak">ak</string>
-    <string name="neen">nin</string>
-    <string name="dex">deks</string>
-    <string name="lef">lef</string>
-    <string name="filtered_stop_question">Czy chcesz zapisać do ulubionych przefiltrowane wybranymi liniami?</string>
-    <plurals name="distance_in_m_cd">
-        <item quantity="one">%1$d metr</item>
-        <item quantity="few">%1$d metry</item>
-        <item quantity="many">%1$d metrów</item>
-    </plurals>
-    <plurals name="distance_in_km_cd">
-        <item quantity="one">%1$d kilometr</item>
-        <item quantity="few">%1$d kilometry</item>
-        <item quantity="many">%1$d kilometrów</item>
-    </plurals>
-    <plurals name="distance_in_yd_cd">
-        <item quantity="one">%1$d jard</item>
-        <item quantity="few">%1$d jardy</item>
-        <item quantity="many">%1$d jardów</item>
-    </plurals>
-    <plurals name="distance_in_ft_cd">
-        <item quantity="one">%1$d stopa</item>
-        <item quantity="few">%1$d stopy</item>
-        <item quantity="many">%1$d stóp</item>
-    </plurals>
-    <plurals name="distance_in_mi_cd">
-        <item quantity="one">%1$d mila</item>
-        <item quantity="few">%1$d mile</item>
-        <item quantity="many">%1$d mil</item>
-    </plurals>
-    <plurals name="distance_in_gf_cd">
-        <item quantity="one">%1$d grafut</item>
-        <item quantity="few">%1$d grafuty</item>
-        <item quantity="many">%1$d grafutów</item>
-    </plurals>
-    <plurals name="distance_in_3gf_12_cd">
-        <item quantity="one">%1$s trynagrafut</item>
-        <item quantity="few">%1$s trynagrafuty</item>
-        <item quantity="many">%1$s trynagrafutów</item>
-        <item quantity="other">%1$s trynagrafutów</item>
-    </plurals>
-    <plurals name="distance_in_gf_12_cd">
-        <item quantity="one">%1$s grafut</item>
-        <item quantity="few">%1$s grafuty</item>
-        <item quantity="many">%1$s grafutów</item>
-        <item quantity="other">%1$s grafutów</item>
-    </plurals>
-    <plurals name="time_in_s_cd">
-        <item quantity="one">%1$d sekunda</item>
-        <item quantity="few">%1$d sekundy</item>
-        <item quantity="many">%1$d sekund</item>
-    </plurals>
-    <plurals name="time_in_tm_cd">
-        <item quantity="one">%1$d tim</item>
-        <item quantity="few">%1$d timy</item>
-        <item quantity="many">%1$d timów</item>
-    </plurals>
-    <plurals name="time_in_4tm_12_cd">
-        <item quantity="one">%1$s kwedratim</item>
-        <item quantity="few">%1$s quedratimy</item>
-        <item quantity="many">%1$s kwedratimów</item>
-        <item quantity="other">%1$s kwedratimów</item>
-    </plurals>
-    <plurals name="time_in_2tm_12_cd">
-        <item quantity="one">%1$s dunatim</item>
-        <item quantity="few">%1$s dunatimy</item>
-        <item quantity="many">%1$s dunatimów</item>
-        <item quantity="other">%1$s dunatimów</item>
-    </plurals>
-    <plurals name="speed_in_m_per_s_cd">
-        <item quantity="one">%1$d metr na sekundę</item>
-        <item quantity="few">%1$d metry na sekundę</item>
-        <item quantity="many">%1$d metrów na sekundę</item>
-    </plurals>
-    <plurals name="speed_in_km_per_h_cd">
-        <item quantity="one">%1$d kilometr na godzinę</item>
-        <item quantity="few">%1$d kilometry na godzinę</item>
-        <item quantity="many">%1$d kilometrów na godzinę</item>
-    </plurals>
-    <plurals name="speed_in_mi_per_h_cd">
-        <item quantity="one">%1$d mila na godzinę</item>
-        <item quantity="few">%1$d mile na godzinę</item>
-        <item quantity="many">%1$d mil na godzinę</item>
-    </plurals>
-    <plurals name="speed_in_vl_cd">
-        <item quantity="one">%1$d wlos</item>
-        <item quantity="few">%1$d wlosy</item>
-        <item quantity="many">%1$d wlosów</item>
-        <item quantity="other">%1$d wlosów</item>
-    </plurals>
-    <plurals name="speed_in_vl_12_cd">
-        <item quantity="one">%1$s wlos</item>
-        <item quantity="few">%1$s wlosy</item>
-        <item quantity="many">%1$s wlosów</item>
-        <item quantity="other">%1$s wlosów</item>
-    </plurals>
-    <string name="none">brak</string>
-    <string name="italics">kursywa</string>
-    <string name="colour">kolor</string>
-    <string name="line_decorations">Dekoracje nazw linii</string>
-    <string name="acra_notification_channel">Kanał raportowania błędów</string>
-    <string name="acra_notification_channel_description">Powiadomienia pokazujące błędy i pozwalające na wysłanie raportów</string>
-    <string name="acra_notification_title">Bimba się wykoleiła</string>
-    <string name="acra_notification_text">Nieoczekiwana przeszkoda pojawiła się na drodze Bimby. Czy wysłać raport?</string>
-    <string name="send">Wyślij</string>
-    <string name="discard">Pomiń</string>
-    <string name="send_with_comment">Wyślij z komentarzem</string>
-    <string name="acra_notification_comment">Komentarz dodany do raportu</string>
-    <string name="filtered_departures">Filtrowane odjazdy</string>
-    <string name="alerts">Alerty</string>
-    <string name="grey_out">wyszarzone</string>
-    <string name="hide">ukryte</string>
-    <string name="show">widoczne</string>
-    <string name="terminus_arrival_showing">Przyjazdy na pętle</string>
-    <string name="matrix_button_description">link do kanału na Matrixie</string>
-    <string name="email_button_description">link do e-maila</string>
-    <string name="no_email_app">Brak aplikacji e-mail</string>
-    <string name="transitous_attribution">API Transitous (https://transitous.org) dostarczane przez Spline (https://routing.spline.de). Lokalizacje (https://github.com/public-transport/transitous/tree/main/feeds) utrzymywane przez społeczność.</string>
-    <string name="local_time">czas lokalny</string>
+-->
+<resources>
+	<string name="app_name">Bimba</string>
+	<string name="title_home">Dom</string>
+	<string name="title_map">Mapa</string>
+	<string name="title_journey">Podróż</string>
+	<string name="home_fab_description">ikona lokalizacji</string>
+	<string name="search_placeholder">przystanki, linie lub kody OLC</string>
+	<string name="title_activity_results">Wyniki</string>
+	<string name="continue_">Kontynuuj</string>
+	<string name="save">Zapisz</string>
+	<string name="error_400">Aplikacja wykonała niepoprawne żądanie</string>
+	<string name="error_401">Żeton jest wymagany, aby używać tego serwera</string>
+	<string name="error_403">Żeton jest niepoprawny</string>
+	<string name="error_404">Nie znaleziono</string>
+	<string name="error_429">Przekroczono limit prób. Spróbuj ponownie później</string>
+	<string name="error_50x">Błąd serwera. Spróbuj ponownie później</string>
+	<string name="error_unknown">Wystąpił nieznany błąd</string>
+	<string name="error_connecting">Błąd połączenia z serwerem. Spróbuj ponownie później</string>
+	<string name="error_offline">Brak połączenia z Internetem</string>
+	<string name="error_gps">Nie można uzyskać bierzącej pozycji</string>
+	<string name="no_departures">Brak odjazdów</string>
+	<string name="waiting_position">oczekiwanie na pozycję</string>
+	<string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s</annotation></annotation> » <annotation arg="1">%2$s</annotation></string>
+	<string name="vehicle_headsign_content_description">%1$s w kierunku przystanku %2$s</string>
+	<string name="speed_in_km_per_h">%1$s km/h</string>
+	<string name="congestion_unknown">nieznane</string>
+	<string name="congestion_smooth">płynne</string>
+	<string name="congestion_stop_and_go">przestoje</string>
+	<string name="congestion_congestion">korki</string>
+	<string name="congestion_jams">zatory</string>
+	<string name="occupancy_unknown">nieznana</string>
+	<string name="occupancy_empty">pusty</string>
+	<string name="occupancy_many_seats">wiele miejsc</string>
+	<string name="occupancy_few_seats">kilka miejsc</string>
+	<string name="occupancy_standing_only">tylko stojące</string>
+	<string name="occupancy_crowded">zatłoczony</string>
+	<string name="occupancy_full">pełny</string>
+	<string name="occupancy_wont_let">nie wpuszcza</string>
+	<string name="no_map_app">Brak aplikacji map</string>
+	<string name="departure_headsign">» %1$s</string>
+	<string name="departure_headsign_content_description">w kierunku przystanku %1$s</string>
+	<string name="departure_momentarily">za moment</string>
+	<string name="departure_departed">odjechał</string>
+	<string name="departure_now">teraz</string>
+	<string name="time">%1$02d:%2$02d</string>
+	<string name="at_time">o %1$02d:%2$02d</string>
+	<string name="about_time">około %1$02d:%2$02d</string>
+	<string name="at_time_realtime">o %1$02d:%2$02d:%3$02d</string>
+	<string name="on_demand">na żądanie</string>
+	<string name="no_boarding">brak</string>
+	<string name="on_boarding">wsiadanie</string>
+	<string name="off_boarding">wysiadanie</string>
+	<string name="boarding">standard</string>
+	<string name="line_headsign">» %1$s</string>
+	<string name="line_headsign_content_description">w kierunku przystanku %1$s</string>
+	<string name="line_headsigns">%1$s «» %2$s</string>
+	<string name="line_headsigns_content_description">pomiędzy przystankami %1$s i %2$s</string>
+	<string name="stops_nearby">Przystanki w pobliżu</string>
+	<string name="results_for">Wyniki dla „%1$s”</string>
+	<string name="bimba_server_address_hint">Serwer</string>
+	<string name="bimba_server_token_hint">Żeton</string>
+	<string name="realtime_content_description">odjazd w czasie rzeczywistym</string>
+	<string name="schedule_content_description">czas odjazdu jest z rozkładu</string>
+	<string name="wheelchair_content_description">pojazd ma niską podłogę</string>
+	<string name="air_condition_content_description">klimatyzacja</string>
+	<string name="bicycles_allowed_content_description">przewóz rowerów dozwolony</string>
+	<string name="voice_announcements_content_description">komunikaty głosowe</string>
+	<string name="tickets_sold_content_description">możliwość kupienia biletów na pokładzie</string>
+	<string name="usb_charging_content_description">ładowarki USB</string>
+	<string name="show_departures">Pokaż odjazdy</string>
+	<string name="open_in_maps_app">Otwórz w aplikacji map</string>
+	<string name="stop_content_description">przystanek</string>
+	<string name="seatbelts_everyone">Zajmujcie miejsca!</string>
+	<string name="onboarding_question">Jak zaczynamy?</string>
+	<string name="onboarding_simple">Prosto</string>
+	<string name="onboarding_simple_action">wybór lokalizacji</string>
+	<string name="onboarding_advanced">Zaawansowane</string>
+	<string name="onboarding_advanced_action">wybór serwerów</string>
+	<string name="cancel">Anuluj</string>
+	<string name="error">Błąd</string>
+	<string name="rate_limit">Limit żądań</string>
+	<string name="server_rate_limited_question">Nie podano żetona, a serwer limituje żądania. Czy chcesz kontynuować?</string>
+	<string name="server_private_question">Nie podano żetona, a serwer jest prywatny</string>
+	<string name="last_update">Ostatnia aktualizacja: %1$s</string>
+	<string name="title_feeds">Rozkłady</string>
+	<string name="title_servers">Serwery</string>
+	<string name="title_cities">Lokalizacje</string>
+	<string name="error_url">Podano błędny URL</string>
+	<string name="error_traffic_spec">Nie można zweryfikować serwera</string>
+	<string name="stops_near_code">Przystanki w pobliżu %1$s</string>
+	<string name="choose_server">Wybierz rodzaj serwera</string>
+	<string name="ok">OK</string>
+	<string name="no_location_access">Brak uprawnień do lokalizacji</string>
+	<string name="no_location_message">Uprawnienia do używania lokalizacji są wymagane, aby znaleźć przystanki w pobliżu i pokazać aktualną pozycję na mapie. Pozostałe funkcje będą działały bez tych uprawnień. Mogą być one w każdym momencie nadane i odebrane w ustawieniach systemowych.</string>
+	<string name="stop_stub_on_demand_in_zone">Przystanek na żądanie w strefie %1$s</string>
+	<string name="stop_stub_on_demand">Przystanek na żądanie</string>
+	<string name="stop_stub_in_zone">Przystanek w strefie %1$s</string>
+	<string name="credits">Font yellowcircle8 (https://git.apiote.xyz/yellowcircle8.git) na podstawie Railway Sans © Greg Fleming, OFL-1.1 https://github.com/davelab6/Railway-Sans\n\n Ikona Mastodona (https://github.com/mastodon/joinmastodon) © Mastodon contributors, AGPL-3.0-or-later\n\n Logo Bimby stworzone przez https://github.com/tebriz159\n\n Material icons © Google, Apache-2.0\n\n Dane mapy © kontrybutorzy OpenStreetMap (https://www.openstreetmap.org/copyright), ODbL-1.0\n\n Lista miast użyta do geokodowania krótkich kodów OLC © Geonames (https://geonames.org), CC BY</string>
+	<string name="title_about">O Bimbie</string>
+	<string name="translation_button_description">link do narzędzia do tłumaczeń</string>
+	<string name="app_description">Wolny i otwarty kompan pasażerów transportu publicznego; rozkład jazdy w twojej kieszeni.</string>
+	<string name="website_button_description">link do strony internetowej</string>
+	<string name="code_button_description">link do kodu źródłowego</string>
+	<string name="mastodon_button_description">link do Mastodona</string>
+	<string name="use_online_feed">Używaj online</string>
+	<string name="information_may_be_outdated">Informacje mogą być nieaktualne</string>
+	<string name="current_timetable_validity">Aktualny rozkład ważny: %1$s do %2$s</string>
+	<string name="error_406">Wersja aplikacji jest niekompatybilna z serwerem</string>
+	<string name="filter_localities">filtruj lokalizacje</string>
+	<string name="error_41">Ta lokalizacja nie jest obsługiwana przez serwer</string>
+	<string name="stop_from_qr_code">Przystanek z kodem QR</string>
+	<string name="title_select_date">Wybierz dzień odjazdów</string>
+	<string name="title_select_line">Wybierz linię</string>
+	<string name="clear_date_selection">Wyczyść</string>
+	<string name="title_filter">Filter</string>
+	<string name="title_filter_byline">Filtrowanie po liniach</string>
+	<string name="title_filter_bytime">Filtrowanie po czasie</string>
+	<string name="title_select_time_start">Wybierz początkowy czas</string>
+	<string name="title_select_time_end">Wybierz końcowy czas</string>
+	<string name="more">Więcej</string>
+	<string name="alert_header">Komunikaty</string>
+	<string name="map_attribution"><![CDATA[© kontrubutorzy <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>]]></string>
+	<string name="distance_in_m">%1$s m</string>
+	<string name="distance_in_km">%1$s km</string>
+	<string name="distance_in_two_units_cd">%1$s i %2$s</string>
+	<string name="distance_in_yd">%1$s yd</string>
+	<string name="distance_in_ft">%1$s ft</string>
+	<string name="distance_in_mi">%1$s mi</string>
+	<string name="distance_in_gf">%1$s %2$sGf</string>
+	<string name="time_in_s">%1$s s</string>
+	<string name="time_in_tm">%1$s %2$sTm</string>
+	<string name="time_in_tm_past">%1$s %2$sTm temu</string>
+	<string name="speed_in_m_per_s">%1$s m/s</string>
+	<string name="speed_in_mi_per_h">%1$s mph</string>
+	<string name="speed_in_vl">%1$s Vl</string>
+	<string name="favourite_content_description">Zapisz do ulubionych</string>
+	<string name="favourite">Ulubiony</string>
+	<string name="filtered">Filtrowany</string>
+	<string name="unfiltered">Niefiltrowany</string>
+	<string name="cannot_save_favourite">Nie udało się zapisać do ulubionych</string>
+	<string name="error_44">Brak odjazdów</string>
+	<string name="loading">ładowanie…</string>
+	<string name="favourite_deleted">Usunięto z ulubionych</string>
+	<string name="undo">Cofnij</string>
+	<string name="units_title">Układ jednostek</string>
+	<string name="units_locale_based">Na podstawie systemu</string>
+	<string name="units_metric">Metryczny (SI)</string>
+	<string name="units_imperial">Brytyjski</string>
+	<string name="units_customary">USA</string>
+	<string name="units_tgm10">TGM (podstawa 10)</string>
+	<string name="units_tgm12">TGM (podstawa 12)</string>
+	<string name="title_settings">Ustawienia</string>
+	<string name="no_geocoding_data">Brak danych do geokodowania</string>
+	<string name="no_geocoding_data_description">Zapytanie zawiera krótki kod OLC, ale brakuje danych geokodowania. Pobierz dane geokodowania lub włącz automatyczne aktualizowanie w ustawieniach.</string>
+	<string name="error_geocoding">Nie znaleziono miasta</string>
+	<string name="cities_channel_name">Kanał aktualizacji miast</string>
+	<string name="cities_channel_description">Powiadomienia pokazujące postęp pobierania danych geokodowania</string>
+	<string name="saving_cities_list">zapisywanie listy miast</string>
+	<string name="updating_geocoding_data">Aktualizowanie danych geokodowania</string>
+	<string name="downloading_cities_list">pobieranie listy miast</string>
+	<string name="finished_updating_geocoding_data">Zakończono aktualizowanie danych geokodowania</string>
+	<string name="updating_geocoding_data_failed">Aktualizowanie danych geokodowania zakończone niepowodzeniem</string>
+	<string name="zero">zero</string>
+	<string name="one">jeden</string>
+	<string name="two">dwa</string>
+	<string name="three">trzy</string>
+	<string name="four">cztery</string>
+	<string name="five">pięć</string>
+	<string name="six">sześć</string>
+	<string name="seven">siedem</string>
+	<string name="eight">osiem</string>
+	<string name="nine">dziewięć</string>
+	<string name="ten">dek</string>
+	<string name="elv">lem</string>
+	<string name="zen">zen</string>
+	<string name="duna">duna</string>
+	<string name="quedra">kwedra</string>
+	<string name="trin">tryn</string>
+	<string name="quen">kwen</string>
+	<string name="hes">hes</string>
+	<string name="sev">sew</string>
+	<string name="ak">ak</string>
+	<string name="neen">nin</string>
+	<string name="dex">deks</string>
+	<string name="lef">lef</string>
+	<string name="filtered_stop_question">Czy chcesz zapisać do ulubionych przefiltrowane wybranymi liniami?</string>
+	<plurals name="distance_in_m_cd">
+		<item quantity="one">%1$d metr</item>
+		<item quantity="few">%1$d metry</item>
+		<item quantity="many">%1$d metrów</item>
+	</plurals>
+	<plurals name="distance_in_km_cd">
+		<item quantity="one">%1$d kilometr</item>
+		<item quantity="few">%1$d kilometry</item>
+		<item quantity="many">%1$d kilometrów</item>
+	</plurals>
+	<plurals name="distance_in_yd_cd">
+		<item quantity="one">%1$d jard</item>
+		<item quantity="few">%1$d jardy</item>
+		<item quantity="many">%1$d jardów</item>
+	</plurals>
+	<plurals name="distance_in_ft_cd">
+		<item quantity="one">%1$d stopa</item>
+		<item quantity="few">%1$d stopy</item>
+		<item quantity="many">%1$d stóp</item>
+	</plurals>
+	<plurals name="distance_in_mi_cd">
+		<item quantity="one">%1$d mila</item>
+		<item quantity="few">%1$d mile</item>
+		<item quantity="many">%1$d mil</item>
+	</plurals>
+	<plurals name="distance_in_gf_cd">
+		<item quantity="one">%1$d grafut</item>
+		<item quantity="few">%1$d grafuty</item>
+		<item quantity="many">%1$d grafutów</item>
+	</plurals>
+	<plurals name="distance_in_3gf_12_cd">
+		<item quantity="one">%1$s trynagrafut</item>
+		<item quantity="few">%1$s trynagrafuty</item>
+		<item quantity="many">%1$s trynagrafutów</item>
+		<item quantity="other">%1$s trynagrafutów</item>
+	</plurals>
+	<plurals name="distance_in_gf_12_cd">
+		<item quantity="one">%1$s grafut</item>
+		<item quantity="few">%1$s grafuty</item>
+		<item quantity="many">%1$s grafutów</item>
+		<item quantity="other">%1$s grafutów</item>
+	</plurals>
+	<plurals name="time_in_s_cd">
+		<item quantity="one">%1$d sekunda</item>
+		<item quantity="few">%1$d sekundy</item>
+		<item quantity="many">%1$d sekund</item>
+	</plurals>
+	<plurals name="time_in_tm_cd">
+		<item quantity="one">%1$d tim</item>
+		<item quantity="few">%1$d timy</item>
+		<item quantity="many">%1$d timów</item>
+	</plurals>
+	<plurals name="time_in_4tm_12_cd">
+		<item quantity="one">%1$s kwedratim</item>
+		<item quantity="few">%1$s quedratimy</item>
+		<item quantity="many">%1$s kwedratimów</item>
+		<item quantity="other">%1$s kwedratimów</item>
+	</plurals>
+	<plurals name="time_in_2tm_12_cd">
+		<item quantity="one">%1$s dunatim</item>
+		<item quantity="few">%1$s dunatimy</item>
+		<item quantity="many">%1$s dunatimów</item>
+		<item quantity="other">%1$s dunatimów</item>
+	</plurals>
+	<plurals name="speed_in_m_per_s_cd">
+		<item quantity="one">%1$d metr na sekundę</item>
+		<item quantity="few">%1$d metry na sekundę</item>
+		<item quantity="many">%1$d metrów na sekundę</item>
+	</plurals>
+	<plurals name="speed_in_km_per_h_cd">
+		<item quantity="one">%1$d kilometr na godzinę</item>
+		<item quantity="few">%1$d kilometry na godzinę</item>
+		<item quantity="many">%1$d kilometrów na godzinę</item>
+	</plurals>
+	<plurals name="speed_in_mi_per_h_cd">
+		<item quantity="one">%1$d mila na godzinę</item>
+		<item quantity="few">%1$d mile na godzinę</item>
+		<item quantity="many">%1$d mil na godzinę</item>
+	</plurals>
+	<plurals name="speed_in_vl_cd">
+		<item quantity="one">%1$d wlos</item>
+		<item quantity="few">%1$d wlosy</item>
+		<item quantity="many">%1$d wlosów</item>
+		<item quantity="other">%1$d wlosów</item>
+	</plurals>
+	<plurals name="speed_in_vl_12_cd">
+		<item quantity="one">%1$s wlos</item>
+		<item quantity="few">%1$s wlosy</item>
+		<item quantity="many">%1$s wlosów</item>
+		<item quantity="other">%1$s wlosów</item>
+	</plurals>
+	<string name="none">brak</string>
+	<string name="italics">kursywa</string>
+	<string name="colour">kolor</string>
+	<string name="line_decorations">Dekoracje nazw linii</string>
+	<string name="acra_notification_channel">Kanał raportowania błędów</string>
+	<string name="acra_notification_channel_description">Powiadomienia pokazujące błędy i pozwalające na wysłanie raportów</string>
+	<string name="acra_notification_title">Bimba się wykoleiła</string>
+	<string name="acra_notification_text">Nieoczekiwana przeszkoda pojawiła się na drodze Bimby. Czy wysłać raport?</string>
+	<string name="send">Wyślij</string>
+	<string name="discard">Pomiń</string>
+	<string name="send_with_comment">Wyślij z komentarzem</string>
+	<string name="acra_notification_comment">Komentarz dodany do raportu</string>
+	<string name="filtered_departures">Filtrowane odjazdy</string>
+	<string name="alerts">Alerty</string>
+	<string name="grey_out">wyszarzone</string>
+	<string name="hide">ukryte</string>
+	<string name="show">widoczne</string>
+	<string name="terminus_arrival_showing">Przyjazdy na pętle</string>
+	<string name="matrix_button_description">link do kanału na Matrixie</string>
+	<string name="email_button_description">link do e-maila</string>
+	<string name="no_email_app">Brak aplikacji e-mail</string>
+	<string name="transitous_description">Międzynarodowy serwis planowania podróży w transporcie publicznym niezależny od operatorów i organizowany przez społeczność. Pokrycie dostępne na https://transitous.org/sources/</string>
+	<string name="transitous_attribution">API Transitous (https://transitous.org) dostarczane przez Spline (https://routing.spline.de). Lokalizacje (https://github.com/public-transport/transitous/tree/main/feeds) utrzymywane przez społeczność.</string>
+	<string name="local_time">czas lokalny</string>
 	<string name="arrow">strzałka wskazująca kierunek do przystanku</string>
-    <string name="departure_arrived">przyjechał</string>
-    <string name="arrival_approximate">przyb. przyj.</string>
-    <string name="arrival">przyjazd</string>
-    <string name="departure_approximate">przyb. odj.</string>
-    <string name="departure">odjazd</string>
-    <string name="approximately">w przybliżeniu</string>
+	<string name="departure_arrived">przyjechał</string>
+	<string name="arrival_approximate">przyb. przyj.</string>
+	<string name="arrival">przyjazd</string>
+	<string name="departure_approximate">przyb. odj.</string>
+	<string name="departure">odjazd</string>
+	<string name="approximately">w przybliżeniu</string>
+	<string name="destination_input_hint">Cel</string>
+	<string name="depart_after">Odjazd po</string>
+	<string name="no_journeys_found">Nie znaleziono połączeń</string>
+	<string name="title_select_date_journey">Wybierz datę podróży</string>
+	<string name="title_select_time_journey">Wybierz czas podróży</string>
+	<string name="other_options">Inne opcje</string>
+	<string name="journey_stops_headsign">%1$s (» %2$s)</string>
+	<string name="origin_input_hint">Początek</string>
+	<string name="arrive_by">Przyjazd przed</string>
+	<string name="today">Dziś</string>
+	<string name="now">Teraz</string>
+	<string name="wheelchair_accessible">Dostępność</string>
+	<string name="bike_transport">Transport rowerów</string>
+	<string name="go">Ruszaj</string>
+	<string name="beginning_of_journey_s_leg">początek odcinka podróży</string>
+	<string name="end_of_journey_s_leg">koniec odcinka podróży</string>
+	<string name="use_as_origin">Użyj jako początek</string>
+	<string name="use_as_destination">Użyj jako cel</string>
+	<string name="here">tutaj</string>
 </resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f99be409f6d0bdeb9d8d90283ab609164420979d
--- /dev/null
+++ b/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Adam Evyčędo and contributors using Weblate
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<resources>
+	<string name="error_offline">Вы находитесь вне сети. Подключитесь к Интернету</string>
+	<string name="error_429">Превышен лимит запросов. Попробуйте снова позже.</string>
+	<string name="title_journey">Путешествие</string>
+	<string name="title_map">Карта</string>
+	<string name="error_404">Не найдено</string>
+	<string name="continue_">Продолжить</string>
+	<string name="save">Сохранить</string>
+	<string name="error_50x">Произошла ошибка на сервере. Попробуйте снова позже.</string>
+	<string name="error_unknown">Произошла неизвестная ошибка</string>
+	<string name="error_gps">Невозможно получить текущее местоположение</string>
+	<string name="title_home">Дом</string>
+	<string name="home_fab_description">Значок GPS</string>
+	<string name="title_activity_results">Результаты</string>
+	<string name="app_name">Bimba</string>
+	<string name="error_connecting">Ошибка подключения к серверу. Попробуйте снова позже.</string>
+	<string name="distance_in_mi">%1$s mi</string>
+	<plurals name="distance_in_m_cd">
+		<item quantity="one">%1$d метр</item>
+		<item quantity="few">%1$d метра</item>
+		<item quantity="many">%1$d метров</item>
+		<item quantity="other">%1$d метров</item>
+	</plurals>
+	<plurals name="distance_in_gf_cd">
+		<item quantity="one">%1$d графут</item>
+		<item quantity="few">%1$d графуты</item>
+		<item quantity="many">%1$d графутов</item>
+		<item quantity="other">%1$d графутов</item>
+	</plurals>
+	<plurals name="distance_in_yd_cd">
+		<item quantity="one">%1$d ярд</item>
+		<item quantity="few">%1$d ярда</item>
+		<item quantity="many">%1$d ярдов</item>
+		<item quantity="other">%1$d ярдов</item>
+	</plurals>
+	<plurals name="time_in_4tm_12_cd">
+		<item quantity="one">%1$s кедратим</item>
+		<item quantity="few">%1$s кедратимы</item>
+		<item quantity="many">%1$s кедратимов</item>
+		<item quantity="other">%1$s кедратимов</item>
+	</plurals>
+	<plurals name="time_in_2tm_12_cd">
+		<item quantity="one">%1$s дунатим</item>
+		<item quantity="few">%1$s дунатимы</item>
+		<item quantity="many">%1$s дунатимов</item>
+		<item quantity="other">%1$s дунатимов</item>
+	</plurals>
+	<string name="time_in_tm">%1$s %2$sТм</string>
+	<plurals name="speed_in_m_per_s_cd">
+		<item quantity="one">%1$d метр в секунду</item>
+		<item quantity="few">%1$d метра в секунду</item>
+		<item quantity="many">%1$d метров в секунду</item>
+		<item quantity="other">%1$d метров в секунду</item>
+	</plurals>
+	<string name="distance_in_m">%1$s м</string>
+	<string name="distance_in_km">%1$s км</string>
+	<plurals name="distance_in_km_cd">
+		<item quantity="one">%1$d километр</item>
+		<item quantity="few">%1$d километра</item>
+		<item quantity="many">%1$d километров</item>
+		<item quantity="other">%1$d километров</item>
+	</plurals>
+	<string name="distance_in_two_units_cd">%1$s и %2$s</string>
+	<string name="distance_in_yd">%1$s ярд</string>
+	<string name="distance_in_ft">%1$s фут</string>
+	<plurals name="distance_in_ft_cd">
+		<item quantity="one">%1$d фут</item>
+		<item quantity="few">%1$d фута</item>
+		<item quantity="many">%1$d футов</item>
+		<item quantity="other">%1$d футов</item>
+	</plurals>
+	<plurals name="distance_in_mi_cd">
+		<item quantity="one">%1$d миля</item>
+		<item quantity="few">%1$d мили</item>
+		<item quantity="many">%1$d миль</item>
+		<item quantity="other">%1$d миль</item>
+	</plurals>
+	<string name="distance_in_gf">%1$s %2$sГф</string>
+	<plurals name="distance_in_3gf_12_cd">
+		<item quantity="one">%1$s тринаграфут</item>
+		<item quantity="few">%1$s тринаграфы</item>
+		<item quantity="many">%1$s тринаграфутов</item>
+		<item quantity="other">%1$s тринаграфутов</item>
+	</plurals>
+	<plurals name="distance_in_gf_12_cd">
+		<item quantity="one">%1$s графут</item>
+		<item quantity="few">%1$s графуты</item>
+		<item quantity="many">%1$s графутов</item>
+		<item quantity="other">%1$s графутов</item>
+	</plurals>
+	<string name="time_in_s">%1$s с</string>
+	<plurals name="time_in_s_cd">
+		<item quantity="one">%1$d секунда</item>
+		<item quantity="few">%1$d секунды</item>
+		<item quantity="many">%1$d секунд</item>
+		<item quantity="other">%1$d секунд</item>
+	</plurals>
+	<string name="time_in_tm_past">%1$s %2$sТм назад</string>
+	<plurals name="time_in_tm_cd">
+		<item quantity="one">%1$d тайм</item>
+		<item quantity="few">%1$d тайма</item>
+		<item quantity="many">%1$d таймов</item>
+		<item quantity="other">%1$d таймов</item>
+	</plurals>
+	<string name="speed_in_km_per_h">%1$s км/ч</string>
+	<string name="speed_in_m_per_s">%1$s м/с</string>
+	<string name="speed_in_mi_per_h">%1$s миль/ч</string>
+	<string name="speed_in_vl">%1$s Вл</string>
+	<plurals name="speed_in_km_per_h_cd">
+		<item quantity="one">%1$d километр в час</item>
+		<item quantity="few">%1$d километра в час</item>
+		<item quantity="many">%1$d километров в час</item>
+		<item quantity="other">%1$d километров в час</item>
+	</plurals>
+	<plurals name="speed_in_mi_per_h_cd">
+		<item quantity="one">%1$d миля в час</item>
+		<item quantity="few">%1$d мили в час</item>
+		<item quantity="many">%1$d миль в час</item>
+		<item quantity="other">%1$d миль в час</item>
+	</plurals>
+	<string name="stop_stub_on_demand_in_zone">Остановка по требованию в зоне %1$s</string>
+	<string name="stop_stub_in_zone">Остановка в зоне %1$s</string>
+	<string name="title_filter_bytime">Фильтр по времени</string>
+	<string name="credits">Шрифт yellowcircle8 (https://git.apiote.xyz/yellowcircle8.git) основан на Railway Sans © Greg Fleming, OFL-1.1 (https://github.com/davelab6/Railway-Sans).\n\nЗначки Mastodon (https://github.com/mastodon/joinmastodon) © участники Mastodon, AGPL-3.0-or-later.\n\nЛоготип Bimba создан пользователем https://github.com/tebriz159.\n\nЗначки Material © Google, лицензия Apache-2.0.\n\nКартографические данные © OpenStreetMap от участников (https://www.openstreetmap.org/copyright), ODbL-1.0.\n\nСписок городов, используемый для геокодирования коротких плюс-кодов © Geonames (https://geonames.org), CC BY.\n\nЛоготип Matrix ™/® Matrix.org.</string>
+	<string name="map_attribution"><![CDATA[© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> от участников]]></string>
+	<string name="error_44">Больше никаких отправлений</string>
+	<string name="units_tgm10">TGM (в десятичной системе)</string>
+	<string name="title_settings">Настройки</string>
+	<string name="no_geocoding_data_description">Запрос содержит короткий код плюс, но геокодирующие данные отсутствуют. Загрузите геокодирующие данные или включите автоматическое обновление в настройках.</string>
+	<string name="line_decorations">Украшения с названием линии</string>
+	<string name="eight">восемь</string>
+	<string name="ten">десять</string>
+	<string name="acra_notification_channel_description">Уведомления о сбоях и возможность отправки отчетов о сбоях</string>
+	<string name="last_update">Последнее обновление: %1$s</string>
+	<string name="title_feeds">Расписания</string>
+	<string name="title_servers">Серверы</string>
+	<string name="title_cities">Населенные пункты</string>
+	<string name="error_url">Введенный сетевой адрес неверен</string>
+	<string name="error_traffic_spec">Невозможно проверить сервер</string>
+	<string name="stops_near_code">Остановился возле %1$s</string>
+	<string name="choose_server">Выберите тип сервера</string>
+	<string name="ok">ОК</string>
+	<string name="no_location_access">Доступ к местоположению не предоставлен</string>
+	<string name="no_location_message">Разрешение на использование местоположения необходимо для поиска ближайших остановок и отображения текущего положения на карте. Другие функции будут работать без него. Его можно включить и выключить в системных настройках в любое время.</string>
+	<string name="stop_stub_on_demand">Остановка по требованию</string>
+	<string name="departure_headsign">» %1$s</string>
+	<string name="title_about">О приложении</string>
+	<string name="translation_button_description">Ссылка на сервис перевода</string>
+	<string name="app_description">FLOSS — компаньон пассажира общественного транспорта; расписание в вашем кармане.</string>
+	<string name="website_button_description">Ссылка на веб-сайт</string>
+	<string name="code_button_description">Ссылка на исходный код</string>
+	<string name="mastodon_button_description">Ссылка на Mastodon</string>
+	<string name="use_online_feed">Использовать сетевую рассылку</string>
+	<string name="information_may_be_outdated">Информация может быть устаревшей</string>
+	<string name="current_timetable_validity">Текущее расписание действует: с %1$s до %2$s</string>
+	<string name="error_406">Версия приложения несовместима с сервером</string>
+	<string name="error_41">Это местоположение не поддерживается сервером</string>
+	<string name="stop_from_qr_code">QR-код остановки</string>
+	<string name="title_select_date">Выберите день отправления</string>
+	<string name="title_select_line">Выберите линию</string>
+	<string name="clear_date_selection">Очистить</string>
+	<string name="title_filter">Фильтр</string>
+	<string name="title_filter_byline">Фильтр по линии</string>
+	<string name="title_select_time_start">Выберите время начала</string>
+	<string name="title_select_time_end">Выберите время окончания</string>
+	<string name="more">Подробнее</string>
+	<string name="alert_header">Актуальные сведения</string>
+	<string name="favourite_content_description">Сохранить как избранное</string>
+	<string name="favourite">Избранное</string>
+	<string name="filtered">Отфильтровано</string>
+	<string name="unfiltered">Не отфильтровано</string>
+	<string name="cannot_save_favourite">Не удалось сохранить в избранное</string>
+	<string name="loading">Загрузка…</string>
+	<string name="favourite_deleted">Избранное удалено</string>
+	<string name="undo">Отменить</string>
+	<string name="units_title">Единая система</string>
+	<string name="units_customary">Единицы измерения в США</string>
+	<string name="units_tgm12">TGM (в двенадцатеричной системе)</string>
+	<string name="error_geocoding">Город не найден</string>
+	<string name="cities_channel_name">Канал обновления городов</string>
+	<string name="saving_cities_list">Сохранение списка городов</string>
+	<string name="updating_geocoding_data">Актуализация геокодирующих данных</string>
+	<string name="finished_updating_geocoding_data">Завершено актуализация геокодирующих данных</string>
+	<string name="updating_geocoding_data_failed">Актуализация данных геокодирования не удалось</string>
+	<string name="zero">ноль</string>
+	<string name="one">один</string>
+	<string name="two">два</string>
+	<string name="three">три</string>
+	<string name="four">четыре</string>
+	<string name="five">пять</string>
+	<string name="six">шесть</string>
+	<string name="seven">семь</string>
+	<string name="nine">девять</string>
+	<string name="elv">одиннадцать</string>
+	<string name="duna">дюна</string>
+	<string name="quedra">кведра</string>
+	<string name="filtered_stop_question">Вы хотите сохранить избранный фильтр с выбранными строками?</string>
+	<string name="none">нет</string>
+	<string name="italics">курсив</string>
+	<string name="colour">цвет</string>
+	<string name="acra_notification_channel">Канал сообщений о ДТП</string>
+	<string name="acra_notification_title">Bimba вышел из строя</string>
+</resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..994dc0d2f7d8a96eaf40dfcfd6330d578d06ec3d
--- /dev/null
+++ b/app/src/main/res/values-ta/strings.xml
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Adam Evyčędo and contributors using Weblate
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<resources>
+	<plurals name="distance_in_yd_cd">
+		<item quantity="one">%1$d முற்றத்தில்</item>
+		<item quantity="other">%1$d கெசம்</item>
+	</plurals>
+	<string name="distance_in_ft">%1$s அடி</string>
+	<string name="departure_momentarily">சிறிது நேரத்தில்</string>
+	<string name="voice_announcements_content_description">குரல் அறிவிப்புகள்</string>
+	<string name="tickets_sold_content_description">டிக்கெட்டுகள் போர்டில் விற்கப்படுகின்றன</string>
+	<string name="usb_charging_content_description">யூ.எச்.பி சார்சிங்</string>
+	<string name="error_geocoding">நகரம் கண்டுபிடிக்கப்படவில்லை</string>
+	<string name="zero">சுழிமம்</string>
+	<string name="hide">மறை</string>
+	<string name="terminus_arrival_showing">டெர்மினச் வருகை</string>
+	<string name="matrix_button_description">மேட்ரிக்ச் சேனலுக்கான இணைப்பு</string>
+	<string name="email_button_description">மின்னஞ்சலுக்கான இணைப்பு</string>
+	<string name="departure_approximate">தோராயமாக. டெப்.</string>
+	<string name="app_name">பெண்</string>
+	<string name="title_home">வீடு</string>
+	<string name="title_map">வரைபடம்</string>
+	<string name="title_journey">பயணம்</string>
+	<string name="home_fab_description">சி.பி.எச் படவுரு</string>
+	<string name="search_placeholder">நிறுத்தங்கள், கோடுகள் அல்லது பிளச் குறியீடுகள்</string>
+	<string name="title_activity_results">முடிவுகள்</string>
+	<string name="continue_">தொடரவும்</string>
+	<string name="save">சேமி</string>
+	<string name="error_400">விண்ணப்பம் ஒரு தவறான கோரிக்கையை ஏற்படுத்தியது</string>
+	<string name="error_401">இந்த சேவையகத்தைப் பயன்படுத்த ஒரு கிள்ளாக்கு தேவை</string>
+	<string name="error_403">நீங்கள் வழங்கிய கிள்ளாக்கு தவறானது</string>
+	<string name="error_404">கண்டுபிடிக்கப்படவில்லை</string>
+	<string name="error_429">விகித வரம்பு மீறியது. பின்னர் மீண்டும் முயற்சிக்கவும்</string>
+	<string name="error_50x">சேவையகத்தில் பிழை ஏற்பட்டது. பின்னர் மீண்டும் முயற்சிக்கவும்</string>
+	<string name="error_unknown">தெரியாத பிழை நடந்தது</string>
+	<string name="error_connecting">சேவையகத்துடன் இணைப்பதில் பிழை. பின்னர் மீண்டும் முயற்சிக்கவும்</string>
+	<string name="error_offline">நீங்கள் ஆஃப்லைனில் இருக்கிறீர்கள். இணையத்துடன் இணைக்கவும்</string>
+	<string name="error_gps">தற்போதைய இருப்பிடத்தைப் பெற முடியாது</string>
+	<string name="no_departures">புறப்படுவதில்லை</string>
+	<string name="waiting_position">பதவிக்காக காத்திருக்கிறது</string>
+	<string name="distance_in_m">%1$s மீ</string>
+	<string name="distance_in_two_units_cd">%1$s மற்றும் %2$s</string>
+	<string name="distance_in_yd">%1$s yd</string>
+	<plurals name="distance_in_ft_cd">
+		<item quantity="one">%1$d கால்</item>
+		<item quantity="other">%1$d அடி</item>
+	</plurals>
+	<string name="distance_in_mi">%1$s மை</string>
+	<string name="distance_in_km">%1$s கி.மீ</string>
+	<plurals name="distance_in_km_cd">
+		<item quantity="one">%1$d கிலோமீட்டர்</item>
+		<item quantity="other">%1$d கிலோமீட்டர்கள்</item>
+	</plurals>
+	<plurals name="distance_in_mi_cd">
+		<item quantity="one">%1$d மைல்</item>
+		<item quantity="other">%1$d மைல்கள்</item>
+	</plurals>
+	<plurals name="distance_in_gf_cd">
+		<item quantity="one">% 1 $ டி கிராஃபட்</item>
+		<item quantity="other">%1$d கிராபிக்ச்</item>
+	</plurals>
+	<plurals name="distance_in_gf_12_cd">
+		<item quantity="one">% 1 $ s கிராஃபட்</item>
+		<item quantity="other">%1$s கிராபிக்ச்</item>
+	</plurals>
+	<string name="time_in_s">%1$s கள்</string>
+	<plurals name="time_in_s_cd">
+		<item quantity="one">%1$d இரண்டாவது</item>
+		<item quantity="other">%1$d வினாடிகள்</item>
+	</plurals>
+	<string name="time_in_tm">%1$s %2$sTM</string>
+	<string name="time_in_tm_past">%1$s %2$stm ago</string>
+	<plurals name="time_in_tm_cd">
+		<item quantity="one">%1$d டிம்</item>
+		<item quantity="other">%1$d டைம்ச்</item>
+	</plurals>
+	<plurals name="time_in_4tm_12_cd">
+		<item quantity="one">%1$s க்வெட்ராடிம்</item>
+		<item quantity="other">%1$s க்வெட்ராடிங்கள்</item>
+	</plurals>
+	<plurals name="time_in_2tm_12_cd">
+		<item quantity="one">%1$s டுனாடிம்</item>
+		<item quantity="other">%1$s டுனாடிங்கள்</item>
+	</plurals>
+	<string name="speed_in_km_per_h">%1$s கிமீ/ம</string>
+	<string name="speed_in_m_per_s">%1$s m/s</string>
+	<string name="speed_in_mi_per_h">%1$s mph</string>
+	<string name="speed_in_vl">%1$s Vl</string>
+	<plurals name="speed_in_m_per_s_cd">
+		<item quantity="one">நொடிக்கு %1$d மீட்டர்</item>
+		<item quantity="other">ஒரு நொடிக்கு %1$d மீட்டர்கள்</item>
+	</plurals>
+	<string name="congestion_unknown">தெரியவில்லை</string>
+	<string name="congestion_smooth">மென்மையான</string>
+	<string name="congestion_stop_and_go">நிறுத்தி செல்லுங்கள்</string>
+	<string name="congestion_congestion">நெரிசல்</string>
+	<string name="congestion_jams">நெரிசல்கள்</string>
+	<plurals name="speed_in_vl_cd">
+		<item quantity="one">%1$d விஎல்ஓஎச்</item>
+		<item quantity="other">%1$d விஎல்ஓஎச்கள்</item>
+	</plurals>
+	<plurals name="speed_in_vl_12_cd">
+		<item quantity="one">%1$s விஎல்ஓஎச்</item>
+		<item quantity="other">%1$s விஎல்ஓஎச்கள்</item>
+	</plurals>
+	<string name="occupancy_unknown">தெரியவில்லை</string>
+	<string name="occupancy_empty">காலி</string>
+	<string name="occupancy_many_seats">பல இருக்கைகள்</string>
+	<string name="occupancy_few_seats">சில இருக்கைகள்</string>
+	<string name="occupancy_standing_only">மட்டும் நிற்கிறது</string>
+	<string name="occupancy_crowded">நெரிசலான</string>
+	<string name="occupancy_full">முழு</string>
+	<string name="occupancy_wont_let">உள்ளே விடமாட்டேன்</string>
+	<string name="no_map_app">வரைபட பயன்பாடு எதுவும் நிறுவப்படவில்லை</string>
+	<string name="no_email_app">மின்னஞ்சல் பயன்பாடு எதுவும் நிறுவப்படவில்லை</string>
+	<string name="departure_headsign_content_description">%1$s நோக்கி</string>
+	<string name="departure_departed">புறப்பட்டார்</string>
+	<string name="departure_now">இப்போது</string>
+	<string name="on_demand">தேவைக்கேற்ப</string>
+	<string name="no_boarding">போர்டிங் இல்லை</string>
+	<string name="about_time">சுமார் %1$02d:%2$02d</string>
+	<string name="at_time_realtime">%1$02d:%2$02d:%3$02d மணிக்கு</string>
+	<string name="on_boarding">ஆன்-போர்டிங்</string>
+	<string name="off_boarding">ஆஃப்-போர்டிங்</string>
+	<string name="boarding">போர்டில் முடியும்</string>
+	<string name="line_headsign">» %1$s</string>
+	<string name="line_headsign_content_description">%1$s நோக்கி</string>
+	<string name="line_headsigns">%1$s «» %2$s</string>
+	<string name="line_headsigns_content_description">%1$s மற்றும் %2$s க்கு இடையில்</string>
+	<string name="stops_nearby">அருகிலேயே நிறுத்தப்படும்</string>
+	<string name="results_for">‘%1$s’ க்கான முடிவுகள்</string>
+	<string name="bimba_server_address_hint">சேவையகம்</string>
+	<string name="bimba_server_token_hint">கிள்ளாக்கு</string>
+	<string name="realtime_content_description">புறப்படுவது நிகழ்நேரம்</string>
+	<string name="schedule_content_description">புறப்படும் நேரம் அட்டவணையில் இருந்து</string>
+	<string name="wheelchair_content_description">வண்டி சக்கர நாற்காலி அணுகக்கூடியது</string>
+	<string name="air_condition_content_description">ஏர் கண்டிசனிங்</string>
+	<string name="bicycles_allowed_content_description">மிதிவண்டிகள் அனுமதிக்கப்படுகின்றன</string>
+	<string name="show_departures">புறப்படுவதைக் காட்டு</string>
+	<string name="open_in_maps_app">வரைபட பயன்பாட்டில் திறக்கவும்</string>
+	<string name="stop_content_description">நிறுத்து</string>
+	<string name="seatbelts_everyone">சீட் பெல்ட்ச், எல்லோரும்!</string>
+	<string name="onboarding_question">நீங்கள் எவ்வாறு தொடங்க விரும்புகிறீர்கள்?</string>
+	<string name="onboarding_simple">எளிய</string>
+	<string name="onboarding_simple_action">வட்டாரங்களைத் தேர்வுசெய்க</string>
+	<string name="onboarding_advanced">மேம்பட்ட</string>
+	<string name="onboarding_advanced_action">சேவையகத்தைத் தேர்வுசெய்க</string>
+	<string name="cancel">ரத்துசெய்</string>
+	<string name="error">பிழை</string>
+	<string name="rate_limit">வீத வரம்பு</string>
+	<string name="server_rate_limited_question">இந்த சேவையகம் வீத-வரையறுக்கப்பட்டுள்ளது மற்றும் கிள்ளாக்கு எதுவும் வழங்கப்படவில்லை. நீங்கள் தொடர விரும்புகிறீர்களா?</string>
+	<string name="server_private_question">இந்த சேவையகம் தனிப்பட்டது மற்றும் கிள்ளாக்கு எதுவும் வழங்கப்படவில்லை</string>
+	<string name="last_update">கடைசி புதுப்பிப்பு: %1$s</string>
+	<string name="title_feeds">கால அட்டவணைகள்</string>
+	<string name="title_servers">சேவையகங்கள்</string>
+	<string name="title_cities">வட்டாரங்கள்</string>
+	<string name="error_url">தவறான முகவரி வழங்கப்பட்டது</string>
+	<string name="error_traffic_spec">சேவையகத்தை சரிபார்க்க முடியாது</string>
+	<string name="stops_near_code">%1$s க்கு அருகில் நிறுத்தப்படும்</string>
+	<string name="choose_server">சேவையக சுவையைத் தேர்வுசெய்க</string>
+	<string name="ok">சரி</string>
+	<string name="no_location_access">இருப்பிட அணுகல் வழங்கப்படவில்லை</string>
+	<string name="no_location_message">அருகிலுள்ள நிறுத்தங்களைக் கண்டுபிடித்து வரைபடத்தில் தற்போதைய நிலையைக் காட்ட இருப்பிடத்தைப் பயன்படுத்த இசைவு தேவை. மற்ற நற்பொருத்தங்கள் இல்லாமல் வேலை செய்யும். கணினி அமைப்புகளில் எந்த நேரத்திலும் இது இயக்கப்பட்டு முடக்கப்படலாம்.</string>
+	<string name="stop_stub_on_demand_in_zone">மண்டலம் %1$s இல் தேவைக்கேற்ப நிறுத்துங்கள்</string>
+	<string name="stop_stub_on_demand">தேவைக்கேற்ப நிறுத்துங்கள்</string>
+	<string name="stop_stub_in_zone">மண்டலம் %1$s இல் நிறுத்துங்கள்</string>
+	<string name="vehicle_headsign_content_description">%1$s ஐ நோக்கி %2$s</string>
+	<string name="departure_headsign">» %1$s</string>
+	<string name="title_about">பற்றி</string>
+	<string name="translation_button_description">மொழிபெயர்ப்பு சேவைக்கான இணைப்பு</string>
+	<string name="app_description">ஃப்ளோச் பொது போக்குவரத்து பயணிகள் தோழர்; உங்கள் பாக்கெட்டில் ஒரு கால அட்டவணை.</string>
+	<string name="website_button_description">வலைத்தளத்திற்கான இணைப்பு</string>
+	<string name="code_button_description">மூலக் குறியீட்டிற்கான இணைப்பு</string>
+	<string name="mastodon_button_description">மாச்டோடனுக்கான இணைப்பு</string>
+	<string name="use_online_feed">நிகழ்நிலை ஊட்டத்தைப் பயன்படுத்தவும்</string>
+	<string name="information_may_be_outdated">செய்தி காலாவதியானதாக இருக்கலாம்</string>
+	<string name="current_timetable_validity">தற்போதைய கால அட்டவணை செல்லுபடியாகும்: %1$s முதல் %2$s வரை</string>
+	<string name="error_406">பயன்பாட்டு பதிப்பு சேவையகத்துடன் பொருந்தாது</string>
+	<string name="filter_localities">வட்டங்களை வடிகட்டவும்</string>
+	<string name="error_41">இந்த வட்டாரம் சேவையகத்தால் ஆதரிக்கப்படவில்லை</string>
+	<string name="stop_from_qr_code">QR குறியீடு நிறுத்தம்</string>
+	<string name="title_select_date">புறப்படும் நாளைத் தேர்ந்தெடுக்கவும்</string>
+	<string name="title_select_line">வரியைத் தேர்ந்தெடுக்கவும்</string>
+	<string name="clear_date_selection">தெளிவான</string>
+	<string name="title_filter">வடிப்பி</string>
+	<string name="title_filter_byline">வரி மூலம் வடிகட்டவும்</string>
+	<string name="title_filter_bytime">நேரம் மூலம் வடிகட்டவும்</string>
+	<string name="title_select_time_start">தொடக்க நேரத்தைத் தேர்ந்தெடுக்கவும்</string>
+	<string name="title_select_time_end">இறுதி நேரத்தைத் தேர்ந்தெடுக்கவும்</string>
+	<string name="more">மேலும்</string>
+	<string name="alert_header">நிலை புதுப்பிப்புகள்</string>
+	<string name="favourite_content_description">பிடித்ததாக சேமிக்கவும்</string>
+	<string name="favourite">பிடித்த</string>
+	<string name="filtered">வடிகட்டப்பட்டது</string>
+	<string name="unfiltered">வடிகட்டப்படாதது</string>
+	<string name="cannot_save_favourite">பிடித்ததை சேமிக்க முடியவில்லை</string>
+	<string name="error_44">இனி புறப்படுவதில்லை</string>
+	<string name="loading">ஏற்றுகிறது…</string>
+	<string name="favourite_deleted">பிடித்த நீக்கப்பட்டது</string>
+	<string name="undo">செயல்தவிர்</string>
+	<string name="units_title">அலகு அமைப்பு</string>
+	<string name="units_locale_based">இடம் அடிப்படையிலானது</string>
+	<string name="units_metric">மெட்ரிக் (எச்ஐ)</string>
+	<string name="units_imperial">இம்பீரியல் (யுகே)</string>
+	<string name="units_customary">அமெரிக்க வழக்கம்</string>
+	<string name="units_tgm10">டிசிஎம் (அடிப்படை 10)</string>
+	<string name="units_tgm12">டிசிஎம் (அடிப்படை 12)</string>
+	<string name="title_settings">அமைப்புகள்</string>
+	<string name="no_geocoding_data">சியோகோடிங் தரவு இல்லை</string>
+	<string name="no_geocoding_data_description">வினவலில் ஒரு குறுகிய பிளச் குறியீடு உள்ளது, ஆனால் சியோகோடிங் தரவு எதுவும் இல்லை. சியோகோடிங் தரவைப் பதிவிறக்கவும் அல்லது அமைப்புகளில் தானாக புதுப்பிப்பதை இயக்கவும்.</string>
+	<string name="cities_channel_name">நகரங்கள் சேனலைப் புதுப்பிக்கின்றன</string>
+	<string name="cities_channel_description">சியோகோடிங் உள்ளக தரவைப் புதுப்பிப்பதன் முன்னேற்றத்தைக் காட்டும் அறிவிப்புகள்</string>
+	<string name="saving_cities_list">நகரங்களின் பட்டியல் சேமிக்கிறது</string>
+	<string name="updating_geocoding_data">சியோகோடிங் தரவைப் புதுப்பித்தல்</string>
+	<string name="downloading_cities_list">நகரங்களின் பட்டியல் பதிவிறக்குகிறது</string>
+	<string name="finished_updating_geocoding_data">சியோகோடிங் தரவைப் புதுப்பித்து முடிந்தது</string>
+	<string name="updating_geocoding_data_failed">சியோகோடிங் தரவைப் புதுப்பிப்பது தோல்வியடைந்தது</string>
+	<string name="one">ஒன்று</string>
+	<string name="two">இரண்டு</string>
+	<string name="three">மூன்று</string>
+	<string name="four">நான்கு, நாலடி, நான்கடி</string>
+	<string name="five">ஐந்து</string>
+	<string name="six">ஆறு</string>
+	<string name="seven">ஏழு</string>
+	<string name="eight">எட்டு</string>
+	<string name="nine">ஒன்பது</string>
+	<string name="ten">பத்து</string>
+	<string name="elv">கொள்கை</string>
+	<string name="zen">சென்</string>
+	<string name="duna">டுனா</string>
+	<string name="quedra">தங்க</string>
+	<string name="trin">டிரின்</string>
+	<string name="quen">க்வென்</string>
+	<string name="hes">அச்</string>
+	<string name="sev">சேவ்</string>
+	<string name="ak">அக்</string>
+	<string name="neen">இல்லை</string>
+	<string name="dex">டெக்ச்</string>
+	<string name="lef">லெஃப்</string>
+	<string name="filtered_stop_question">தேர்ந்தெடுக்கப்பட்ட வரிகளுடன் பிடித்த வடிகட்டப்பட்டதை சேமிக்க விரும்புகிறீர்களா?</string>
+	<string name="none">எதுவுமில்லை</string>
+	<string name="italics">சாய்வு</string>
+	<string name="colour">நிறம்</string>
+	<string name="line_decorations">வரி பெயர் அலங்காரங்கள்</string>
+	<string name="acra_notification_channel">க்ராச் அறிக்கைகள் சேனல்</string>
+	<string name="acra_notification_channel_description">செயலிழப்புகளைக் காட்டும் அறிவிப்புகள் மற்றும் செயலிழப்பு அறிக்கைகளை அனுப்ப அனுமதிக்கின்றன</string>
+	<string name="acra_notification_title">பிம்பா செயலிழந்தது</string>
+	<string name="acra_notification_text">எதிர்பாராத ஒரு தடை பிம்பாவின் வழியில் காட்டப்பட்டுள்ளது. நீங்கள் ஒரு அறிக்கையை அனுப்ப விரும்புகிறீர்களா?</string>
+	<string name="send">அனுப்பு</string>
+	<string name="discard">நிராகரிக்கவும்</string>
+	<string name="send_with_comment">பாராட்டுடன் அனுப்புங்கள்</string>
+	<string name="acra_notification_comment">செயலிழப்பு அறிக்கையில் கருத்து சேர்க்கப்பட்டது</string>
+	<string name="filtered_departures">வடிகட்டப்பட்ட புறப்பாடு</string>
+	<string name="alerts">விழிப்பூட்டல்கள்</string>
+	<string name="grey_out">சாம்பல் வெளியே</string>
+	<string name="show">காட்டு</string>
+	<string name="transitous_description">சமூகம் நடத்தும் வழங்குநர்-நடுநிலை பன்னாட்டு பொது போக்குவரத்து ரூட்டிங் பணி. பாதுகாப்பு https://transitous.org/sources/ இல் கிடைக்கிறது</string>
+	<string name="transitous_attribution">ச்ப்லைன் (https://routing.spline.de) வழங்கிய டிரான்சிட்டச் (https://transitous.org) பநிஇ. சமூகத்தால் பராமரிக்கப்படும் வட்டாரங்கள் (https://github.com/public-transport/transitous/tree/main/feeds).</string>
+	<string name="local_time">உள்ளக நேரம்</string>
+	<string name="departure_arrived">வந்துவிட்டார்</string>
+	<string name="arrival_approximate">தோராயமாக. arr.</string>
+	<string name="arrival">வருகை</string>
+	<string name="departure">புறப்படுதல்</string>
+	<string name="approximately">தோராயமாக</string>
+	<string name="vehicle_headsign"><annotation decoration="apply"><annotation arg="0">%1$s </annotation></annotation>» <annotation arg="1">%2$s</annotation></string>
+	<plurals name="distance_in_m_cd">
+		<item quantity="one">%1$d மீட்டர்</item>
+		<item quantity="other">%1$d மீட்டர்கள்</item>
+	</plurals>
+	<plurals name="speed_in_km_per_h_cd">
+		<item quantity="one">ஒரு மணி நேரத்திற்கு %1$d கிலோமீட்டர்</item>
+		<item quantity="other">ஒரு மணி நேரத்திற்கு %1$d கிலோமீட்டர்கள்</item>
+	</plurals>
+	<plurals name="speed_in_mi_per_h_cd">
+		<item quantity="one">ஒரு மணி நேரத்திற்கு %1$d மைல்</item>
+		<item quantity="other">ஒரு மணி நேரத்திற்கு %1$d மைல்கள்</item>
+	</plurals>
+	<string name="distance_in_gf">%1$s %2$s சிஃப்</string>
+	<plurals name="distance_in_3gf_12_cd">
+		<item quantity="one">%1$s முநாக்ராஃபுட்</item>
+		<item quantity="other">%1$s முநாக்ராஃபுட்கள்</item>
+	</plurals>
+	<string name="at_time">%1$02d:%2$02d மணிக்கு</string>
+	<string name="credits">ரயில்வே சான்ச் © கிரெக் ஃப்ளெமிங், ofl-1.1 https://github.com/davelab6/railway6/railway6/railway6/railway6/railway-sans\n\n மாச்டோடன் படவுரு (https://github.com/mastodon/joinmastodon) © மாச்டோடன் பங்களிப்பாளர்கள், agpl-3.0 அல்லது-later\n\n Https://github.com/tebriz159 ஆல் உருவாக்கப்பட்ட பிம்பா லோகோ\n\n பொருள் சின்னங்கள் © கூகிள், அப்பாச்சி -2.0\n\n வரைபட தரவு © OpenStreetMap பங்களிப்பாளர்கள் (https://www.openstreetmap.org/copyright), ODBL-1.0\n\n சியோகோடிங் சார்ட் பிளச் குறியீடுகளுக்குப் பயன்படுத்தப்படும் நகரங்கள் பட்டியல் © சியோனேம்ச் (https://geonames.org), சி.சி.\n\n மேட்ரிக்ச் லோகோ ™/® மேட்ரிக்ச்.ஆர்ச்</string>
+	<string name="map_attribution"><![CDATA[© <a href="https://www.openstreetmap.org/copyright">திறந்தவெளிவரைபடம்</a> பங்களிப்பாளர்கள்]]></string>
+</resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..584c09adbe1a50f09942b09beda403d50ea1d09b
--- /dev/null
+++ b/app/src/main/res/values-tr/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+SPDX-FileCopyrightText: Adam Evyčędo and contributors using Weblate
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<resources></resources>
\ No newline at end of file




diff --git a/app/src/main/res/values-v31/themes.xml b/app/src/main/res/values-v31/themes.xml
index f07ff67b177ed5e11ed481990ae1e34133dc4e3c..6a2be0c58c62bd939cea48d74bf6ced21e901bf0 100644
--- a/app/src/main/res/values-v31/themes.xml
+++ b/app/src/main/res/values-v31/themes.xml
@@ -9,6 +9,7 @@
 <resources xmlns:tool="http://schemas.android.com/tools">
 
 	<style name="Theme.Bimba" parent="Theme.Material3.Light.NoActionBar">
+		<item name="fontFamily">@font/yellowcircle8</item>
 		<item name="android:fontFamily">@font/yellowcircle8</item>
 		<item name="colorPrimary">@android:color/system_accent1_600</item>
 		<item name="colorOnPrimary">@android:color/system_accent1_0</item>
@@ -45,6 +46,22 @@ 		@android:color/transparent
 		<item name="android:enforceStatusBarContrast">false</item>
 		<item name="lightStatusBar">true</item>
 		<item name="randomColourLightness">.2</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Suggestion" parent="Widget.Material3.Chip.Suggestion">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Input" parent="Widget.Material3.Chip.Input">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
+	</style>
+
+	<style name="Theme.Bimba.Chip.Filter" parent="Widget.Material3.Chip.Filter">
+		<item name="fontFamily">@font/yellowcircle8</item>
+		<item name="checkedIconVisible">false</item>
+		<item name="android:fontFamily">@font/yellowcircle8</item>
 	</style>
 
 	<style name="Theme.Bimba.SearchResult.Title" parent="Theme.Bimba">




diff --git a/app/src/main/res/xml/journey_chip.xml b/app/src/main/res/xml/journey_chip.xml
new file mode 100644
index 0000000000000000000000000000000000000000..641522a599890a0f74552d203416869a0fb506f0
--- /dev/null
+++ b/app/src/main/res/xml/journey_chip.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+SPDX-FileCopyrightText: Adam Evyčędo
+
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+<chip xmlns:android="http://schemas.android.com/apk/res/android"
+	style="@style/Theme.Bimba.Chip.Input"
+	android:textAppearance="@style/Theme.Bimba.Chip.Text"
+	android:text="-180.00, -90.00" />
\ No newline at end of file




diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml
index c590b8026cb06e551b4fc892f4f8c1065b4166e6..b4b601c38c3171af0543ee71f649c71accf246c1 100644
--- a/app/src/main/res/xml/locales_config.xml
+++ b/app/src/main/res/xml/locales_config.xml
@@ -3,7 +3,7 @@
 <!--
 SPDX-FileCopyrightText: Adam Evyčędo
 
-SPDX-License-Identifier: AGPL-3.0-or-later
+SPDX-License-Identifier: GPL-3.0-or-later
 -->
 
 <locale-config xmlns:android="http://schemas.android.com/apk/res/android">
@@ -15,4 +15,6 @@     
     <locale android:name="fr"/>
     <locale android:name="it"/>
     <locale android:name="pl"/>
+    <locale android:name="ru"/>
+    <locale android:name="ta"/>
 </locale-config>
\ No newline at end of file




diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
index c82baad406fe24af9a7df280f960432d107ec9ee..158ecc3c41ff1507620c4e37ebac2da2a05be9e0 100644
--- a/app/src/main/res/xml/root_preferences.xml
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -1,7 +1,7 @@
 <!--
 SPDX-FileCopyrightText: Adam Evyčędo
 
-SPDX-License-Identifier: AGPL-3.0-or-later
+SPDX-License-Identifier: GPL-3.0-or-later
 -->
 
 <PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">




diff --git a/build.gradle.kts b/build.gradle.kts
index 469ffc011b5a5a8007953b795633669f6779049e..0e6fb37fe7f621022fb39098802726a647d6f19d 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -4,8 +4,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later
 
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 plugins {
-    id("com.android.application") version "8.7.2" apply false
-    id("com.android.library") version "8.7.2" apply false
+    id("com.android.application") version "8.8.0" apply false
+    id("com.android.library") version "8.8.0" apply false
     id("org.openapi.generator") version "7.9.0" apply false
     id("de.undercouch.download") version "5.6.0" apply false
     kotlin("android") version "2.0.10" apply false




diff --git a/fruchtfleisch/build.gradle.kts b/fruchtfleisch/build.gradle.kts
index df25428f756486a6fc35db26cf06914a5427ee12..43fb515fc848c87a101c325f986d0cc4e2de095d 100644
--- a/fruchtfleisch/build.gradle.kts
+++ b/fruchtfleisch/build.gradle.kts
@@ -8,8 +8,8 @@     kotlin("jvm")
 }
 
 dependencies {
-    testImplementation("org.junit.jupiter:junit-jupiter:5.11.2")
-    testImplementation("org.junit.jupiter:junit-jupiter:5.11.2")
+    testImplementation("org.junit.jupiter:junit-jupiter:5.11.4")
+    testImplementation("org.junit.jupiter:junit-jupiter:5.11.4")
 
     //implementation("org.jetbrains.kotlin:kotlin-reflect:1.8.10")
 }




diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index dfec7cc51514aaa2b56c69a2e03179fbb0370502..46c68e716d3fedc11efcf72d7e37efef71a31362 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -4,7 +4,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later
 
 #Tue Aug 09 15:48:25 CEST 2022
 distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
 distributionPath=wrapper/dists
 zipStorePath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME




diff --git a/metadata/de-DE/changelogs/20.txt b/metadata/de-DE/changelogs/20.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bcb65b43913795311f8f4904fc21a4f5d8b5da6d
--- /dev/null
+++ b/metadata/de-DE/changelogs/20.txt
@@ -0,0 +1,5 @@
+Die Version 3.0 wurde von Grund auf neu geschrieben und bietet eine völlig neue Architektur.
+
+* Favoriten wurden entfernt
+* Haltestellen und Fahrzeuge sind auf der Karte
+* Die Benutzeroberfläche ist jetzt Material3




diff --git a/metadata/de-DE/changelogs/21.txt b/metadata/de-DE/changelogs/21.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bcb65b43913795311f8f4904fc21a4f5d8b5da6d
--- /dev/null
+++ b/metadata/de-DE/changelogs/21.txt
@@ -0,0 +1,5 @@
+Die Version 3.0 wurde von Grund auf neu geschrieben und bietet eine völlig neue Architektur.
+
+* Favoriten wurden entfernt
+* Haltestellen und Fahrzeuge sind auf der Karte
+* Die Benutzeroberfläche ist jetzt Material3




diff --git a/metadata/de-DE/changelogs/22.txt b/metadata/de-DE/changelogs/22.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c8bafc93c092663e8afc22c33f89a1f039dd03a4
--- /dev/null
+++ b/metadata/de-DE/changelogs/22.txt
@@ -0,0 +1,11 @@
+Version 3.1 bietet:
+* monochromes Launcher-Symbol und vorausschauende Zurück-Geste für Android 12,
+* Material You-Thema mit Systemfarben,
+* neue Suchleiste,
+* Suche nach Open Location Code,
+* Gleiten statt Springen in der Minimap,
+* Polnische und italienische Übersetzungen,
+* Handhabung mehrerer Feeds,
+* QR-Codes in Metropolis GZM,
+* Suche nach Linien (und Auswahl von Haltestellen in Graphen),
+* Aktualisierungen von Abhängigkeiten, Fehlerbehebungen und einige Code-Überarbeitungen.




diff --git a/metadata/de-DE/changelogs/23.txt b/metadata/de-DE/changelogs/23.txt
new file mode 100644
index 0000000000000000000000000000000000000000..99ad754b9cf98b1c78556e4fc548e7654583330d
--- /dev/null
+++ b/metadata/de-DE/changelogs/23.txt
@@ -0,0 +1 @@
+Version 3.1.1 repariert den Weiter-Button in der Serverauswahl




diff --git a/metadata/de-DE/changelogs/24.txt b/metadata/de-DE/changelogs/24.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2b27953e2d2a39a47bef47093f12c9b19c2c0c3d
--- /dev/null
+++ b/metadata/de-DE/changelogs/24.txt
@@ -0,0 +1,13 @@
+Änderungen in Version 3.2:
+* „Über“-Bildschirm hinzugefügt
+* Scrollen nach unten lädt mehr Abflüge
+* Ortsinformationen und Einstellungen werden offline zwischengespeichert
+* Listen aktualisieren nur geänderte Einträge
+* Die Suchergebnisse enthalten den Namen des Ortes
+* Die Ortsliste kann gefiltert werden (über 12 Einträge)
+* Geänderte Haltestellensymbole
+* Icons auf der Karte sind skaliert
+* TRAFFIC Version clockworkOrange kompatibel
+* Letzte Aktualisierung der Abfahrten wird angezeigt, wenn sie länger als eine Minute zurückliegt
+* Neue deutsche Übersetzungen
+* Bimba ist REUSE-konform




diff --git a/metadata/de-DE/changelogs/25.txt b/metadata/de-DE/changelogs/25.txt
new file mode 100644
index 0000000000000000000000000000000000000000..683f8cd78b532f8c2e34422cc3c888b635b91bb2
--- /dev/null
+++ b/metadata/de-DE/changelogs/25.txt
@@ -0,0 +1,11 @@
+Änderungen in Version 3.3
+* Auswahl des Datums und Filterung nach Uhrzeit hinzugefügt
+* Filterung der Abfahrten nach Linie zugefügt
+* Warnungen bei Haltestellen und Abfahrten werden nun angezeigt.
+* Querformat-Version des „Über“-Bildschirms korrigiert
+* Fähigkeiten für Fahrzeuge auf der Karte korrigiert
+* Geänderte zwischengespeicherte Orte mit geringerem Kontrast
+* Die Anzeige der Linienrichtungen für andere als 2 wurde korrigiert.
+* Speichern des Ortscaches behoben
+* Aktualisierte Abhängigkeiten
+* Aktualisierte veraltete Methoden im Code




diff --git a/metadata/de-DE/changelogs/26.txt b/metadata/de-DE/changelogs/26.txt
new file mode 100644
index 0000000000000000000000000000000000000000..97b118db85b2aaac34928b2da3daad09b1f5e12d
--- /dev/null
+++ b/metadata/de-DE/changelogs/26.txt
@@ -0,0 +1,13 @@
+Änderungen in Version 3.3.1
+* Absturz beim zu nahen Zoomen behoben
+Änderungen in Version 3.3
+* Auswahl des Datums und Filterung nach Uhrzeit hinzugefügt
+* Filterung der Abfahrten nach Linie zugefügt
+* Warnungen bei Haltestellen und Abfahrten werden nun angezeigt.
+* Querformat-Version des „Über“-Bildschirms korrigiert
+* Fähigkeiten für Fahrzeuge auf der Karte korrigiert
+* Geänderte zwischengespeicherte Orte mit geringerem Kontrast
+* Die Anzeige der Linienrichtungen für andere als 2 wurde korrigiert.
+* Speichern des Ortscaches behoben
+* Aktualisierte Abhängigkeiten
+* Aktualisierte veraltete Methoden im Code




diff --git a/metadata/de-DE/changelogs/27.txt b/metadata/de-DE/changelogs/27.txt
new file mode 100644
index 0000000000000000000000000000000000000000..90f4da9450c29896814c1bc9d13dd19fca2095df
--- /dev/null
+++ b/metadata/de-DE/changelogs/27.txt
@@ -0,0 +1,16 @@
+Änderungen in Version 3.3.2
+* Hinzufügen der korrekten Openstreetmap-Attribution
+* Minimaler Kartenzoom geändert
+Änderungen in Version 3.3.1
+* Absturz beim zu nahen Zoomen der Karte behoben
+Änderungen in Version 3.3
+* Auswahl des Datums und Filterung nach Uhrzeit hinzugefügt
+* Filterung der Abfahrten nach Linie zugefügt
+* Warnungen bei Haltestellen und Abfahrten werden nun angezeigt.
+* Querformat-Version des „Über“-Bildschirms korrigiert
+* Fähigkeiten für Fahrzeuge auf der Karte korrigiert
+* Geänderte zwischengespeicherte Orte mit geringerem Kontrast
+* Die Anzeige der Linienrichtungen für andere als 2 wurde korrigiert.
+* Speichern des Ortscaches behoben
+* Aktualisierte Abhängigkeiten
+* Aktualisierte veraltete Methoden im Code




diff --git a/metadata/de-DE/changelogs/28.txt b/metadata/de-DE/changelogs/28.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e225e2f22d8ac3944ffe2efbbbf9ba48c239845c
--- /dev/null
+++ b/metadata/de-DE/changelogs/28.txt
@@ -0,0 +1,8 @@
+Änderungen in Version 3.4
+* Countdown zur Anzeige der nächsten Aktualisierung der Abflüge hinzugefügt
+* Filter und Unterseiten bleiben bei einem Bildschirmwechsel erhalten.
+* Geändertes Layout der Warnungen über den Abflügen
+* Phantom-Suchergebnisse behoben
+* Rand-zu-Rand- und Querformat-Layouts korrigiert
+* Einfache Favoriten hinzugefügt
+* Französische Übersetzung hinzugefügt (von ArnaudDvs)




diff --git a/metadata/de-DE/changelogs/29.txt b/metadata/de-DE/changelogs/29.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3174f6a4895cdb3288b41b5c0e65a3ebf917f4e5
--- /dev/null
+++ b/metadata/de-DE/changelogs/29.txt
@@ -0,0 +1,4 @@
+Änderungen in Version 3.5:
+* Suche nach kurzen Plus Codes hinzugefügt
+* Pfeile, die zu den nächstgelegenen Haltestellen führen hinzugefügt
+* Einheiten hinzugefügt (Geschwindigkeit, Entfernung, Zeit)




diff --git a/metadata/de-DE/changelogs/30.txt b/metadata/de-DE/changelogs/30.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8aa30298d8922cc63ebe063396468e99da749b1d
--- /dev/null
+++ b/metadata/de-DE/changelogs/30.txt
@@ -0,0 +1,5 @@
+Änderungen in Version 3.6:
+* Änderungsoptionen können nun Zeilen in kursiver Schrift anzeigen
+* Abstürze können gemeldet werden
+* Über-Seite zeigt mehr Kontaktpunkte an
+* Aktualisierung von Favoriten und Geonames auf älteren Android-Versionen behoben




diff --git a/metadata/de-DE/changelogs/31.txt b/metadata/de-DE/changelogs/31.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8aa30298d8922cc63ebe063396468e99da749b1d
--- /dev/null
+++ b/metadata/de-DE/changelogs/31.txt
@@ -0,0 +1,5 @@
+Änderungen in Version 3.6:
+* Änderungsoptionen können nun Zeilen in kursiver Schrift anzeigen
+* Abstürze können gemeldet werden
+* Über-Seite zeigt mehr Kontaktpunkte an
+* Aktualisierung von Favoriten und Geonames auf älteren Android-Versionen behoben




diff --git a/metadata/de-DE/changelogs/32.txt b/metadata/de-DE/changelogs/32.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7dd5469e02f3b9373643e0ca3a2938b11a227784
--- /dev/null
+++ b/metadata/de-DE/changelogs/32.txt
@@ -0,0 +1,2 @@
+* Grundlegende Unterstützung für Transitous hinzugefügt
+* Phantom-Ortsnamen in den Suchergebnissen behoben




diff --git a/metadata/de-DE/changelogs/33.txt b/metadata/de-DE/changelogs/33.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5be0f82b10aaafee4102202b7b79a7b50150052f
--- /dev/null
+++ b/metadata/de-DE/changelogs/33.txt
@@ -0,0 +1,5 @@
+* aktualisierte Abhängigkeiten
+* vorbereitet für getrennte Ankunfts- und Abfahrtszeiten
+* Styling verbessert
+* Estnische Sprache hinzugefügt (Priit Jõerüüt)
+* Übersetzungen verbessert (Lars K, Nicolas DERIVE, stormax181iq)




diff --git a/metadata/de-DE/full_description.txt b/metadata/de-DE/full_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7119cfac0abacbb18aa9936e17132fdb6bb01be8
--- /dev/null
+++ b/metadata/de-DE/full_description.txt
@@ -0,0 +1,9 @@
+Mit Bimba können Sie den Fahrplan der öffentlichen Verkehrsmittel mit Echtzeit-Abfahrten in mehreren Städten ansehen.
+
+Aktuelle Funktionen:
+* Überprüfung der Abfahrtszeiten nach Haltestelle,
+* Suche nach Haltestellen in der Nähe,
+* Suche nach Haltestellen über QR-Code (in ausgewählten Fahrplänen),
+* Suche nach Haltestellen auf der Linie,
+* Fahrzeugattribute für Abfahrten (je nach verfügbaren Informationen),
+* Fahrzeuge und Haltestellen auf der Karte in Echtzeit,




diff --git a/metadata/en-US/changelogs/35.txt b/metadata/en-US/changelogs/35.txt
new file mode 100644
index 0000000000000000000000000000000000000000..53b89ff9eb77687f2f8c245767b5e8a9534682a6
--- /dev/null
+++ b/metadata/en-US/changelogs/35.txt
@@ -0,0 +1,2 @@
+* added travel planning based on Transitous
+* added translations by ArnaudDvs, Jonah Brüchert, Kemal Oktay Aktoğan, Priit Jõerüüt, Xapitonov, தமிழ்நேரம்




diff --git a/metadata/et/changelogs/20.txt b/metadata/et/changelogs/20.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e239555930872eb8c03b9c91f3f68acaa00baeea
--- /dev/null
+++ b/metadata/et/changelogs/20.txt
@@ -0,0 +1,5 @@
+Versioon 3.0 on tervikuna ümber kirjutatud ja kasutab täiesti uut arhitektuuri.
+
+* lemmikud on eemaldatud
+* kaardil on peatused ja sõidukid
+* kasutajaliides põhineb Material3 reeglitel




diff --git a/metadata/et/changelogs/21.txt b/metadata/et/changelogs/21.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e239555930872eb8c03b9c91f3f68acaa00baeea
--- /dev/null
+++ b/metadata/et/changelogs/21.txt
@@ -0,0 +1,5 @@
+Versioon 3.0 on tervikuna ümber kirjutatud ja kasutab täiesti uut arhitektuuri.
+
+* lemmikud on eemaldatud
+* kaardil on peatused ja sõidukid
+* kasutajaliides põhineb Material3 reeglitel




diff --git a/metadata/et/changelogs/23.txt b/metadata/et/changelogs/23.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c40431c177efdf3b186548e785d79f0a7321f2a0
--- /dev/null
+++ b/metadata/et/changelogs/23.txt
@@ -0,0 +1 @@
+Versioon 3.1.1 parandab jätkamisnupu vead serveri valikul




diff --git a/metadata/et/changelogs/28.txt b/metadata/et/changelogs/28.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e559fd94a2c60fae9885503770654e1d843679cc
--- /dev/null
+++ b/metadata/et/changelogs/28.txt
@@ -0,0 +1,8 @@
+Muudatused versioonis 3.4
+* Lisasime lähteloenduri, mis näitab aega järgmise väljumiseni
+* Parandasime vead ekraanivaatete muutumisel (püsifiltrid ja alumised lehed)
+* Muutsime hoiatuste küljendust väljumise kohal
+* Parandasime otsingute fantoomtulemused
+* Parandasime äärest-ääreni vaate ja rõhtvaate vead
+* Lisasime lihtsad lemmikud
+* Lisasime prantsuse keele tõlke (tänud: ArnaudDvs)




diff --git a/metadata/et/changelogs/29.txt b/metadata/et/changelogs/29.txt
new file mode 100644
index 0000000000000000000000000000000000000000..362999de968840c94012c2bc7ea87a148cf8004c
--- /dev/null
+++ b/metadata/et/changelogs/29.txt
@@ -0,0 +1,4 @@
+Muudatused versioonis 3.5:
+* lisasime otsinguvõimaluse plusskoodide alusel
+* lisasime nooled, mis viitavad lähimale peatusele
+* lisasime erinevate ühikute kasutamise võimaluse (kiirus, vahemaa, aeg)




diff --git a/metadata/et/changelogs/30.txt b/metadata/et/changelogs/30.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a00fd1c25bff93bc23c3ead9cb576af569915aed
--- /dev/null
+++ b/metadata/et/changelogs/30.txt
@@ -0,0 +1,5 @@
+Muudatused versioonis 3.6:
+* seadistustes saab nüüd määrata, et liinid kuvatakse kaldkirjas
+* rakenduse kokkujooksmisest on nüüd võimalik teada anda
+* rakenduse teabe lehel on täiendavad kontaktandmed
+* parandasime lemmikute ja geonimede uuendamise vanemates Androidi versioonides




diff --git a/metadata/et/changelogs/31.txt b/metadata/et/changelogs/31.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a00fd1c25bff93bc23c3ead9cb576af569915aed
--- /dev/null
+++ b/metadata/et/changelogs/31.txt
@@ -0,0 +1,5 @@
+Muudatused versioonis 3.6:
+* seadistustes saab nüüd määrata, et liinid kuvatakse kaldkirjas
+* rakenduse kokkujooksmisest on nüüd võimalik teada anda
+* rakenduse teabe lehel on täiendavad kontaktandmed
+* parandasime lemmikute ja geonimede uuendamise vanemates Androidi versioonides




diff --git a/metadata/et/changelogs/32.txt b/metadata/et/changelogs/32.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1e75688606807af2930e8fbc3b7abda796b91ad6
--- /dev/null
+++ b/metadata/et/changelogs/32.txt
@@ -0,0 +1,2 @@
+* lisasime esmase Transitouse toe
+* eemaldasime fantoomasukohtad otsingutulemustest




diff --git a/metadata/et/changelogs/33.txt b/metadata/et/changelogs/33.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7a22f923ef0dd67e71e0be5f911994200c4de5f5
--- /dev/null
+++ b/metadata/et/changelogs/33.txt
@@ -0,0 +1,5 @@
+* uuendasime teeke
+* kohendasime koodi eraldi saabumiste ja väljumiste aegade kuvamiseks 
+* parandasime kujundust
+* lisasime eesti keele (Priit Jõerüüt)
+* parandasime tõlkeid (Lars K, Nicolas DERIVE, stormax181iq)




diff --git a/metadata/et/full_description.txt b/metadata/et/full_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7f65023c8cbc576c4ed6c866a01586cd1819d646
--- /dev/null
+++ b/metadata/et/full_description.txt
@@ -0,0 +1,9 @@
+Bimba abil saad vaadata ühistranspordi sõiduplaane, sealhulgas mitmetes linnades väljumiste ja muid olulisi andmed reaalajas.
+
+Praegune funktsionaalsus:
+* väljumised peatuste kaupa,
+* lähimate peatuste otsing,
+* peatuste otsing QR-koodi alusel (valitud sõiduplaanide puhul),
+* peatuste otsing liini kaupa,
+* väljuva sõiduki andmed (kui see teave on olemas),
+* sõidukid ja peatused reaalajas (kui see teave on olemas)




diff --git a/metadata/et/short_description.txt b/metadata/et/short_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..91d4ddbb7b81ac80b6c6ef64712888696ddb554f
--- /dev/null
+++ b/metadata/et/short_description.txt
@@ -0,0 +1 @@
+Avaandmetel põhinev ühistranspordi sõiduplaanide rakendus.




diff --git a/metadata/et/title.txt b/metadata/et/title.txt
new file mode 100644
index 0000000000000000000000000000000000000000..038d5e6047bc863c8fd2210be761c396b834e447
--- /dev/null
+++ b/metadata/et/title.txt
@@ -0,0 +1 @@
+Bimba




diff --git a/release.sh b/release.sh
index 7b8c6671ca16a510eb4014d883fdcc84505f215c..d834d301c5f70605f4f527559641c18bfbe8ae02 100755
--- a/release.sh
+++ b/release.sh
@@ -79,7 +79,7 @@ 		latestCIstatus=$(echo "$latestCI" | grep ']*>//' | sed 's|||' | grep -oE '[A-Z]+')
 		latestCIstarted=$(echo "$latestCI" | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+\+[0-9]{2}:[0-9]{2}' | head -n1)
 	done
 
-	currentVersionName=$(grep -Eo 'versionName = "[0-9\.]+"' app/build.gradle.kts | cut -d '=' -f2 | tr -d ' "')
+	currentVersionName=$(grep -Eo 'versionName = "[0-9\.]+[^"]*"' app/build.gradle.kts | cut -d '=' -f2 | tr -d ' "')
 	major=$(echo "$currentVersionName" | cut -d '.' -f1)
 	minor=$(echo "$currentVersionName" | cut -d '.' -f2)
 	patch=$(echo "$currentVersionName" | cut -d '.' -f3)
@@ -101,7 +101,7 @@
 	echo "time to update changelogs and README"
 elif [ $phase -eq 1 ]
 then
-	newVersionName=$(grep -Eo 'versionName = "[0-9\.]+"' app/build.gradle.kts | cut -d '=' -f2 | tr -d ' "')
+	newVersionName=$(grep -Eo 'versionName = "[0-9\.]+[^"]*"' app/build.gradle.kts | cut -d '=' -f2 | tr -d ' "')
 	newVersionCode=$(grep 'versionCode' app/build.gradle.kts | cut -d '=' -f2 | tr -d ' ')
 	if ! find metadata -type d -name changelogs -print0 | xargs -0 -I{} [ -f "{}/$newVersionCode.txt" ]
 	then
@@ -138,7 +138,7 @@ 	git switch develop
 	git merge master
 elif [ $phase -eq 2 ]
 then
-	newVersionName=$(grep -Eo 'versionName = "[0-9\.]+"' app/build.gradle.kts | cut -d '=' -f2 | tr -d ' "')
+	newVersionName=$(grep -Eo 'versionName = "[0-9\.]+[^"]*"' app/build.gradle.kts | cut -d '=' -f2 | tr -d ' "')
 	git tag -s -m "v${newVersionName}" "v${newVersionName}"
 	git push origin --tags
 	git switch develop