public void sendTuples()
        {
            Console.WriteLine("sendTuples starting");
            while (true)
            {
                if (_operator.freeze)
                {
                    _operator.eventSendTuples.WaitOne();
                }
                if (_operator.outputTuples.Count != 0)
                {
                    Tup outputTuple;
                    lock (_operator.outputTuples)
                    {
                        outputTuple = (Tup)_operator.outputTuples[0].Clone();

                        /*foreach (Tup tup in _operator.outputTuples)
                         * {
                         *  Console.WriteLine("tup = " + tup.id);
                         * }*/
                    }

                    lock (_operator.sendAddresses)
                    {
                        string routing            = _operator.routing;
                        int    fieldNumberHashing = -1;
                        if (routing.Contains('('))
                        {
                            routing            = "hashing";
                            fieldNumberHashing = Int32.Parse(_operator.routing.Split('(')[1].Split(')')[0]);
                        }
                        bool receivedAnswer = true;
                        if (_operator.sendAddresses.Count != 0)
                        {
                            List <string> savedReplicaIDs = new List <string>();
                            bool          validID         = false;
                            Console.WriteLine("output tuple ID = " + outputTuple.id);
                            Console.WriteLine("processing number = " + _operator.processingNumber);
                            //Thread.Sleep(10000);
                            _operator.atualizaProcessingNumber();
                            if (outputTuple.id == _operator.processingNumber + 1)
                            {
                                Console.WriteLine("OLAAA");
                                validID        = true;
                                outputTuple.id = _operator.sequenceNumber + 1;
                                foreach (string operatorID in aliveReplicas.Keys)
                                {
                                    int limit        = aliveReplicas[operatorID].Count;
                                    int replicaIndex = -1;
                                    switch (routing)
                                    {
                                    case "primary":
                                        replicaIndex = 0;     //Always the first available replica of each operator
                                        break;

                                    case "random":
                                        Random random = new Random();
                                        replicaIndex = random.Next(0, limit);
                                        break;

                                    case "hashing":
                                        replicaIndex = getHashValue(outputTuple, limit, fieldNumberHashing);
                                        break;
                                    }
                                    Console.WriteLine("BBBBB");
                                    int    id          = aliveReplicas[operatorID][replicaIndex];
                                    string replicaID   = operatorID + "-" + id;
                                    string sendAddress = _operator.sendAddresses[replicaID];
                                    try
                                    {
                                        operatorServices = (OperatorServices)Activator.GetObject(
                                            typeof(OperatorServices),
                                            sendAddress);
                                        Console.WriteLine("Sending to " + sendAddress + " the following tuple -> " + constructTuple(outputTuple));
                                        var task = Task.Run(() => operatorServices.exchangeTuples(outputTuple));
                                        if (task.Wait(TimeSpan.FromSeconds(TIMEOUT)))
                                        {
                                            contador++; // Just to make an aux print in the Console
                                            Console.WriteLine("Received Answer " + contador);
                                            addSequenceNumberToAllReplicas();
                                            addProcessingNumberToAllReplicas();
                                        }
                                        else
                                        {
                                            Console.WriteLine("Did not received answer");
                                            savedReplicaIDs.Add(replicaID);
                                            receivedAnswer = false;
                                            if (_operator.semantics.Equals("at-most-once"))
                                            {
                                                _operator.addSequenceNumberToAllReplicas();
                                                _operator.addProcessingNumberToAllReplicas();
                                            }
                                            throw new DadStormTimeOutException();
                                        }
                                        if (_operator.loggingLevel.Equals("full"))
                                        {
                                            new Thread(() => puppetMasterServices.addMessageToLog(constructMsgToLog(outputTuple))).Start();
                                        }
                                    }
                                    catch (System.Net.Sockets.SocketException e) //Operator crashou
                                    {
                                        Console.WriteLine("I think that Operator " + replicaID + " crashed. SocketException");
                                    }
                                    catch (DadStormTimeOutException e)
                                    {
                                        Console.WriteLine("I think that Operator " + replicaID + " crashed. TimeOutException");
                                    }

                                    catch (Exception e)
                                    {
                                        Console.WriteLine("EXCEPTION = " + e.InnerException.Message);
                                        Console.WriteLine("I think that Operator " + replicaID + " crashed. General Exception");
                                    }
                                }
                            }

                            foreach (string savedReplicaID in savedReplicaIDs)
                            {
                                string failedOperator  = savedReplicaID.Split('-')[0];
                                int    failedReplicaID = Int32.Parse(savedReplicaID.Split('-')[1]);
                                aliveReplicas[failedOperator].Remove(failedReplicaID);
                            }

                            if (_operator.semantics.Equals("at-most-once") && validID ||
                                _operator.semantics.Equals("at-least-once") && (receivedAnswer))
                            {
                                lock (_operator.outputTuples)
                                {
                                    _operator.outputTuples.RemoveAt(0);
                                }
                            }
                            receivedAnswer = false;
                        }
                    }
                }
            }
        }