public void serve() {

    long startTime, endTime;

    try {
      // query = (query)incomingPeer.receive();

      startTime = (new Date()).getTime();

      queryLiteral = query.getLiteral();
      inheritedHistory = (LinkedList) query.getHistory();
      inheritedSupportingRules = query.getSupportingMappings();
      inheritedConflictingRules = query.getConflictingMappings();

      System.out.println("\n\n |||||| New query session ||||||\n");
      System.out.println("\tLocal reasoning for: " + queryLiteral.getSignWithName());

      /*
      if((cachedAnswer=incQueriesCache.getAnswerForLiteral(queryLiteral))!=null)
      {
          System.out.println(" is already cached: " + ((MyBoolean)cachedAnswer.getAnswer()).getMyBoolean() );
          if(queryLiteral.getSign()==true)
              incomingPeer.send(new QueryResponse(cachedAnswer.getAnswer(), cachedAnswer.getSet(), null));
          else
              incomingPeer.send(new QueryResponse(cachedAnswer.getAnswer(), null, cachedAnswer.getSet()));

          return;
      }
      */
      System.out.println("you are querying about: " + queryLiteral);
      if (kb.isRuleInside(KnowledgeBase.localSetName, queryLiteral)) {
        System.out.println("First Step");
        localAnswer = new MyBoolean(false);
        System.out.println("Sec Step");
        currLocalHistory.add(queryLiteral);
        System.out.println("third Step");
        local_alg(queryLiteral, currLocalHistory, localAnswer);
        System.out.println("4 Step");
        if (localAnswer.getMyBoolean()) {
          System.out.println("local true");
          System.out.println("  Answer: " + localAnswer.getMyBoolean());
          // incQueriesCache.rememberLiteral(queryLiteral, localAnswer, null);
          System.out.println("Result Answer: " + localAnswer.getMyBoolean());
          QI.sendResults(new QueryResponse(query, localAnswer, null, null), this.processID);
          return;
        }
      }
      System.out.println("reverse Step");

      queryLiteral.reverseSign();

      if (kb.isRuleInside("L", queryLiteral)) {

        System.out.println("inside1 Step");

        localAnswer = new MyBoolean(false);
        currLocalHistory.clear();
        currLocalHistory.add(queryLiteral);
        local_alg(queryLiteral, currLocalHistory, localAnswer);

        if (localAnswer.getMyBoolean()) {
          localAnswer.setMyBoolean(false);
          queryLiteral.reverseSign();
          System.out.println("inside2 Step");
          // incQueriesCache.rememberLiteral(queryLiteral, localAnswer, null);
          QI.sendResults(new QueryResponse(query, localAnswer, null, null), this.processID);
          return;
        }
      }

      // VERIFIED TILL HERE

      queryLiteral.reverseSign();

      System.out.println("reverse1 Step");

      ////////////////////////////////////////////////////////////////////////
      ////////////// distributed reasoning for supporting rules //////////////

      rulesCollection = (Collection) kb.getSupportingRulesByHeadLiteral(queryLiteral);
      rules = rulesCollection.iterator();

      System.out.println(
          "\n\n\tReasoning for support of literal: " + queryLiteral.getSignWithName());
      while (rules.hasNext()) {
        flag = false;
        supportingRules = new LinkedList();

        rule = (Rule) rules.next();
        body = rule.getBody();

        bequeathHistory = new LinkedList(inheritedHistory);

        while (body.hasNext()) {
          literal = (Literal) body.next();

          if (inheritedHistory.contains(literal.getSignWithName())) {
            flag = true;
            break;
          } else {
            uniteSets(bequeathHistory, inheritedHistory);
            bequeathHistory.add(literal.getSignWithName());

            suppForLiteral = new LinkedList();
            conflForLiteral = new LinkedList();
            System.out.println(
                "\tRequesting literal: "
                    + literal.getSignWithName()
                    + "  from: "
                    + literal.getLocation()
                    + "\n");

            boolean local = false;
            if (literal.getLocation().equals("local")
                || literal.getLocation().equals(this.QI.getName())) local = true;

            Query q;
            if (local) {
              q =
                  new Query(
                      this.QI.getName(),
                      this.processID,
                      false,
                      this.QI.getName(),
                      literal,
                      false,
                      suppForLiteral,
                      conflForLiteral,
                      bequeathHistory);
              QI.incomingQuery(q);
              // QI.sendQueryToPeer(q);//to test
            } else {
              q =
                  new Query(
                      this.QI.getName(),
                      this.processID,
                      false,
                      literal.getLocation(),
                      literal,
                      false,
                      suppForLiteral,
                      conflForLiteral,
                      bequeathHistory);
              QI.sendQueryToPeer(q);
            }

            queryResponse = this.dr.take();

            if (queryResponse.getReturnValue() == false) {
              flag = true;
              break;
            } else if (queryResponse.getReturnValue() == true
                && (kb.isLocalLiteralInside(literal) == false)) supportingRules.add(literal);
            else {
              supportingRules =
                  (LinkedList) uniteSets(supportingRules, queryResponse.getSupportingSet());
            }

            // outQueriesCache.rememberLiteral(literal, new
            // MyBoolean(queryResponse.getReturnValue()), supportingRules);
          }
        }

        if (flag == true) continue;
        else handleSupportingSet();
      }

      if (inheritedSupportingRules.size() == 0) {
        System.out.println("Sending results");
        // incQueriesCache.rememberLiteral(queryLiteral, new MyBoolean(false), null);
        this.QI.sendResults(
            new QueryResponse(query, new MyBoolean(false), null, null), this.processID);
        return;
      }

      /////////////////////////////////////////////////////////////////////////
      ////////////// distributed reasoning for conflicting rules //////////////

      rulesCollection = (Collection) kb.getConflictingRulesByHeadLiteral(queryLiteral);
      rules = rulesCollection.iterator();
      System.out.println(
          "\tReasoning for conflicts for literal: " + queryLiteral.getSignWithName());

      while (rules.hasNext()) {
        flag = false;
        supportingRules = new LinkedList();

        rule = (Rule) rules.next();
        body = rule.getBody();

        bequeathHistory = new LinkedList(inheritedHistory);

        while (body.hasNext()) {
          literal = (Literal) body.next();

          if (inheritedHistory.contains(literal.getSignWithName())) {
            flag = true;
            break;
          } else {
            uniteSets(bequeathHistory, inheritedHistory);
            bequeathHistory.add(literal.getSignWithName());

            //   findPeerMessage = adhoc.findPeer(literal.getLocation(), this.groupName);
            //   outcomingPeer = new Peer(literal.getLocation(), findPeerMessage.getIPAddress(),
            // findPeerMessage.getPort());

            suppForLiteral = new LinkedList();
            conflForLiteral = new LinkedList();
            System.out.println(
                "\tRequesting literal: "
                    + literal.getSignWithName()
                    + "  from: "
                    + literal.getLocation()
                    + "\n");

            Query q =
                new Query(
                    this.QI.getName(),
                    this.processID,
                    false,
                    literal.getLocation(),
                    literal,
                    false,
                    suppForLiteral,
                    conflForLiteral,
                    bequeathHistory);
            QI.sendQueryToPeer(q);
            queryResponse = this.dr.take();

            if (queryResponse.getReturnValue() == false) {
              flag = true;
              break;
            } else if (queryResponse.getReturnValue() == true
                && (kb.isLocalLiteralInside(literal) == false)) supportingRules.add(literal);
            else
              supportingRules =
                  (LinkedList) uniteSets(supportingRules, queryResponse.getSupportingSet());

            //  outQueriesCache.rememberLiteral(literal, new
            // MyBoolean(queryResponse.getReturnValue()), supportingRules);

          }
        }
        if (flag == true) continue;
        else handleConflictingSet();
      }

      endTime = (new Date()).getTime();

      System.out.println("\n   Time taken: " + (endTime - startTime));

      if (inheritedConflictingRules.size() == 0) {
        //   incQueriesCache.rememberLiteral(queryLiteral, new MyBoolean(true),
        // inheritedSupportingRules);

        this.QI.sendResults(
            new QueryResponse(query, new MyBoolean(true), inheritedSupportingRules, null),
            this.processID);
        return;
      }

      resolveConflicts();

      return;

    } catch (Throwable t) {
      t.printStackTrace();
      this.QI.notifyFailure(query, processID);
    }
  }