-
-What is Sylpheed Claws?
-----------------------
+README.claws
+------------
+
+Summary:
+
+1. What is Sylpheed Claws?
+2. Switching between Sylpheed Claws and Sylpheed
+ * From Sylpheed to Sylpheed Claws
+ * From Sylpheed Claws to Sylpheed
+3. Things Claws does different
+ * auto address replacement in summary view
+ * manual selection of MIME types for attachments
+ * sharing mail folders
+ * default to address for folders
+ * threading mode per folder
+ * simplify subject string
+ * pixmap themes
+ * user definable actions
+ * spell checking (with installation instructions)
+ * new cache
+ * extended search in quick search
+ * 'dynamic' signatures
+4. How to contribute
+5. How to request features
+6. Installing Claws from CVS
+7. History
+
+
+
+1. What is Sylpheed Claws?
+--------------------------
Sylpheed Claws is a bleeding edge branch of Sylpheed, a light weight mail
user agent for UNIX. Features in this branch may (or may not) end up in
Sylpheed or Main.
-Switching to Claws
-------------------
-From the user perspective Claws is just a fancy Sylpheed, so it uses the
-same sylpheed setting files located in ~/.sylpheed.
+2. Switching between Sylpheed Claws and Sylpheed
+------------------------------------------------
-It's always a good idea to back up all files in ~/.sylpheed in case
-you want to switch back to Sylpheed. (You don't have to backup the
-directories.)
+ From Sylpheed to Sylpheed Claws
+ -------------------------------
-There are some things that frequently come up when switching to Claws:
+ From the user perspective Claws is just a fancy Sylpheed, so it uses the
+ same Sylpheed setting files located in ~/.sylpheed.
+ It's always a good idea to back up all files in ~/.sylpheed in case
+ you want to switch back to Sylpheed. (You don't have to backup the
+ directories.)
-* When replying, the original sender's text is not quoted anymore.
+ There are some things that frequently come up when switching to Claws:
- Claws has a different quote format handler. Add either %Q or %q to the
- quote format text. Also click the button "Description of symbols"
- for more quotation symbols.
+ * What happened to my filter rules?
-* Why does the advanced filtering system not work?
+ Claws uses a new filtering system. Your old Sylpheed filter rules will not
+ be used. In subdirectory tools/ of the distribution there is a Perl script
+ called filter_conv.pl which converts old filter rules to the claws
+ filtering system, see tools/README for details.
+
+ * What happened to the compose email and compose news buttons?
- Claws uses the new filtering system as soon as you define a new rule for it.
- Your old sylpheed filter rules will not be used. In subdirectory tools/ of
- the distribution there is a Perl script called filter_conv.pl which convers
- old filter rules to the claws filtering system.
-
+ There's a composite button for both composing mail and news. You can toggle
+ between composing mail and news by clicking on the button with the triangle.
+
+
+ * And to the Preferences and Execute buttons?
+
+ Sorry, they're not there.
-* What happened to the compose email and compose news buttons?
- There's a composite button for both composing mail and news. You can toggle
- between composing mail and news by clicking on the button with the triangle.
+ From Sylpheed Claws to Sylpheed
+ -------------------------------
+ Moving from Claws to Sylpheed is also simple. Sylpheed should neglect the things
+ Claws put in the settings files. This also means that the old rules will work
+ again.
-* And to the Preferences and Execute buttons?
+ If you want to switch back to Claws at a later time, make sure you back up at least
+ ~/.sylpheed/matcherrc (the Claws filtering rules), and ~/.sylpheed/sylpheedrc
+ (which may have some claws specific settings).
- Sorry, they're not there.
+ When switching back to Sylpheed you will not lose messages or message flags (color
+ labels, read / unread status of messages).
+ Switching between Sylpheed Claws and Sylpheed on a regular basis
+ ----------------------------------------------------------------
+ If you want to have both claws and main installed concurrently simply pass them
+ a different --prefix when doing ./configure. Then use the script 'sylpheed-switcher',
+ (which is provided in the tools directory), to launch the version you require without
+ fear of losing specific settings related to either claws or main. Further details can
+ be found in tools/README.
-Things Claws does different
----------------------------
+3. Things Claws does different
+------------------------------
Claws does a lot of things different. Here a quick run-down of things that
-are hardly noticable, but deserve mentioning:
+are hardly noticeable, but deserve mentioning:
* auto address replacement in summary view
+-----------------------------------
This matches a plain email address with a person in the address book. This
feature is enabled in Common Preferences | Tab Display | SummaryView Group |
Display sender using addressbook
* manual selection of MIME types for attachments
+-----------------------------------
You can change the MIME type of an attachment by right-clicking in the
attachment list, selecting Property in the menu. The MIME type list
is a combo box with the known MIME types.
* sharing mail folders
- You can also share or use shared mail folders. Right-click a folder and
+ -----------------------------------
+ You can also share or use shared mail folders. Right-click a folder and
select Property. Change the Folder chmod setting.
-* default reply-to address for folders
- Most people filter mailing list mails to separate folders. Claws allows
- you to associate a folder with a mailing list. Right-click a folder,
- select Property and change the Default To setting.
+* default to address for folders
+ -----------------------------------
+ Most people filter mailing list mails to separate folders. Claws allows
+ you to associate a folder with a mailing list or a person. Right-click a
+ folder, select Property and change the Default To setting. When you
+ compose a new mail, when this folder is selected the recipient address
+ will be set to this address.
(NOTE: this is also a shoot-yourself-in-the-foot-setting! If you want
to send a private mail, don't have a folder selected with this setting
set.)
-* threading mode per folder
- Folders can have their own threading and sorting mode. Just select a
- folder, and set their threading and sorting mode.
-
-* spell checking
- Spell checking using pspell library (http://pspell.sourceforge.net)
- can can be compiled in. You must have dictionaries available. You can
- use aspell (http://aspell.sourceforge.net) or ispell dictionaries. For
- the former, you have to install aspell. For the latter, you have to
- install the pspell-ispell module (see pspell home page) in addition
- to ispell. Spell checking can then enabled in Configuration |Common
- Preferences | Compose. Use the file selector and select any file in
- the directory where the dictionaries (*.pwli) are. Do not simply enter
- the path in the text entry. You can select the default dictionary.
- When composing, use the right-button click.
-
-* quotation wrapping
- Quotation is wrapped like VIM would wrap it (at least that was the
- goal). To enable this feature go to Common preferences->Compose and
- make sure Wrap quotation is enabled. The text is automatically
- wrapped when you reply to an e-mail if this feature is enabled.
+* pixmap themes
+-----------------------------------
+ To use different icon sets you need to create a directory:
+ mkdir ~/.sylpheed/themes
+ Icon sets should be placed in this directory in their own sub-directory.
+ They are then selectable from Pixmap Theme on the Interface tab of Commmon
+ Preferences.
+
+* user definable actions
+-----------------------------------
+ The "actions" feature is a convenient way for the user to launch external
+ commands to process a complete message file including headers and body or
+ just one of its parts. It allows also the use of an external command to
+ filter the whole text or just a selected part in the message window or in
+ the compose window. This is a generic tool that allows to do any uncommon
+ actions on the messages, and thus extends the possibilities of Sylpheed.
+ For example, Sylpheed does not include the rot13 cyphering algorithm
+ popular in some newsgroups. It does not support natively armored
+ encryption or clear signing. It does not support uuencoded messages. As
+ all these features can be handled by external programs, the actions
+ provide a convenient way to use them from the menu bar.
+
+ a. Usage
+ --------
+
+ To create a new action, go to Configuration -> Actions.... The "Action
+ Creation" dialog offers to enter the Menu name that will trigger the
+ command. The created menu will be found in the Tools -> Actions submenu.
+ By inserting a slash / in the menu name, you create a submenu.
+
+ The command is entered in the Command line entry. Note that Sylpheed
+ stores every single email in a separate file. This allows to use the
+ following syntax for the command:
+
+ * %f denotes the file name of the selected message. If you selected more
+ than one, then the command will be launched for each message with
+ the appropriate file name
+ * %F denotes the list of the file names of the selected message. If only
+ one message is selected, this amounts to %f, but if more messages
+ are selected, then the command will be launched only once with the
+ list of the file names. (You can use both %f and %F in one command:
+ then the command will be launched for each selected message with
+ the name of this message and with the list of all selected
+ messages. I did not find a practical example for this.)
+ * %p denotes the current selected message part of a multipart message.
+ The part is decoded accordingly. If the message is not a multipart
+ message, it denotes the message body.
+ * Prepending >: this will allow you to send to the command's standard
+ input a text that you will enter in a dialog window.
+ * Prepending *: this will allow you to send to the command's standard
+ input a text that you will enter in a dialog window. But in
+ contrast to prepending >, the entered text is hidden (useful when
+ entering passwords).
+ * Appending an ampersand &: this will run the command asynchronously.
+ That means "fire and forget". Sylpheed won't wait for the command
+ to finish, nor will it catch its output or its error messages.
+ * Prepending the vertical bar | (pipe-in): this will send the current
+ displayed text or the current selected text from the message view
+ or the compose window to the command standard input. The command
+ will silently fail if more than one message is selected.
+ * Appending the vertical bar | (pipe-out): this will replace the current
+ displayed text or the current selected text from the message window
+ or the compose window by the command standard output. The command
+ will silently fail if more than one message is selected.
+
+ Note: It is not possible to use actions containing %f, %F or %p from the
+ compose window.
+
+ When a command is run, and unless it is run asynchronously, Sylpheed will
+ be insensitive to any interaction and it will wait for the command to
+ finish. If the command takes too long (5 seconds), it will popup a dialog
+ window allowing to stop it. This dialog will also be displayed as soon as
+ the command has some output: error messages or even its standard output
+ when the command is not a "pipe-out" command. When multiple commands are
+ being run, they are run in parallel and each command output is separated
+ from the outputs of the others.
+
+ a. Examples
+ -----------
+
+ Here are some examples that are listed in the same syntax as used for
+ storing the actions list. You can copy and past the definition in your
+ ~/.sylpheed/actionsrc file (exit Sylpheed before). The syntax is very
+ simple: one line per action, each action contains the menu name and the
+ command line separated by a colon and a space ": "
+
+ Purpose: rot13 cyphering
+ Definition: Rot13: |tr a-zA-Z n-za-mN-ZA-M|
+ Details: This will apply the rot13 cyphering algorithm to the
+ (selected) text in the message/compose view.
+
+ Purpose: Decoding uuencoded messages
+ Definition: UUdeview: xdeview %F&
+ Details: xdeview comes with uudeview. If an encoded file is split in
+ multiple messages, just select them all and run the command.
+
+ Purpose: Display uuencoded image
+ Definition: Display uuencoded: uudec %f&
+ Details: Displays uuencoded files. The uudec[1] script can be found in
+ the 'tools' directory of the distribution package.
+
+ Purpose: Alter messages
+ Definition: Edit message: gvim -f %F
+ Details: Allows editing of any received message. Can be used to remove
+ unneeded message parts, etc.
+
+ Purpose: Pretty format
+ Definition: Par: |par 72Tbgjqw74bEe B=._A_a 72bg|
+ Details: par is a utility that can pretty format any text. It does a
+ very good job in indenting quoted messages, and justifying
+ text. Used when composing a message
+
+ Purpose: Browse
+ Definition: Part/Dillo: dillo %p&
+ Details: Browse the selected message part in Dillo.
+
+ Purpose: Clear Sign
+ Definition: GnuPG/Clear Sign: |gpg-sign-syl|
+ Details: Clear sign a message. The gpg-sign-syl[2] script is responsible
+ for asking the passphrase and for running gnupg.
+
+ Purpose: Verify Clear Signed
+ Definition: GnuPG/Verify: |gpg --no-tty --verify
+ Details: Verify clear signed messages. The result is displayed in the
+ actions output dialog.
+
+ Purpose: Decrypt ASCII Armored
+ Definition: GnuPG/Decrypt: *gpg --no-tty --command-fd 0 --passphrase-fd 0 --decrypt %f|
+ Details: Decrypt ASCII armored messages. The passphrase is entered
+ into the opened action's input dialog.
+
+ [1] The uudec script can be found in the 'tools' directory of the
+ distribution package. It needs uudecode and ImageMagick's display. The
+ latter can be replaced by any image viewer that can get input from
+ standard input. The script could also be modified to use temporary files
+ instead of standard input.
+
+ [2] The gpg-sign-syl script can be found in the 'tools' directory of the
+ distribution package.
+
+* Spell checker for Sylpheed-Claws
+-----------------------------------
+ a. Requirements
+ b. Configuration and installation
+ c. Usage
+ d. Known problems
+
+ a. Requirements
+ ---------------
+
+ Note:
+ As for version 0.8.3 (and cvs version 0.8.2claws3), Sylpheed-Claws uses
+ the new GNU/aspell 0.50 for spell checking instead of the obsolete pspell
+ and old aspell 0.33.x. You will need to upgrade your system. See
+ http://www.gnu.org/software/aspell for instructions on how to do this.
+
+ The spell checker in Sylpheed requires the new GNU/aspell library
+ (http://www.gnu.org/software/aspell), version 0.50 or newer.
+
+ You also need the dictionaries. Check GNU/aspell home page for how
+ to download and install them.
+
+ NB: The old dictionaries used by the old aspell will not work.
+
+ b. Configuring Sylpheed
+ -----------------------
+
+ Spell checking is enabled if you configure Sylpheed appropriately. Add
+ the option '--enable-aspell' when configuring. E.g.:
+
+ ./configure --enable-aspell
+
+ The configure script needs the 'aspell' executable to be in your path.
+ If it is in unusual places, use '--with-aspell-prefix' to tell the path of
+ the aspell executable. E.g., if aspell's full path is
+ /foo/bar/bin/aspell, then use:
+
+ ./configure --enable-aspell --with-aspell-prefix=/foo/bar
+
+ The '--with-aspell-prefix=PREFIX' option will let the configure
+ script search for includes and libraries in PREFIX/include and PREFIX/lib.
+
+ You can also specify manually the includes and libraries path by using
+ either following options:
+
+ --with-aspell-includes=/foo/bar/include
+
+ and/or
+
+ --with-aspell-libs=/rab/oof/lib
+
+ as appropriate.
+
+ The configure script summarizes the options compiled in. Check that
+ it lists 'GNU/aspell = yes'.
+
+ Then proceed as usual, with 'make' and 'make install'.
+
+ c. Usage
+ --------
+
+ NOTE: if you upgraded from Sylpheed-Claws 0.8.2 (or cvs version 0.8.2claws2)
+ or earlier, please check if the dictionary path was updated in the
+ Configuration -> Common Preferences -> Spell Checker menu. If not, update
+ it accordingly as explained below.
+
+ After successful compiling, you need to tell Sylpheed where your
+ dictionaries reside. The configure script should have found it,
+ but in case it did not, run 'aspell config dict-dir' on the
+ shell to get the path to the dictionaries.
+
+ Then run Sylpheed and go to Configuration -> Common preferences ->
+ Spell Checker. Check the box 'Enable spell checker' and
+ use the file selector ('...' button) to select the path where the
+ dictionaries reside. Within the file selector, go to that directory
+ and select *any* file in the file lists. Click OK. Then, you should
+ be able to select your default dictionary.
+
+ When composing, misspelled words are highlighted. Click on any
+ highlighted word with the right mouse button to get a list of
+ suggestions. The first entry of the menu just displays the unknown
+ word. Selecting 'Accept in this session' (or hitting MOD1-Space,
+ where MOD1 is usually the ALT key) will ignore this word and accept
+ it in this message. Selecting the next entry, "Add to dictionary", which
+ is bound to MOD1-Enter combination, will add the unknown word to your
+ personal dictionary to learn it. The next entries are the suggested words.
+ The first 15 suggestions can be accessed by typing one of the first letters
+ of Latin alphabet (if this does not suit your language, please send
+ a mail to melvin.hadasht@free.fr). Aspell has a 'learn from mistake'
+ function that can be used by pressing the MOD1 key and selecting the
+ suggestion (with the keyboard or with the mouse). See GNU/aspell manual
+ ยง6.3 for an explanation of this feature (also called 'replacement storing').
+
+ If you click with the right mouse button everywhere else, or if you
+ shift-right-click even on a misspelled word, you get the
+ configuration menu. 'Check all' highlights all misspelled words.
+ With this menu, you can also change the dictionary while editing.
+ Finally, you can change the suggestion mode, and the learn from
+ misktakes feature.
+
+ Spell checking can also be done using keyboard shortcuts. In the
+ 'Edit' menu of the compose window, there are two menus 'Check backwards
+ misspelled word' and 'Forward to next misspelled word'. Add to them
+ appropriate keyboard shortcuts. 'Check backwards misspelled word'
+ checks backwards from cursor position for the first misspelled word.
+ If it finds one, it displays the suggestions lists which can be handled
+ with the keyboard as described before. When the suggestion menu is
+ closed, the cursor returns to its original position to be able to
+ continue editing. The 'Forward to next misspelled word' do the same
+ thing in the other direction but moves the cursor at the end of the
+ misspelled word. This way, you can spell check easily a whole message
+ starting from its beginning and using the 'Forward to next misspelled
+ word' keyboard short cut.
+
+
+ d. Known problems
+ -----------------
+
+ No known problems as the time of this writing (0.8.2claws3).
+
+* simplify subject string
+-----------------------------------
+ It is possible to remove parts of string from the subject line.
+ Example: [Sylpheed-claws-users] This is a test
+ becomes: This is a test
+ This is a per folder property. Right click on a folder and select
+ property, enable Simplify Subject RegExp check box. Example
+ regexp for the above is: \[Sylpheed-claws-(devel|users)\]
+ Another example for the Sylpheed mailing list (not claws!) is:
+ \[sylpheed:[0-9]{5}\]
+
+* new cache
+-----------------------------------
+ New cache is a new data cache structure for sylpheed, that will
+ solve many of the problems sylpheed currently has with updates to
+ flags. But you will also notice a large speed gain when you open
+ these folders.
+
+ New cache uses two new configuration parameters that can be
+ adjusted in ~/.sylpheed/sylpheedrc (no gui for them available yet).
+
+ cache_max_mem_usage (default: 4096)
+ the maximum kB of memory sylpheed should use.
+ It will try to keep the memory usage below this
+ value, but it will always use the assigned
+ amount of memory for speed gain.
+
+ cache_min_keep_time (default: 15)
+ the minimum time in minutes sylpheed will keep
+ the folder cache in memory. If a cache is more
+ recent than this time it will not be freed even
+ if the memory usage is above the maximum. You
+ should probably set this value higher than your
+ mail check interval. Otherwise the cache will
+ always be freed between checks even if the folder
+ is accessed on every check, which will cause much
+ disk IO.
+
+ The check if memory can be freed is currently done after the
+ active folder has been changed or whenever a new cache is read,
+ i.e. triggered by mail incorporation.
+
+ New mails in MH folders are not detected automatically like before,
+ when you enter the folder. You have to update the folder manually,
+ or activate the auto update setting in the options.
There are a lot more options. If you find one, don't hesitate to
mention it.
+* Custom toolbar
+----------------
+ Configuration->Custom toolbar lets you define the toolbar
+ you want. The configuration dialog enables you to set an icon,
+ an appropriate text and map an action to it. Actions to choose
+ from are predefined. You may as well have your "Sylpheed Actions"
+ (refer to "user definable actions" above) on your toolbar.
+ Example:
+ * Configuration->Actions
+ - add an entry "Dillo: dillo %p&"
+ * Configuration->Custom toolbar
+ - select Sylpheed Actions Feature
+ - select "Dillo: dillo %p&" from drop down list
+ - choose an icon and click ok
+
+* extended search in quick search
+---------------------------------
+ This feature allows one to define criteria that messages have
+ to match in order to be displayed in the summary view pane.
+ Search types titled From, Subject and To are self explanatory.
+ Search type extended allows one to use Sylpheed's powerful
+ filtering engine to select messages. Examples:
+ from regexpcase "foo"
+ subject regexp "Bug" & to regexp "sylpheed-claws"
+
+ Additionally, it is possible to use simpler yet equally
+ powerfull patterns for message selections. Mutt users will
+ immediately recognize most of the available patterns:
+
+ Pattern Parameter Selects
+ ----------------------------------------------------
+ a all messages
+ ag # messages whose age is greater than #
+ al # messages whose age is lower than #
+ b S messages which contain S in the message body
+ B S messages which contain S in the whole message
+ c S messages carbon-copied to S
+ C S message is either to: or cc: to S
+ D deleted messages
+ e S messages which contain S in the Sender field
+ E S true if execute "S" succeeds
+ f S messages originating from user S
+ F forwarded messages
+ h S messages which contain header S
+ i S messages which contain S in Message-Id header
+ I S messages which contain S in inreplyto header
+ L locked messages
+ n S messages which are in newsgroup S
+ N new messages
+ O old messages
+ r messages which have been replied to
+ R read messages
+ s S messages which contain S in subject
+ se # messages whose score is equal to #
+ sg # messages whose score is greater than #
+ sl # messages whose score is lower than #
+ Se # messages whose size is equal to #
+ Sg # messages whose size is greater than #
+ Ss # messages whose size is smaller than #
+ t S messages which have been sent to S
+ T marked messages
+ U unread messages
+ x S messages which contain S in References header
+ y S messages which contain S in X-Label header
+
+ # means number
+ S means regexp string
+
+ It is possible to use logical operators AND (&), OR (|) and
+ NOT (! or ~). Case sensitive search is achieved with %.
+ Examples:
+ T marked messages
+ U unread messages
+ f "john beavis" messages from john beavis
+ %f "John Beavis" messages from John Beavis (case sensitive)
+ ~s foo messages which do not have foo in the subject
+ f foo & ~s bar messages from foo that do not have bar in thesubject
+
+* (build in) image viewer
+-----------------------
+ Claws allows to load viewers for mime parts with plugins. To keep
+ the main programs code small and easier to maintain by defining an
+ API for viewers and not having to include every viewer in the code
+ the build in image viewer was removed and put into a plugin. If you
+ wonder why image viewing is not working anymore you probably have
+ to load the plugin.
-How to contribute
------------------
-Write a patch, submit it to the Sylpheed ML, Sylpheed Claws Users ML,
-or bother any of the current Claws developers. There's no way to
-predict whether your patch will or will not end up in Claws or Main.
-Mostly they will. And if not, there's probably nothing wrong with
-your code - or maybe there is. Generally, adding a cool or useful
-thing to your patch will attract a lot of attention of other users
-or developers.
+4. How to contribute
+--------------------
+Sylpheed Main:
+
+ submit it to the Sylpheed ML, Hiroyuki, or Paul Mangan
+ (for incorporation on the Sylpheed Patches page,
+ <http://www.thewildbeast.co.uk/sylpheed/>)
+
+Sylpheed Claws:
+
+ It is highly recommended to use the sourceforge project page
+ of claws. Check:
+ http://sourceforge.net/tracker/?atid=384600&group_id=25528&func=browse
+
+ If that's too troublesome, either contact Paul Mangan or consider
+ posting to the sylpheed claws users mailing list.
+
+ Bugs can be reported with Claws' bugzilla at:
+ http://sylpheed-claws.sourceforge.net/cgi-bin/bugzilla/index.cgi
+
+ Of course you can also post to the sylpheed claws users
+ mailing list.
+
+Also, we really try to incorporate good contributions, but sometimes we
+don't have enough time. If the contribution is really big, or requires
+a long time to stabilize, send a mail to Paul Mangan. We can probably
+arrange access to the Claws branch.
-How to request features
------------------------
+
+
+5. How to request features
+--------------------------
Ask around in both Sylpheed ML and Sylpheed Claws Users ML. Note
that some developers may already thought about your feature, may
perhaps be implementing it - or the feature was already discussed
-and rejected for whatever reason. Don't complain, be patient. Or
-you might want to go ahead and hack a patch for it. That would
-be very cool! (c. How to contribute)
+and rejected for whatever reason. You might want to go ahead and
+hack a patch for it. (That would be very cool!) Another
+possibility is to use the Feature Request Tracker at the
+sourceforge project page.
+
+
+
+6. Installing Claws from CVS
+----------------------------
+
+ a. Downloading
+ --------------
+
+ To download the latest cvs cd to the directory where you wish to download
+ to and type the following information:
+
+ cvs -d:pserver:anonymous@cvs.sylpheed-claws.sourceforge.net:/cvsroot/sylpheed-claws login
+
+ When prompted for a password press the RETURN key.
+ After anonymously logging in:
+
+ cvs -z3 -d:pserver:anonymous@cvs.sylpheed-claws.sourceforge.net:/cvsroot/sylpheed-claws co sylpheed-claws
+
+
+ b. Installing
+ -------------
+
+ To compile and install use the following commands:
+
+ ./autogen.sh [add configure options as required]
+ make
+ make install [as root]
+
+ You will need a full set of development tools installed to be able to run
+ autogen.sh. See also ac/README.
+
+7. History
+----------
+TODO