diff --git a/src/common/network.cpp b/src/common/network.cpp
index c71b5c2..5f63636 100644
--- a/src/common/network.cpp
+++ b/src/common/network.cpp
@@ -41,6 +41,7 @@ Network::Network(const NetworkId &networkid, QObject *parent)
     _networkName(QString("<not initialized>")),
     _currentServer(QString()),
     _connected(false),
+    _away(false),
     _connectionState(Disconnected),
     _prefixes(QString()),
     _prefixModes(QString()),
@@ -499,6 +500,10 @@ void Network::setMyNick(const QString &nickname) {
   if(!_myNick.isEmpty() && !ircUser(myNick())) {
     newIrcUser(myNick());
   }
+  //Sets this->_away and avoids duplicating connection if nick is changed, there's probably a better way of doing this?
+  setAway(me()->isAway());
+  disconnect(me(), SIGNAL(awaySet(bool)), this, 0);
+  connect(me(), SIGNAL(awaySet(bool)), this, SLOT(setAway(bool)));
   emit myNickSet(nickname);
 }
 
@@ -514,6 +519,13 @@ void Network::setIdentity(IdentityId id) {
   emit identitySet(id);
 }
 
+void Network::setAway(const bool &away) {
+  if(away != _away) {
+    _away = away;
+    emit awaySet(away);
+  }
+}
+
 void Network::setServerList(const QVariantList &serverList) {
   _serverList = fromVariantList<Server>(serverList);
   emit serverListSet(serverList);
diff --git a/src/common/network.h b/src/common/network.h
index 704d67a..8d25581 100644
--- a/src/common/network.h
+++ b/src/common/network.h
@@ -56,6 +56,7 @@ class Network : public SyncableObject {
   Q_PROPERTY(QByteArray codecForDecoding READ codecForDecoding WRITE setCodecForDecoding STORED false)
   Q_PROPERTY(IdentityId identityId READ identity WRITE setIdentity STORED false)
   Q_PROPERTY(bool isConnected READ isConnected WRITE setConnected STORED false)
+  Q_PROPERTY(bool away READ isAway WRITE setAway STORED false)
   //Q_PROPERTY(Network::ConnectionState connectionState READ connectionState WRITE setConnectionState STORED false)
   Q_PROPERTY(int connectionState READ connectionState WRITE setConnectionState STORED false)
   Q_PROPERTY(bool useRandomServer READ useRandomServer WRITE setUseRandomServer STORED false)
@@ -143,6 +144,7 @@ public:
   inline const QString &myNick() const { return _myNick; }
   inline int latency() const { return _latency; }
   inline IrcUser *me() const { return ircUser(myNick()); }
+  inline bool isAway() const { return _away; }
   inline IdentityId identity() const { return _identity; }
   QStringList nicks() const;
   inline QStringList channels() const { return _ircChannels.keys(); }
@@ -215,6 +217,7 @@ public slots:
   virtual void setMyNick(const QString &mynick);
   void setLatency(int latency);
   void setIdentity(IdentityId);
+  void setAway(const bool &away);
 
   void setServerList(const QVariantList &serverList);
   void setUseRandomServer(bool);
@@ -276,6 +279,7 @@ signals:
   void myNickSet(const QString &mynick);
   void latencySet(int latency);
   void identitySet(IdentityId);
+  void awaySet(bool away);
 
   void serverListSet(QVariantList serverList);
   void useRandomServerSet(bool);
@@ -319,6 +323,7 @@ private:
   QString _networkName;
   QString _currentServer;
   bool _connected;
+  bool _away;
   ConnectionState _connectionState;
 
   QString _prefixes;
diff --git a/src/uisupport/networkmodelcontroller.cpp b/src/uisupport/networkmodelcontroller.cpp
index ef1a020..0dc847a 100644
--- a/src/uisupport/networkmodelcontroller.cpp
+++ b/src/uisupport/networkmodelcontroller.cpp
@@ -196,20 +196,24 @@ void NetworkModelController::actionTriggered(QAction *action) {
 }
 
 void NetworkModelController::handleNetworkAction(ActionType type, QAction *) {
-  if(type == NetworkConnectAll || type == NetworkDisconnectAll) {
+  if(type == NetworkConnectAll || type == NetworkDisconnectAll || type == NetworkAwayAll || type == NetworkBackAll) {
     foreach(NetworkId id, Client::networkIds()) {
       const Network *net = Client::network(id);
       if(type == NetworkConnectAll && net->connectionState() == Network::Disconnected)
         net->requestConnect();
-      if(type == NetworkDisconnectAll && net->connectionState() != Network::Disconnected)
+      else if(type == NetworkDisconnectAll && net->connectionState() != Network::Disconnected)
         net->requestDisconnect();
+      else if(type == NetworkBackAll && net->connectionState() != Network::Disconnected && net->isAway())
+        Client::userInput(BufferInfo::fakeStatusBuffer(id), QString("/AWAY"));
+      else if(type == NetworkAwayAll && net->connectionState() != Network::Disconnected && !net->isAway())
+        Client::userInput(BufferInfo::fakeStatusBuffer(id), QString("/AWAY %1").arg(Client::identity(net->identity())->awayReason()));
     }
     return;
   }
 
   if(!indexList().count())
     return;
-
+  
   const Network *network = Client::network(indexList().at(0).data(NetworkModel::NetworkIdRole).value<NetworkId>());
   Q_CHECK_PTR(network);
   if(!network)
@@ -222,6 +226,12 @@ void NetworkModelController::handleNetworkAction(ActionType type, QAction *) {
     case NetworkDisconnect:
       network->requestDisconnect();
       break;
+    case NetworkBack:
+      Client::userInput(BufferInfo::fakeStatusBuffer(network->networkId()), QString("/AWAY"));
+      break;
+    case NetworkAway:
+      Client::userInput(BufferInfo::fakeStatusBuffer(network->networkId()),
+                        QString("/AWAY %1").arg(Client::identity(network->identity())->awayReason()));
     default:
       break;
   }
diff --git a/src/uisupport/networkmodelcontroller.h b/src/uisupport/networkmodelcontroller.h
index 0aa5860..608a994 100644
--- a/src/uisupport/networkmodelcontroller.h
+++ b/src/uisupport/networkmodelcontroller.h
@@ -46,6 +46,10 @@ public:
     NetworkDisconnect = 0x02,
     NetworkConnectAll = 0x03,
     NetworkDisconnectAll = 0x04,
+    NetworkAway = 0x05,
+    NetworkBack = 0x06,
+    NetworkAwayAll = 0x07,
+    NetworkBackAll = 0x08,
 
     // Buffer actions
     BufferMask = 0xf0,
diff --git a/src/uisupport/tabcompleter.cpp b/src/uisupport/tabcompleter.cpp
index 2b60cdd..5f44bd5 100644
--- a/src/uisupport/tabcompleter.cpp
+++ b/src/uisupport/tabcompleter.cpp
@@ -62,8 +62,13 @@ void TabCompleter::buildCompletionList() {
     return;
 
   QString tabAbbrev = inputLine->text().left(inputLine->cursorPosition()).section(' ',-1,-1);
-  QRegExp regex(QString("^[^a-zA-Z]*").append(QRegExp::escape(tabAbbrev)), Qt::CaseInsensitive);
+  QRegExp regex(QString("^[^a-zA-Z#]*").append(QRegExp::escape(tabAbbrev)), Qt::CaseInsensitive);
 
+  //Adds each channel on network to CompletionMap for all buffers.
+  foreach(QString channel, _currentNetwork->channels()) {
+    if(regex.indexIn(channel) > -1)
+      completionMap[channel.toLower()] = channel;
+  }
   switch(static_cast<BufferInfo::Type>(currentIndex.data(NetworkModel::BufferTypeRole).toInt())) {
   case BufferInfo::ChannelBuffer:
     { // scope is needed for local var declaration
diff --git a/src/uisupport/toolbaractionprovider.cpp b/src/uisupport/toolbaractionprovider.cpp
index 43cb41d..53752db 100644
--- a/src/uisupport/toolbaractionprovider.cpp
+++ b/src/uisupport/toolbaractionprovider.cpp
@@ -24,12 +24,15 @@
 #include "toolbaractionprovider.h"
 
 #include "iconloader.h"
+#include "identity.h"
 
 ToolBarActionProvider::ToolBarActionProvider(QObject *parent)
 : NetworkModelController(parent)
 {
-  registerAction(NetworkConnectAll, MainBarIcon("network-connect"), tr("Connect"))->setToolTip(tr("Connect to IRC"));
-  registerAction(NetworkDisconnectAll, MainBarIcon("network-disconnect"), tr("Disconnect"))->setToolTip(tr("Disconnect from IRC"));
+  registerAction(NetworkConnectAll, MainBarIcon("network-connect"), tr("Connect"))->setToolTip(tr("Connect to all"));
+  registerAction(NetworkDisconnectAll, MainBarIcon("network-disconnect"), tr("Disconnect"))->setToolTip(tr("Disconnect from all"));
+  registerAction(NetworkBackAll, MainBarIcon("im-user"), tr("Back"))->setToolTip(tr("Back to all"));
+  registerAction(NetworkAwayAll, MainBarIcon("im-user-away"), tr("Away"))->setToolTip(tr("Away from all"));
 
   registerAction(BufferPart, MainBarIcon("irc-close-channel"), tr("Part"))->setToolTip(tr("Leave currently selected channel"));
   registerAction(JoinChannel, MainBarIcon("irc-join-channel"), tr("Join"))->setToolTip(tr("Join a channel"));
@@ -47,20 +50,24 @@ ToolBarActionProvider::ToolBarActionProvider(QObject *parent)
 
   //registerAction(ShowChannelList, SmallIcon("format-list-unordered"), tr("Show Channel List"));
   //registerAction(ShowIgnoreList, tr("Show Ignore List"));
-
-  _networksConnectMenu = new QMenu();
-  _networksConnectMenu->setSeparatorsCollapsible(false);
-  _networksConnectMenu->addSeparator();
-  _networksConnectMenu->addAction(tr("Connect to all"));
-  action(NetworkConnectAll)->setMenu(_networksConnectMenu);
-  action(NetworkConnectAll)->setEnabled(false);
-
-  _networksDisconnectMenu = new QMenu();
-  _networksDisconnectMenu->setSeparatorsCollapsible(false);
-  _networksDisconnectMenu->addSeparator();
-  _networksDisconnectMenu->addAction(tr("Disconnect from all"));
-  action(NetworkDisconnectAll)->setMenu(_networksDisconnectMenu);
-  action(NetworkDisconnectAll)->setEnabled(false);
+  
+  //A cleaner way to do this, rather than basically copy-pasting code. Allows for easy adding of menus if needed.
+  _actionMenus[NetworkConnectAll] = new QMenu();
+  _actionMenus[NetworkDisconnectAll] = new QMenu();
+  _actionMenus[NetworkBackAll] = new QMenu();
+  _actionMenus[NetworkAwayAll] = new QMenu();
+
+  foreach(ActionType type, _actionMenus.keys()) {
+    _actionMenus[type] = new QMenu();
+    Action *act = action(type);
+    QMenu *menu = _actionMenus[type];
+    
+    menu->setSeparatorsCollapsible(false);
+    menu->addSeparator();
+    menu->addAction(act->toolTip(), act, SLOT(trigger()));
+    act->setMenu(menu);
+    act->setEnabled(false);
+  }
 
   connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(networkCreated(NetworkId)));
   connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(networkRemoved(NetworkId)));
@@ -84,6 +91,8 @@ void ToolBarActionProvider::addActions(QToolBar *bar, ToolBarType type) {
     case MainToolBar:
       bar->addAction(action(NetworkConnectAll));
       bar->addAction(action(NetworkDisconnectAll));
+      bar->addAction(action(NetworkBackAll));
+      bar->addAction(action(NetworkAwayAll));
       bar->addAction(action(JoinChannel));
       bar->addAction(action(BufferPart));
       break;
@@ -137,19 +146,30 @@ void ToolBarActionProvider::handleGeneralAction(ActionType type, QAction *action
 
 void ToolBarActionProvider::networkCreated(NetworkId id) {
   const Network *net = Client::network(id);
-  Action *act = new Action(net->networkName(), this);
-  _networkActions[id] = act;
-  act->setObjectName(QString("NetworkAction-%1").arg(id.toInt()));
-  act->setData(QVariant::fromValue<NetworkId>(id));
+  Action *connectAct = new Action(net->networkName(), this);
+  _connectActions[id] = connectAct;
+  connectAct->setObjectName(QString("ConnectAction-%1").arg(id.toInt()));
+  connectAct->setData(QVariant::fromValue<NetworkId>(id));
+  
+  Action *awayAct = new Action(net->networkName(), this);
+  _awayActions[id] = awayAct;
+  awayAct->setObjectName(QString("AwayAction-%1").arg(id.toInt()));
+  awayAct->setData(QVariant::fromValue<NetworkId>(id));
+  
   connect(net, SIGNAL(updatedRemotely()), SLOT(networkUpdated()));
-  connect(act, SIGNAL(triggered()), SLOT(connectOrDisconnectNet()));
+  connect(net, SIGNAL(awaySet(bool)), SLOT(awayUpdated()));
+  connect(connectAct, SIGNAL(triggered()), SLOT(connectOrDisconnectNet()));
+  connect(awayAct, SIGNAL(triggered()), SLOT(awayOrBackNet()));
   networkUpdated(net);
 }
 
 void ToolBarActionProvider::networkRemoved(NetworkId id) {
-  Action *act = _networkActions.take(id);
-  if(act)
-    act->deleteLater();
+  Action *awayAct = _awayActions.take(id);
+  if(awayAct)
+    awayAct->deleteLater();
+  Action *connectAct = _connectActions.take(id);
+  if(connectAct)
+    connectAct->deleteLater();
 }
 
 void ToolBarActionProvider::networkUpdated(const Network *net) {
@@ -157,30 +177,65 @@ void ToolBarActionProvider::networkUpdated(const Network *net) {
     net = qobject_cast<const Network *>(sender());
   if(!net)
     return;
-  Action *act = _networkActions.value(net->networkId());
-  if(!act)
+  Action *connectAct = _connectActions.value(net->networkId());
+  Action *awayAct = _awayActions.value(net->networkId());
+  if(!connectAct || !awayAct)
     return;
 
-  _networksConnectMenu->removeAction(act);
-  _networksDisconnectMenu->removeAction(act);
+  foreach(QMenu *menu, _actionMenus) {
+    menu->removeAction(connectAct);
+    menu->removeAction(awayAct);
+  }
+  
+  connectAct->setText(net->networkName());
+  awayAct->setText(net->networkName());
+  if (net->connectionState() == Network::Disconnected) {
+    addActionToMenu(connectAct, menu(NetworkConnectAll));
+  } else {
+    addActionToMenu(connectAct, menu(NetworkDisconnectAll));
+    if (net->isAway())
+      addActionToMenu(awayAct, menu(NetworkBackAll));
+    else
+      addActionToMenu(awayAct, menu(NetworkAwayAll));
+  }
+  
+  foreach(ActionType type, _actionMenus.keys())
+    action(type)->setEnabled(menu(type)->actions().count() > 2);
 
-  QMenu *newMenu = net->connectionState() != Network::Disconnected ? _networksDisconnectMenu : _networksConnectMenu;
-  act->setText(net->networkName());
+  action(JoinChannel)->setEnabled(menu(NetworkDisconnectAll)->actions().count() > 2);
+}
 
-  const int lastidx = newMenu->actions().count() - 2;
-  QAction *beforeAction = newMenu->actions().at(lastidx);
-  for(int i = 0; i < newMenu->actions().count() - 2; i++) {
-    QAction *action = newMenu->actions().at(i);
-    if(net->networkName().localeAwareCompare(action->text()) < 0) {
+void ToolBarActionProvider::awayUpdated(const Network *net) {
+  if(!net)
+    net = qobject_cast<const Network *>(sender());
+  if(!net || net->connectionState() == Network::Disconnected)
+    return;
+  Action *awayAct = _awayActions.value(net->networkId());
+  if (!awayAct)
+    return;
+  
+  menu(NetworkBackAll)->removeAction(awayAct);
+  menu(NetworkAwayAll)->removeAction(awayAct);
+  if (net->isAway())
+    addActionToMenu(awayAct, menu(NetworkBackAll));
+  else
+    addActionToMenu(awayAct, menu(NetworkAwayAll));
+  
+  action(NetworkBackAll)->setEnabled(menu(NetworkBackAll)->actions().count() > 2);
+  action(NetworkAwayAll)->setEnabled(menu(NetworkAwayAll)->actions().count() > 2);
+}
+
+void ToolBarActionProvider::addActionToMenu(Action *act, QMenu *menu) {
+  const int lastidx = menu->actions().count() - 2;
+  QAction *beforeAction = menu->actions().at(lastidx);
+  for(int i = 0; i < menu->actions().count() - 2; i++) {
+    QAction *action = menu->actions().at(i);
+    if(act->text().localeAwareCompare(action->text()) < 0) {
       beforeAction = action;
       break;
     }
   }
-  newMenu->insertAction(beforeAction, act);
-
-  action(NetworkConnectAll)->setEnabled(_networksConnectMenu->actions().count() > 2);
-  action(NetworkDisconnectAll)->setEnabled(_networksDisconnectMenu->actions().count() > 2);
-  action(JoinChannel)->setEnabled(_networksDisconnectMenu->actions().count() > 2);
+  menu->insertAction(beforeAction, act);
 }
 
 void ToolBarActionProvider::connectOrDisconnectNet() {
@@ -191,8 +246,25 @@ void ToolBarActionProvider::connectOrDisconnectNet() {
   if(!net)
     return;
 
-  if(net->connectionState() == Network::Disconnected) net->requestConnect();
-  else net->requestDisconnect();
+  if(net->connectionState() == Network::Disconnected)
+    net->requestConnect();
+  else
+    net->requestDisconnect();
+}
+
+void ToolBarActionProvider::awayOrBackNet() {
+  QAction *act = qobject_cast<QAction *>(sender());
+  if(!act)
+    return;
+  const Network *net = Client::network(act->data().value<NetworkId>());
+  if(!net)
+    return;
+
+  BufferInfo bufferInfo = BufferInfo::fakeStatusBuffer(net->networkId());
+  if(net->isAway())
+    Client::userInput(bufferInfo, QString("/AWAY"));
+  else
+    Client::userInput(bufferInfo, QString("/AWAY %1").arg(Client::identity(net->identity())->awayReason()));
 }
 
 //void ToolBarActionProvider::
diff --git a/src/uisupport/toolbaractionprovider.h b/src/uisupport/toolbaractionprovider.h
index 2ee8271..e3d6663 100644
--- a/src/uisupport/toolbaractionprovider.h
+++ b/src/uisupport/toolbaractionprovider.h
@@ -41,6 +41,7 @@ public:
   void addActions(QToolBar *, ToolBarType type);
 
 protected:
+  inline QMenu *menu(ActionType action) const;
   virtual void handleNetworkAction(ActionType, QAction *);
   virtual void handleBufferAction(ActionType, QAction *);
   virtual void handleNickAction(ActionType, QAction *);
@@ -50,7 +51,9 @@ private slots:
   void networkCreated(NetworkId id);
   void networkRemoved(NetworkId id);
   void networkUpdated(const Network *net = 0);
+  void awayUpdated(const Network *net = 0);
   void connectOrDisconnectNet();
+  void awayOrBackNet();
 
   void currentBufferChanged(const QModelIndex &);
   void nickSelectionChanged(const QModelIndexList &);
@@ -58,10 +61,14 @@ private slots:
   void updateStates();
 
 private:
-  QMenu *_networksConnectMenu, *_networksDisconnectMenu;
-  QHash<NetworkId, Action *> _networkActions;
+  QHash<ActionType, QMenu *> _actionMenus;
+  QHash<NetworkId, Action *> _connectActions, _awayActions;
   QModelIndex _currentBuffer;
   QModelIndexList _selectedNicks;
+  
+  void addActionToMenu(Action *action, QMenu *menu);
 };
 
+QMenu *ToolBarActionProvider::menu(ActionType type) const { return _actionMenus.value(type); }
+
 #endif
