First of all I'd like to say thank you for valuable feedback! IMO in this discussion we've raised a lot of important questions. But I think one more left - handling of promises rejections. I have the following proposition:

* 'catch(handler)\then(null, handler)' should only be defined in case:

    a) if we would like to handle error and recover from it;
      ```
      // e.code = 1;
      promise.catch(function(e) {
        if (e.code === 1) {
          // ex. it's just network timeout - retry again... 
          return;
        }
      }).then(......);
     ```
   b) if we define it on the last promise in the chain and just would like to log error. 
     ```
      promise.catch(function(e) {
       console.error('Error: ', e);
      });
     ```
     This case I think ideally fits for our ThreadUI.close\back method - it shouldn't return promise to the outside world as nobody uses it and shouldn't(moreover it should be private, as the only external place that uses it is the corresponding unit test). That is why I removed return statement from ThreadUI.back\close methods(after I actually added it in the first version of patch) :)
* if we tried to recover (ex. by analyzing exception type), but wasn't able to do so or just want to log something really important, we shouldn't swallow error and should push it forward in the promise chain:
```
      // e.code = 2;
      promise.catch(function(e) {
        if (e.code === 1) {
          // ex. it's just network timeout - retry again... 
          return;
        }
        // Hmmm.. something unknown let's push it forward
        return Promise.reject(e);
      }).then(......);
```
* if we want to reject promise intentionally and avoid error handling\loging logic we shouldn't pass to reject any parameters:

```
promise.then(function() {
  // cancel further processing intentionally
  if (isNothingCriticalJustCancel) {
    return Promise.reject();
  }
  
  if (isSomethingCriticalHappened) {
    throw new Error(....) or return Promise.reject(new Error(....));
  }
})
```

Do you have any objections\recommendations on that?